Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Domanda da 1000€ su analogRead()

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[11] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto UtenteSandroCalligaro » 13 gen 2018, 16:46

PietroBaima ha scritto:Non è una buona idea fare moltiplicazioni in un service di interrupt.
:shock:
Perché?
La maggior parte del codice che ho scritto per microcontrollori fa parecchie moltiplicazioni, ma calcola anche seni e coseni entro lo stesso interrupt, chiamato ogni 100 us...
Chiaramente, dipende dalla potenza di calcolo del micro che si sta usando, e bisogna assicurarsi di non sforare il tempo a disposizione.

Non so con l interfaccia arduinica come si fa ma sull' atmega una volta impostato il prescaler dell' ADC si può impostare il free running mode in cui fa continue letture e generata un interrupt a fine si ogni singola lettura. Per l RMS dentro la routine di interrupt si può semplicemente fare la moltiplicazione e l accumulo poi il resto lo gestisce il main

Le letture andrebbero fatte a cadenza regolare, per rendere semplici i calcoli.
Il calcolo dell'RMS prevede la media dei quadrati. Solo nel caso in cui il campionamento sia regolare, può essere approssimato con una somma di campioni, divisi poi per il numero di campioni a periodo della fondamentale.
Poi, anche solo per conoscere il numero di campioni per periodo della fondamentale, occorre sapere con precisione ogni quanto si campiona.

Calcolare la media del segnale con campionamento non uniforme vorrebbe dire pesare di volta in volta il campione per un coefficiente diverso (il tempo intercorso tra due campioni).
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

0
voti

[12] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto UtenteSandroCalligaro » 13 gen 2018, 16:49

Aggiungo che sarebbe meglio ci spiegassi cosa devi fare con il valore RMS che calcoli.
Parli di triac, ma non è chiaro lo scopo vero e proprio.
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

1
voti

[13] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto UtentePietroBaima » 13 gen 2018, 16:55

Il motivo è che cerco sempre di ottimizzare il codice che scrivo, più che posso, perché cerco sempre di estrarre il massimo dalla macchina che uso.

Fare moltiplicazioni in un service di int è un modo ottimo per strozzare il microcontrollore.
Quando un micro esegue un interrupt non deve fare altro che acquisire ingressi, scrivere uscite o aggiornare memoria, il resto lo può fare con calma dopo o prima.
Generatore codice per articoli:
nomi
Sul forum:
[pigreco]=π
[ohm]=Ω
[quadrato]=²
[cubo]=³
Avatar utente
Foto UtentePietroBaima
90,7k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 12207
Iscritto il: 12 ago 2012, 1:20
Località: Londra

0
voti

[14] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto UtenteSandroCalligaro » 13 gen 2018, 17:10

PietroBaima ha scritto:Quando un micro esegue un interrupt non deve fare altro che acquisire ingressi, scrivere uscite o aggiornare memoria, il resto lo può fare con calma dopo o prima.

Nelle applicazioni strettamente real-time (specie nel controllo) non si può fare con calma, purtroppo.

In questo caso non ho capito se la misura serve per effettuare un controllo o solo per monitorare le grandezze, e quanto è critico il suo aggiornamento.
Se è sufficiente un aggiornamento per periodo della fondamentale, concordo sul fatto che sia meglio riempire un buffer con i dati, per poi processarli entro la fine del periodo della fondamentale (quindi con molto più tempo a disposizione).

Se si sceglie un periodo di campionamento tale che il numero di campioni a periodo della fondamentale sia pari ad una potenza di 2, la divisione per il calcolo della media diventa un semplice shift, o addirittura uno spostamento della virgola (cioè solo un modo diverso di interpretare lo stesso numero).
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

0
voti

[15] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto UtentePietroBaima » 13 gen 2018, 17:12

Sì, certamente ci sono numerose eccezioni a quello che ho detto.
In questa applicazione non mi sembra però il caso di scomodare operazioni dentro le routine di interrupt.
Generatore codice per articoli:
nomi
Sul forum:
[pigreco]=π
[ohm]=Ω
[quadrato]=²
[cubo]=³
Avatar utente
Foto UtentePietroBaima
90,7k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 12207
Iscritto il: 12 ago 2012, 1:20
Località: Londra

