Mirko Ceronti Inserita: 8 giugno 2015 Segnala Share Inserita: 8 giugno 2015 Inoltre, lascia perdere il fatto che questo è un dimmer fatto con un mos-fet, quindi col principio del sincronismo capovolto, ma il circuito per catturare l'andamento fedele della sinusoide che vedi evidenziato in giallo è il più efficace in assoluto che ho mai realizzato realizzato Vai sugli schemi di Mirko e scegli un modo per sincronizzarTi Appunto.... Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 8 giugno 2015 Autore Segnala Share Inserita: 8 giugno 2015 grazie mirco ho risolto cosi direttamente dalla 24volt del secondario ora non mi resta che fare il programmino speriamo bene... Link al commento Condividi su altri siti More sharing options...
gabri-z Inserita: 8 giugno 2015 Segnala Share Inserita: 8 giugno 2015 (modificato) La resistenza serie al LED del 4N35 è davvero da 330kOhm ? Modificato: 8 giugno 2015 da gabri-z Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 8 giugno 2015 Autore Segnala Share Inserita: 8 giugno 2015 (modificato) no gabri è da 3,3kohm ho sbagliato a riportare il valore grazie per la segnalzione vabbe pubblico anche lo schizzo iniziale è molto disordinato ma almeno i valori sono corretti... Modificato: 8 giugno 2015 da roberto8303 Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 8 giugno 2015 Autore Segnala Share Inserita: 8 giugno 2015 (modificato) ora però passiamo alla parte piu difficile per me quella del programma arduino... Cerco di spiegare come voglio procedere Quello che devo fare è: rilevare lo zero aspettare X tempo per accendere con un impulso il gate. Dare un impulso di tot microsecondi al gate penso almeno 15 o 20 microsencodi di durata. L impulso va giu dopo quindi 20us il triac resta in conduzione perche la corrente non =0, ed fino a quando non passa di nuovo per lo zero. Quindi, piu tardi dallo zero semionda parto ad innescare il gate e piu la lampada riceve meno tensione illuminandosi di meno. Ora viene il bello... i calcoli A 50hz passo per lo zero 50volte al secondo e quindi impiego 10ms per coprire un semionda Ora devo sapere quanti impulsi corrispondono sul contatore di arduino per definire il ritardo in microsecondi Quindi se uso un prescaler di 256 ho un contatore di 16us 65536...siccome a me serve definire il massimo spegnimento della lampada cioe con il massimo ritardo dallo zero pari ad una semionda di 10ms o meglio 9ms non tutta propio...sono 9ms/16us --->9000us/16us=562 count massimo di ritardo del temporizzatore è giusto? ed il minimo dovrebbe essere diciamo 0ms quindi nessun ritardo contatore 0? se è cosi ora resta il fatto di scrivere il programma Modificato: 8 giugno 2015 da roberto8303 Link al commento Condividi su altri siti More sharing options...
gabri-z Inserita: 8 giugno 2015 Segnala Share Inserita: 8 giugno 2015 e quindi impiego 10ms per coprire mezza semionda UNA semionda Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 8 giugno 2015 Autore Segnala Share Inserita: 8 giugno 2015 ahaha grazie gabri li becchi tutti Link al commento Condividi su altri siti More sharing options...
dott.cicala Inserita: 8 giugno 2015 Segnala Share Inserita: 8 giugno 2015 Ma caspita.....cosa dice il favoloso tek? Ce l'hai davanti la sinusoide.....Quante volte passa per lo zero in 1s? Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 8 giugno 2015 Autore Segnala Share Inserita: 8 giugno 2015 Aspetta prima che mi incarto con i conti ogni count vale 16us quindi 100 count del timer sono 1600us cioe 1.6microsecondi e da qui che devo partire. Dott cicala piano piano facciamo lavorare anche il tek comunque lo zero passa 100volte al secondo uno ogni semionda Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 9 giugno 2015 Segnala Share Inserita: 9 giugno 2015 Se si considera la semionda si deve considerare il semiperiodo che, per 50Hz, è giustamente 10 ms. Con clock a 16µs devi caricare il timer con 64973 per evere un interrupt ogni 9ms; questo se usi il timer 1 che è un 16 bits. In pratica 62.5 counts ogni 1µs. Io, però, ti consiglierei di usare un prescaler più basso e far contare un clock più veloce al timer. La precisione e la risoluzione sono migliori, mentre il tempo di CPU è invariato. Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 9 giugno 2015 Autore Segnala Share Inserita: 9 giugno 2015 perche devo caricare il timer con 64973? io vorrei fare cosi. Ho l interrupt quando scatta l evento sul rising dello zero crossing sul pin 2 arduino. Da qui uso il timer di arduino il timer1 settato a 16 bit 65536. Uso il comparatore OCRA1 per definire il ritardo con cui accendere il gate. Cosi inoltre posso anche definire il tempo di durata di impulso sul gate facendo semplicemente la differenza di 65536-1 oppure-2 dove ogni unita sono la durata di 16microsecondi. Sto studiando la funzione ISR ma ho pochissimo tempo da dedicarci Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 9 giugno 2015 Segnala Share Inserita: 9 giugno 2015 perche devo caricare il timer con 64973? Perchè così la CPU è libera di lavorare su altri programmi. Quando scatta l'inrerrpt legato al timer 1 alzi l'uscita di comando dal gate, carichi il tmer a 62410 equivalenti a 50 µs e sul prossimo interrupt del timer1 abbassi l'uscita del gate.. Disabiliti l'interrpt del timer1 sino al prossimo interrutpts esterno. Sto studiando la funzione ISR E' semplicissima devi solo mettere nel parametro a quale interrupt si riferisce. Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 9 giugno 2015 Autore Segnala Share Inserita: 9 giugno 2015 Livio ma la funzione TIMSK1 che serve per abilitare e disabilitare il timer interrupt come lo si gestisce? alcuni esempi sul sito arduino lo portano con TIMSK1=0*01 oppure TIMSK1=0.03 qual è la differenza? Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 10 giugno 2015 Segnala Share Inserita: 10 giugno 2015 TIMSK1 = 1 ===> abilito l'interrupt su overflow (quello che interessa per fare il timer programambile) TIMSK1 = 2 ===> abilito interrupt so compoaratore A TIMSK1 = 3 ===> abilito i due precedenti interrupt TIMSK1 = = ===> interrupts disabilitati Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 10 giugno 2015 Autore Segnala Share Inserita: 10 giugno 2015 Grazie Livio il programma l ho fatto, ho usato TIMSK1 = 0x03. Allora prima di postare il codice... ed qualche video per far vedere il mio favoloso e modesto tekronix Voglio un tuo parere Livio sul prescaler che ho deciso di utilizzare. Il timer uno è 16mhz con il prescaler a 256 ho 16000000/256=62500hz T=1/f =1/62500=16microsecondi ogni 1 count . per ottenere quindi, 9mila microsencodi cioe 9ms di ritardo massimo occorrono 520 count di valore di confronto OCR1A rispetto al timer1. Se avessi utilizzato un prescaler minore quindi da 64 rifacendo tutti i conti viene fuori 16000000/64=250000hz T=1/f=1/2500000=4miicrosencodi. Per ottenere 9mila microsecondi occorrono 9000/4=2250count. Nel mio caso quindi poco cambia, in quanto non mi occorre una risoluzione molto stretta e quindi un ampio range di count. Mi è sufficiente lavorare da qualche count fino a circa 500count quindi con prescaler 256. Nel programma ho due tasti uno che aumenta la luminosita e l altro diminuisce il circuito è a 24v ac per la lampadina. Nel video adesso si nota la nettissima differenza della stabilita della luminosita della lampada // conteggio timer arduino 16mhz diviso prescaler 256 //=16 microsecondidi conteggio, mezza onda sinusoidale 50hz // è uguale a 10ms cioe 10000microsecondi // quindi per 10000microsec/16= ci sono 625 conteggi boolean inputzero=2; //impulso di zero int count; #define GATE 9 void setup(){ Serial.begin(9600); pinMode(4,INPUT); pinMode(7,INPUT); pinMode(inputzero, INPUT); //impulso di zero digitalWrite(inputzero, HIGH); // pull-up resistore interno pinMode(GATE, OUTPUT); //triac gate control // Timer1 TIMSK1 = (0x03); TCCR1A = 0x00; TCCR1B = 0x00; // interrupt sul pin cambio stato basso alto pin2 attachInterrupt(0,passaggiozero, RISING); } //Interrupt ogni passaggio sullo zero void passaggiozero(){ TCCR1B=0x04; //timer con prescaler 256=0x04 TCNT1 = 0; //timer parte da zero } ISR(TIMER1_COMPA_vect){ // si verifica quando il tempo del timer corrisponde con quello in OCRA1 digitalWrite(GATE,1); //ALTO TCNT1 = 65536-2; //count=16microsecondi durata on GATE } ISR(TIMER1_OVF_vect){ // quando il timer1 va in overflow digitalWrite(GATE,0); //BASSO TCCR1B= 0x00; //azzero il timer1 } void loop(){ //con prescaler 256 ogni 1 count=0,016microsecondi //spenta 20 e accesa 563 circa 9000microsec di ritardo// Serial.println(count); if(count==0){ //limiti per count count=563;} if(count>=563){ count=563;} if(count<=20){ count=20;} //limiti per count if((count<=563) &&(count>=0)){ if(digitalRead(7)==1){ count++; delay(12);} else{count=count;} if(digitalRead(4)==1){ count--; delay(12);} else{count=count;}} OCR1A = count; } Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 10 giugno 2015 Autore Segnala Share Inserita: 10 giugno 2015 Link al commento Condividi su altri siti More sharing options...
dott.cicala Inserita: 10 giugno 2015 Segnala Share Inserita: 10 giugno 2015 Ohhhh....adesso sì che va bene! Peccato che il tubo poi aggiunga altro quando il video è finito. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 11 giugno 2015 Segnala Share Inserita: 11 giugno 2015 Io vedo solo un messaggio vuoto. Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 11 giugno 2015 Autore Segnala Share Inserita: 11 giugno 2015 Grazie Livio il programma l ho fatto, ho usato TIMSK1 = 0x03. Allora prima di postare il codice... ed qualche video per far vedere il mio favoloso e modesto tekronix Voglio un tuo parere Livio sul prescaler che ho deciso di utilizzare. Il timer uno è 16mhz con il prescaler a 256 ho 16000000/256=62500hz T=1/f =1/62500=16microsecondi ogni 1 count . per ottenere quindi, 9mila microsencodi cioe 9ms di ritardo massimo occorrono 520 count di valore di confronto OCR1A rispetto al timer1. Se avessi utilizzato un prescaler minore quindi da 64 rifacendo tutti i conti viene fuori 16000000/64=250000hz T=1/f=1/2500000=4miicrosencodi. Per ottenere 9mila microsecondi occorrono 9000/4=2250count. Nel mio caso quindi poco cambia, in quanto non mi occorre una risoluzione molto stretta e quindi un ampio range di count. Mi è sufficiente lavorare da qualche count fino a circa 500count quindi con prescaler 256. Nel programma ho due tasti uno che aumenta la luminosita e l altro diminuisce il circuito è a 24v ac per la lampadina. Nel video adesso si nota la nettissima differenza della stabilita della luminosita della lampada // conteggio timer arduino 16mhz diviso prescaler 256 //=16 microsecondidi conteggio, mezza onda sinusoidale 50hz // è uguale a 10ms cioe 10000microsecondi // quindi per 10000microsec/16= ci sono 625 conteggi boolean inputzero=2; //impulso di zero int count; #define GATE 9 void setup(){ Serial.begin(9600); pinMode(4,INPUT); pinMode(7,INPUT); pinMode(inputzero, INPUT); //impulso di zero digitalWrite(inputzero, HIGH); // pull-up resistore interno pinMode(GATE, OUTPUT); //triac gate control // Timer1 TIMSK1 = (0x03); TCCR1A = 0x00; TCCR1B = 0x00; // interrupt sul pin cambio stato basso alto pin2 attachInterrupt(0,passaggiozero, RISING); } //Interrupt ogni passaggio sullo zero void passaggiozero(){ TCCR1B=0x04; //timer con prescaler 256=0x04 TCNT1 = 0; //timer parte da zero } ISR(TIMER1_COMPA_vect){ // si verifica quando il tempo del timer corrisponde con quello in OCRA1 digitalWrite(GATE,1); //ALTO TCNT1 = 65536-2; //count=16microsecondi durata on GATE } ISR(TIMER1_OVF_vect){ // quando il timer1 va in overflow digitalWrite(GATE,0); //BASSO TCCR1B= 0x00; //azzero il timer1 } void loop(){ //con prescaler 256 ogni 1 count=0,016microsecondi //spenta 20 e accesa 563 circa 9000microsec di ritardo// Serial.println(count); if(count==0){ //limiti per count count=563;} if(count>=563){ count=563;} if(count<=20){ count=20;} //limiti per count if((count<=563) &&(count>=0)){ if(digitalRead(7)==1){ count++; delay(12);} else{count=count;} if(digitalRead(4)==1){ count--; delay(12);} else{count=count;}} OCR1A = count; } Link al commento Condividi su altri siti More sharing options...
gabri-z Inserita: 11 giugno 2015 Segnala Share Inserita: 11 giugno 2015 Buona sera a tutti ! Nel video adesso si nota la nettissima differenza della stabilita della luminosita della lampada 'sta volta grazie al ''soft'' ma senza ''hard'' , ! E' quello che volevi ottenere ? Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 11 giugno 2015 Autore Segnala Share Inserita: 11 giugno 2015 'sta volta grazie al ''soft'' ma senza ''hard'' , ! E' quello che volevi ottenere ? non ho capito...nulla... Link al commento Condividi su altri siti More sharing options...
gabri-z Inserita: 11 giugno 2015 Segnala Share Inserita: 11 giugno 2015 Capisco che noti una maggiore stabilità della luminosità ; io la considero dovuta ad una più accurata programmazione , cioè , soft(ware) Questa è la metà del....nulla Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 11 giugno 2015 Autore Segnala Share Inserita: 11 giugno 2015 Ah e senza hard che vuol dire?? Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 12 giugno 2015 Segnala Share Inserita: 12 giugno 2015 Probabilmente gabri intendeva dire che il medesimo offetto lo ottieni con 4 componenti hw: un potenziometro un paio di resitori ed un condensatore. Però credo che il tuo scopo non fosse solo quello di variare la luminosità di una lampada ma impratichirti di certe tecniche. Link al commento Condividi su altri siti More sharing options...
roberto8303 Inserita: 12 giugno 2015 Autore Segnala Share Inserita: 12 giugno 2015 Si è proprio cosi avrei potuto utilizzare direttamente un phototriac con zero detector ma quello che mi interessava di piu visto di aver aperto la discussione sulla sezione arduino è proprio il suo utilizzo con i timer ed interrupt. Un esempio pratico funzionante vale molto di piu di una teoria generalizzata. Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
Crea un account o accedi per commentare
Devi essere un utente per poter lasciare un commento
Crea un account
Registrati per un nuovo account nella nostra comunità. è facile!
Registra un nuovo accountAccedi
Hai già un account? Accedi qui.
Accedi ora