In tal caso è molto meglio l'approccio di Piccio, altrimenti l'alimentatore viene stressato orrendamente e trasmetti come Radio Vaticana.
Il sistema migliore, dopo quello di dalai lamah, direi sarebbe di fare 4 schede da 24 canali e metterci a bordo un Xmega64A1.
Il software diventa banale, hai il TWI (l'acronimo IIC o I2C è copywrittato Philips) già implementato in hardware e campi tranquillo, con addirittura
16 bit di risoluzione.
Didn't find your answer? Ask the community — no account required.
L
lowcost
Rusty ha scritto:
ok, da questo si evince che il pwm deve arrivare al driver senza alcun filtro, quindi la mia soluzione analogica e' abortita.
saluti
lowcost
F
F. Bertolazzi
lowcost:
Tsk. Voi analogicari siete fuori moda. ;-)
Mi son comprato il libro di elettrotecnica che mi ha suggerito Englishman così, la prossima volta che rimango disoccupato, so cosa fare e a chi chiedere (privatamente, non preoccupatevi) lumi.
F
F. Bertolazzi
Ah, ecco dov'era! Era rimasto in canna per qualche problema di connessione (leggasi: telefonata di qualche donna o altro rompimaroni). Lo mando senza manco rileggerlo, così, per puro giornalismo.
Piccio:
Non se prepari tutti i dati prima. In pratica fai l'operazione che dicevo nel post precedente e scrivi il risultato in RAM. Ti bastano n byte per port, con n=risoluzione PWM. All'inizio del ciclo seguente butti il primo byte sul port, a metà ciclo il secondo byte, a tre quarti il terzo, a 7/8 il quarto, insomma scrivi e dimezzi il registro di compare del timer. Per gli ultimi bit vai di NOP.
La linearità, per quanto visto sopra, è garantita a meno di uno o due cicli di clock (ovvero se interrompi operazioni da 1,2 o 3 cicli).
Il problema è la balenghitudine della forma d'onda.
Fico!
In alternativa si potrebbe giocare sui due registri di compare, ed usare addirittura il timer a 16 bit come tale. Il lavorone grosso è fare il bubble sort dei contatori. Una volta ordinati (chiaramente senza spostare i dati, basta lavorare con dei puntatori da 0 a 32 che identificano il canale relativo, col MSb che indica se il contatore successivo ha lo stesso valore), si inizia il ciclo successivo azzerando tutte le uscite. Si carica in un registro di compare il valore del contatore più basso e in un registro General Purpose il puntatore del canale a cui corrisponde. All'interrupt si mette a 1 il bit identificato dal puntatore (e anche il successivo e quello ancora dopo, finché troviamo gli MSb dei contatori a uno) e si carica nell'altro registro di compare il secondo contatore più basso ed il suo puntatore nel registro GP.
P
Pasu
Vabbè, questa suona tanto come la mia idea, a parte il dettaglio implementativo che io ho lasciato come esercizio per il lettore :-p
P.
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.