Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

problema PWM timer 0

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: problema PWM timer 0

Messaggioda Foto Utentedaniele1996 » 12 ago 2021, 19:58

sto usando il compilatore standard che si installa dal terminale di linux (o winavr se compilo da windows).
Ma OCR0A non è il registro di cambio di livello logico del pin?
Un'altra domanda,
se ad esempio il micro sta lavorando con il main e ad un certo punto si genera un interrupt che altera i valori del main presenti tipo nel zero flag è possibile che il risultato di una possibile operazione successiva nel main cambii risultato?
in tal caso si potrebbe operare solo con gli indirizzi di memoria...
xyz ha scritto:ogni nome di un registro del timer ha il numero del timer a cui si riferisce.

esatto
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

0
voti

[12] Re: problema PWM timer 0

Messaggioda Foto Utentelelerelele » 13 ago 2021, 12:04

daniele1996 ha scritto:il taglio di fase va nella ventola interna... sinceramente se nello stampato c'è un triac più tosto che un relè un motivo ci sarà...
Le ventole, che io sappia, sono solitamente senza spazzole, regolare con parzializzazione un motore del genere non è mai una soluzione felice, se non se ne può però fare a meno...... diciamo che va.

L'uso del triac, al posto del relè, può essere una scelta funzionale, non usato per ottenere controllo di fase.

Saluti.
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[13] Re: problema PWM timer 0

Messaggioda Foto UtenteEcoTan » 13 ago 2021, 14:01

daniele1996 ha scritto: un interrupt che altera i valori del main presenti tipo nel zero flag è possibile che il risultato di una possibile operazione successiva nel main cambii risultato?

Se dichiari la variabile prima del main, viene considerata common cioè leggibile e sovrascrivibile sia dal main che dalle ISR.
Altrimenti la variabile è accessibile soltanto dal main o dalla ISR dove è stata dichiarata.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5422
Iscritto il: 29 gen 2014, 8:54

0
voti

[14] Re: problema PWM timer 0

Messaggioda Foto Utentedaniele1996 » 13 ago 2021, 16:47

lelerelele ha scritto:Le ventole, che io sappia, sono solitamente senza spazzole, regolare con parzializzazione un motore del genere non è mai una soluzione felice, se non se ne può però fare a meno...... diciamo che va.

L'uso del triac, al posto del relè, può essere una scelta funzionale, non usato per ottenere controllo di fase.

Saluti.

si, sono senza spazzole, ma sono anche chiuse che non li puoi aprire... per quanto riguarda il fotoaccoppiatore,esattamente nella prima pagina del datasheet
è indicato
Incandescent Lamp Dimmers

quindi non ha il circuito zero crossing...
che io noti i climatizzatori nuovi (parlo di anche una decina di anni fa) ci sono volte che la ventola va piano e volte che va veloce... Anche se potenzialmente questo circuito potrebbe risalire all'inizio degli anni 2000 però ha questo fototriac si può benissimo pensare che il taglio di fase lo può fare... alla fin fine il motore è sempre quello...
Quello che un po potrebbe dare da perderci qualche pomerigio è il condensatore di avviamento del motore che ogni (circa) 10 anni va cambiato... però in questo ci viene in aiuto il sensore HALL con il magnete dell'asse...
in pratica basta contare i giri attivando a 1 costante l'uscita del fotoaccoppiatore, il sensore genera un interrupt e con un timer riazzera il valore incrementato... in questo modo, con un "telecomando" dentro una scatola da incasso con un display si può visualizzare il numero dei giri del motore e capire se è il caso di fare manutenzione o no...

EcoTan ha scritto:Se dichiari la variabile prima del main, viene considerata common cioè leggibile e sovrascrivibile sia dal main che dalle ISR.
Altrimenti la variabile è accessibile soltanto dal main o dalla ISR dove è stata dichiarata.


Preferisco l'allocazione statica della memoria, alla fin fine l'interazione con essa la decido io che scrivo il programma. In pratica che l' evento ci possa accedere o meno alla locazione di memoria, lui lavora con le sue in cui può accederci sempre e in qualunque momento.

però il SREG dove c'è tipo il zero flag lo posso salvare e ripristinare... e ogni interrupt ha il suo posto nella memoria dove memorizzare il SREG, in questo modo si potrebbero eseguire interrupt su interrupt senza alterare i risultati... certo non si devono eseguire operazioni atomiche tipo la scrittura sull'eeprom, ma quello lo faccio fare al telecomando semmai... il controller di questo circuito non deve sbagliare su queste piccole cose...
Codice: Seleziona tutto
ISR(INT1_vect){
   //50Hz
   old_sreg_sync_int = SREG;

   if(should_start)start_fan();

   SREG = old_sreg_sync_int;
}

