Dunque, il DDS in questione è un AD9851 per cui sto disegnando un circuito per avere da 0 a 50 MHz.
Potrei usare una shedina con un STM32L4 ma con il pinout vengono troppe vias per i miei gusti, mentre con l'ATmega che è nel cassetto a fare la muffa da qualche anno ho più libertà con il pinout, ecco perché lo uso..
Dunque La formula del primo messaggio è quella della sezione THEORY OF OPERATION AND APPLICATION risolta per la frequency tuning word (FTW) a pag. 12:
con = 180 MHz si ha il famoso valore di .
Il datasheet dice che è in MHz, ma facendo due calcoli con l'esempio di pag. 14 i conti non tornano. Secondo questo esempio, la FTW è:
FTW = 0x0e38e38e = 238609294 da cui = 10e6 (Hz) e non 10 (MHz), quindi nella formula è unsigned int.
Avete ragione sul fatto di fare uno shift a sinistra, ieri la mia zucca vuota non ci aveva pensato...
Farò comunque le prove a virgola mobile, cosi per investigare un po'.. È sempre interessate vedere cosa capita..
Intanto ringrazio tutti per la partecipazione e consigli !
AVR 8 bit: unsigned integer e FPU SW emulation
Moderatore: Paolino
48 messaggi
• Pagina 2 di 5 • 1, 2, 3, 4, 5
0
voti
fairyvilje ha scritto:boiler ha scritto:Non ho dimestichezza con l'architettura AVR8, ma probabilmente non fa differenza dividere per 100 o per una potenza di 2.
Credo di si. La potenza di 2 si riduce ad uno shift register, mentre la divisione arbitraria va implementata via software dal momento che l'ATmega328P non ha FPU, supporto per le divisioni, e nemmeno un supporto nativo per la codifica BCD. Almeno a quanto ricordo.
Hai ragione, speravo nella presenza della divisione intera come istruzione singola (dopo tutto ce l'ha anche il vetustissimo 8051), ma non è così.
Allora sì, conviene usare 64 al denominatore.
Boiler
0
voti
23,86 in binario viene 10111,110111.........
Prima di fare la moltiplicazione possiamo spostare questa virgola binaria e tralasciare i digit che rimangono alla sua destra.
Per decidere di quanto spostarla, secondo me bisogna prendere il massimo valore prevedibile di fout quindi spostarla il più possibile verso destra prima che il risultato della moltiplicazione sia tale da andare in overflow.
Questo risultato andrà poi shiftato a destra tanto quanto avevamo spostato la virgola. Ci ho preso?
EDIT Il problema di questo procedimento è che la moltiplicazione andrebbe fatta su 64 bit altrimenti vi è perdita di precisione.
Prima di fare la moltiplicazione possiamo spostare questa virgola binaria e tralasciare i digit che rimangono alla sua destra.
Per decidere di quanto spostarla, secondo me bisogna prendere il massimo valore prevedibile di fout quindi spostarla il più possibile verso destra prima che il risultato della moltiplicazione sia tale da andare in overflow.
Questo risultato andrà poi shiftato a destra tanto quanto avevamo spostato la virgola. Ci ho preso?
EDIT Il problema di questo procedimento è che la moltiplicazione andrebbe fatta su 64 bit altrimenti vi è perdita di precisione.
L'esistenza non è un accessorio
0
voti
1
voti
gvee ha scritto:Ciao a tutti,
Avrei bisogno di implementare una operazione con floating point in un ATmega328P, concretamente una moltiplicazione tra uint32_t e float:
Io ho utilizzato diverse volte gli AVR a 8 bit e con il GCC per AVR ha la simulazione software dei floating-point a 32 bit e quel calcolo non ha nessun problema ad essere eseguito in C e C++. Se lo vuoi calcolare velocemente puoi usare il fixed-point.
0
voti
gvee ha scritto:Potrei usare una shedina con un STM32L4 ma con il pinout vengono troppe vias per i miei gusti,
Non è chiaro se vuoi usare l'interfaccia parallela o seriale del DDS, se non hai problemi di velocità di comando potresti usare l'interfaccia seriale, te la cavi con 4 fili
0
voti
Seriale, ma ho predisposto un LCD ed una tastiera matriciale, più 2 canali ADC per monitorizzare offset ed ampiezza dello stadio di amplificazione.
Comunque sono 3 linee.
Grazie xyz per la conferma.
Comunque sono 3 linee.
Grazie xyz per la conferma.
48 messaggi
• Pagina 2 di 5 • 1, 2, 3, 4, 5
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 12 ospiti