PWM con RTC problemi

Salve a tutti,

sto lavorando ad un piccolo progetto con lo scopo di pilotare 2 strisce a led di due colori diversi con timer ed effetto fade.

PREMESSA:

il tutto è alimentato a 12v e fornisco la 5v attraverso il 7805

sto utilizzando il ds1307 per fornire l’orario tramite i2c e i pin 9 e 10 per pilotare le due strisce.

un display 16*2 visualizza data e ora attuale.

al pin 9 e 10 sono collegati due circuiti gemelli cosi fatti:

dal pin tramite resistenza da 470 ohm (provata anche 1 k) alla base del 1° bc547, il collettore tramite resistore da 1,2k alla 12v e emettitore a gnd.

dal collettore del 1°547 vado direttamente alla base del secondo 547, anchesso collegato alla 12 v dal collettore tramite un resistore da 1.2k e emettitore a gnd.

dal collettore di quest’ultimo vado al gate dell’irf 540 con source a massa e tra 12v e drain collego la stiscia led che richiede circa 2.2A a 12v

dal punto di vista software la parte incriminata e questa:

void LedDriver1 ()                                                                        /////LED DRIVER 1
{
  timeld1on=((oraaggld1on*60)+minaggld1on); 
  timeld1off=((oraaggld1off*60)+minaggld1off);


if ((timenow>=(timeld1on+minaggld1fadein)) && (timenow<=(timeld1off-minaggld1fadeout))) {brightnesspwm1=255;}

else if ((timenow>=timeld1on) && (timenow<(timeld1on+minaggld1fadein))) {brightnesspwm1=bfi1;bfi1=(((timenow-timeld1on)*(255/minaggld1fadein)));}

else if ((timenow>(timeld1off-minaggld1fadeout)) && (timenow <timeld1off)) {brightnesspwm1=bfo1;bfo1=(((timeld1off-timenow)*(255/minaggld1fadeout)));}

else {brightnesspwm1=0;}

analogWrite (pwm1, brightnesspwm1);
}

timeld1on e off è l’ora di accensione e spegnimento in minuti.
timenow è l’orario corrente preso dall’rtc espresso in minuti

minaggld1fadein e out sono i minuti dopo l’accensione e prima dello spegnimento per il fade

IL PROBLEMA:

il problema sta all’atto dell’ancensione, in pratica dal momento in cui passa da spento (stringa else)ad acceso (primo else if) il 328 va in blocco o nel migliore dei casi fa un semi autoreset e continua a funzionare, il resto del tempo esegue la funzione perfettamente, nessun problema invece negli altri passaggi, cioè dal primo else if all’ if dall’ if al secondo else if e in fine all’else.

il fatto strano che il problema si presenta con carichi pesanti, a vuoto o con una lampadina da 5W non fa una piega.
fatto strano 2, che se elimino la formula

bfi1=(((timenow-timeld1on)*(255/minaggld1fadein)));

e la sostituisco con , esempio,

bfi1=127;

funziona perfettamente!

ho controllato l’hardware e ho provato diverse configurazioni ma non cambia il problema, anche lo schetch di esempio FADE funziona perfettamente,

naturalmente i “canali” sono due ma sono esattamente l’uno la fotocopia dell’altro compreso i problemi, da tener conto che esiste un altro void LedDriver2() eseguito nello stesso momento a seguire.

datemi una mano! e da 3 settimane che ci sbatto la testa!!,

grazie!!!

Intanto potevi leggere il regolamento e, come da regolamento, presentarti nell'apposita sezione. POi, se avessi letto il regolamento, avresti visto che il codice si racchiude negli appositi tag.

Tornando al tuo problema, è sabato mattina e non sono lucido per capire solo quel pezzo senza vedere il resto. Ma mi viene da pensare che se solo a pieno carico ti si presenta il problema allora una possibilità molto concreta è che l'alimentazione del circuito sia inadeguata, dato che un PWM a 127 corrisponde all'incirca ad un duty cycle del 50%, per cui diciamo sommariamente un consumo pari alla metà. Con la tua formula, è probabile che quando arriva a 255 (un PWM di 255 in realtà viene sostituito da un digitalWrite con stato HIGH) accendi al massimo il carico, quindi consumi il massimo della corrente. Se il micro si resetta solo a pieno carico, io credo ad un problema di alimentazione. Hai controllato con un amperometro? I BC547 reggono fino a 100 mA, sei sicuro di starci dentro? Quanto ti consumano le strisce?

ciao mi scuso per non avermi presentato prima, avevo già provato ad inserire con la funzione code ma non è andato a buon fine, riproverò spero positivamente!

ritornando al problema, le strisce led assorbono a 12v 2,2A e fruiscono nel'irf540(dissipati singolarmente), i bc547 servono solo ad adattare il segnale dai livelli TTL ai 0-10V richiesti dall'irf540.

l'alimentatore eroga 7A max e oltretutto il problema si presenta quando il duty cycle passa dal valore 0 a valore 254.

ho provato a variare la frequenza pwm sia con divisore 8 di default, sia con divisore 1.

dalle prove fatte sembra che il problema sia nella formula che esegue il calcolo a variare di timenow.....

Se puoi postarlo, lo schema del circuito aiuterebbe moltissimo a capire.
Poi questa cosa non è chiara:

oltretutto il problema si presenta quando il duty cycle passa dal valore 0 a valore 254.

Che significa? Che qualunque valore di PWM compreso in quell’intervallo ti fa saltare tutto? Quindi, passando da 0 a, diciamo 100, salta ogni cosa?

Il codice completo si può vedere?
Hai anche provato a fare del debug via seriale stampando i valori delle variabili e cercando di capire quali valori vengono calcolati?