ho avuto qualche problema con i codici scritti su più file...
infatti dichiaro tutte le macro variabili nel main.h che lo includo in tutti i sorgenti...
tipo
Codice: Seleziona tutto
#define should_start                *((char *)(RAM_START_ADDRESS + 0))

questi alla fin fine il compilatore li sostituisce con dei semplici valori numerici...
e variabili di queste se ne possono usare 2048 (che comunque sono tante).
Ultimamente però non capisco il perché gli uint8_t non me li riconosce... e premendo shift e cliccando eclipse mi fa vedere come sono dichiarate ed era dichiarata come intero... tanto che sono passato a sostituirlo con il char...
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

1
voti

[15] Re: problema PWM timer 0

Messaggioda Foto Utentexyz » 13 ago 2021, 17:35

daniele1996 ha scritto:sto usando il compilatore standard che si installa dal terminale di linux ...

Quello che chiami in modo improprio e superficiale «compilatore standard» ha un nome ben preciso GCC.

...micro sta lavorando con il main e ad un certo punto si genera un interrupt che altera i valori del main presenti tipo nel zero flag è possibile che il risultato di una possibile operazione successiva nel main cambii risultato?


Qui serve una sola risposta, impara prima di programmare un micro-controllare il linguaggio di programmazione e i termini corretti da usare nelle domande.
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[16] Re: problema PWM timer 0

Messaggioda Foto Utentedaniele1996 » 13 ago 2021, 17:47

in cosa mi sono espresso male?
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

0
voti

[17] Re: problema PWM timer 0

Messaggioda Foto Utentexyz » 13 ago 2021, 17:56

daniele1996 ha scritto:... micro sta lavorando con il main ...

E' una frase che non si può sentire (e non è l'unica).
Avatar utente
Foto Utentexyz
6.864 2 4 6
G.Master EY
G.Master EY
 
Messaggi: 1778
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[18] Re: problema PWM timer 0

Messaggioda Foto Utentedaniele1996 » 13 ago 2021, 18:03

sto indicando i punti di analisi, non credo sia errato...
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

0
voti

[19] Re: problema PWM timer 0

Messaggioda Foto Utentelelerelele » 14 ago 2021, 14:57

Cioè,
tu stai eseguendo il main, che gira a ciclo chiuso, (è normale), poi all'evento dell'interrupt vai a modificare delle variabili che sono gia presenti ed usate nel main, ed ovvio che queste variano.

quale è il tuo problema.
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[20] Re: problema PWM timer 0

Messaggioda Foto Utentedaniele1996 » 15 ago 2021, 1:36

Intanto buon ferragosto... :D
lelerelele ha scritto:Cioè,
tu stai eseguendo il main, che gira a ciclo chiuso, (è normale), poi all'evento dell'interrupt vai a modificare delle variabili che sono gia presenti ed usate nel main, ed ovvio che queste variano.

Mi riferisco principalmente ai registri del processore e i flag di controllo (tipo il zero flag che dice se l'ultima operazione ha restituito zero... però questo sta nel SREG e lo posso salvare e ripristinare), il mio intento è di scrivere del codice che non si blocchi e che non dia problemi di funzionamento, quindi rifletto un po su un qualunque possibile problema per cercare di risolverlo. In pratica vorrei capire quali sono le istruzioni che negli interrupt non posso fare...
Comunque ritornando al taglio di fase, ho impostato il timer e probabilmente il programma funziona, così ho deciso di collegare il motore e fare una prova per vedere cosa succede... in pratica il motore funziona male e arrivato oltre la metà della sinusoide va al massimo dei giri, quindi riflettendoci un po ho fatto una prova accendendolo per tutto il ciclo della sinusoide ma per meno cicli al secondo, e questo ha funzionato, quindi gestisco la sua velocità direttamente dall'interrupt, in questa maniera:
Codice: Seleziona tutto
ISR(INT1_vect){
   //50Hz
   old_sreg_sync_int = SREG;

   //if(should_start)start_fan();
   cycle_count= cycle_count + 1;
   if(cycle_count >= 100){
      cycle_count = 0;
   }
   if(cycle_count > fan_mode || fan_mode == 0){
      PORTB &= ~(1 << PB2);
   }else{
      PORTB |= (1 << PB2);
   }

   SREG = old_sreg_sync_int;
}

e lo imposto così:
Codice: Seleziona tutto
void set_fan(char val){ // 0 - 10 (max)
   if( val > 10)return;
   fan_mode = val * 10;
}

Però visto che ormai il codice del taglio di fase l'ho scritto, sono curioso di vedere con l'oscilloscopio che mi arriverà se realmente funziona... (magari mi tornerà utile in futuro)
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 16 ospiti