Vai al contenuto
PLC Forum


Prova Con Arduino E Triac


roberto8303

Messaggi consigliati

Mirko Ceronti

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 :smile: :thumb_yello:

Appunto.... :lol::lol::lol:

Dimmer%20mos-fetA_thumb.jpg

Link al commento
Condividi su altri siti


  • Risposte 50
  • Created
  • Ultima risposta

Top Posters In This Topic

  • roberto8303

    26

  • Livio Orsini

    9

  • dott.cicala

    7

  • gabri-z

    5

grazie mirco ho risolto cosi direttamente dalla 24volt del secondario

db74ed411b124ffe10083024dbabe6ef.jpg

ora non mi resta che fare il programmino speriamo bene...

Link al commento
Condividi su altri siti

no gabri è da 3,3kohm ho sbagliato a riportare il valore :( grazie per la segnalzione vabbe pubblico anche lo schizzo iniziale è molto disordinato :whistling: ma almeno i valori sono corretti...

20eed3de8bdb7402aa43dfb8de06d235.jpg

Modificato: da roberto8303
Link al commento
Condividi su altri siti

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 :wacko:

Modificato: da roberto8303
Link al commento
Condividi su altri siti

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

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

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 :angry::(

Link al commento
Condividi su altri siti

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

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

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

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 :P 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 :smile:



// 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

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 :P 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 :smile:


// 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

Buona sera a tutti !

Nel video adesso si nota la nettissima differenza della stabilita della luminosita della lampada :smile:

'sta volta grazie al ''soft'' :thumb_yello: ma senza ''hard'' , :smilie_nono::superlol: ! E' quello che volevi ottenere ?

Link al commento
Condividi su altri siti

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 :smile:

Link al commento
Condividi su altri siti

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

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

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...