0
voti

[16] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto UtenteIlGuru » 15 gen 2018, 12:28

PietroBaima ha scritto:Quando un micro esegue un interrupt non deve fare altro che acquisire ingressi, scrivere uscite o aggiornare memoria, il resto lo può fare con calma dopo o prima.


Può scriversi in una pila che cosa deve fare dopo e farlo con calma uscito dall' ISR
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32

0
voti

[17] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto UtentePietroBaima » 15 gen 2018, 12:30

Sì, in genere questo è il modo giusto e professionale di fare. :ok:
Generatore codice per articoli:
nomi
Sul forum:
[pigreco]=π
[ohm]=Ω
[quadrato]=²
[cubo]=³
Avatar utente
Foto UtentePietroBaima
90,7k 7 12 13
G.Master EY
G.Master EY
 
Messaggi: 12207
Iscritto il: 12 ago 2012, 1:20
Località: Londra

0
voti

[18] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto Utentefrancicoma » 16 gen 2018, 22:37

Il post è resuscitato a distanza di Giorni! Ottimo!
atmega328 deve leggere 3tensioni e 3 correnti di rete (Vac 50Hz) ovviamente prelevati con appositi TA/TV che vanno a sovraporre il rispettivo proprio segnale a 2.5Vcc
e comandare 3Triac per modulare 3 potenze sempre da 230Vac
nell'interrupt gli faccio calcolare la tensione media (per determinare con precisione i 2.5Vcc,come se fosse un filtro passa basso)
sommare il quadrato della tensione per il RMS
incrementare il contatore delle misure
cambiare la porta dell'ADC per efettuare la corrente/tensione sucessiva
solo per la tensione mi ricavo anche il tempo di quando la sinusoide è passata per lo 0 per gestire il triac con il loop principale
Avatar utente
Foto Utentefrancicoma
60 1 6
Frequentatore
Frequentatore
 
Messaggi: 151
Iscritto il: 5 lug 2013, 1:23

1
voti

[19] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto Utentedadduni » 17 gen 2018, 16:57

A occhio e croce non credo che un atMega riesca a fare tutte queste cose in tempi accettabili! Forse anche fare la lettura dello zero può essere difficile, sarebbe più facile è veloce usare un comparatore esterno che commuti nel passaggio per lo zero e così hai un'onda quadra che può generare un interrupt veloce.
Avresti una regolazione precisa dello 0 è un main più snello
Avatar utente
Foto Utentedadduni
2.073 2 7 12
Expert EY
Expert EY
 
Messaggi: 1370
Iscritto il: 23 mag 2014, 16:26

0
voti

[20] Re: Domanda da 1000€ su analogRead()

Messaggioda Foto UtenteSandroCalligaro » 17 gen 2018, 17:19

dadduni ha scritto:A occhio e croce non credo che un atMega riesca a fare tutte queste cose in tempi accettabili! Forse anche fare la lettura dello zero può essere difficile, sarebbe più facile è veloce usare un comparatore esterno che commuti nel passaggio per lo zero e così hai un'onda quadra che può generare un interrupt veloce.
Avresti una regolazione precisa dello 0 è un main più snello
Non sarei così pessimista, se il periodo di campionamento è di 1 ms, forse si può anche fare...

Ripensandoci, se i vari calcoli vanno fatti per ogni ciclo della fondamentale a 50 Hz, quindi senza tralasciare nessun dato, fare i calcoli per l'accumulo fuori dall'interrupt credo che non faccia guadagnare molto, anzi (dipende poi da quanto "costa" accedere alla memoria, e se ci sono istruzioni particolari da sfruttare per somme multiple o per i quadrati).
Per guadagnare tempo veramente ci vorrebbe un DMA.
Avatar utente
Foto UtenteSandroCalligaro
2.970 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1181
Iscritto il: 6 ago 2015, 19:25

Precedente

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti