Diagramma schematico di un generatore DDS su un microcontrollore Atmel. Generatore dds funzionale su plc. Test delle modalità operative del generatore dopo il montaggio

Diagramma schematico di un generatore DDS su un microcontrollore Atmel.  Generatore dds funzionale su plc.  Test delle modalità operative del generatore dopo il montaggio
Diagramma schematico di un generatore DDS su un microcontrollore Atmel. Generatore dds funzionale su plc. Test delle modalità operative del generatore dopo il montaggio

Frequenza massima - 65534 Hz ​​(e uscita HS fino a 8 MHz con onda quadra). E poi ho pensato che un generatore è un ottimo compito dove l'FPGA può mostrarsi al meglio. Per una questione sportiva, ho deciso di ripetere il progetto su FPGA, rispettando le scadenze entro due fine settimana, e ottenendo parametri non strettamente definiti, ma il massimo possibile. Puoi scoprire cosa ne è uscito sotto il taglio.

Giorno zero

Prima che arrivasse il fine settimana, ho avuto un po’ di tempo per pensare all’implementazione. Per semplificare il mio compito, ho deciso di realizzare il generatore non come un dispositivo separato con pulsanti e schermo LCD, ma come un dispositivo che si collega a un PC tramite USB. Per questo ho una scheda USB2RS232. La scheda non richiede driver (CDC), quindi penso che funzionerà sotto Linux (per alcuni questo è importante). Inoltre, non nascondo che ho già lavorato con la ricezione di messaggi tramite RS232. Prenderò moduli già pronti per lavorare con RS232 da opencores.com.

Per generare un segnale sinusoidale avrai bisogno di un DAC. Ho scelto il tipo DAC, come nel progetto originale: R2R a 8 bit. Ti permetterà di operare ad alte frequenze, dell'ordine dei megahertz. Sono convinto che l'FPGA dovrebbe far fronte a questo

Stavo pensando a come scrivere un programma per trasmettere dati tramite una porta COM. Da un lato, puoi scrivere in Delphi7; hai già esperienza nella scrittura di un programma del genere e inoltre la dimensione del file eseguibile non sarà grande. Ho anche provato a abbozzare qualcosa con cui lavorare con Serial sotto forma di script Java in una pagina html, ma più o meno funzionava solo tramite l'API seriale di Chrome, ma per questo è necessario installare un plugin... in generale , anche questo è fuori discussione. Ho provato PyQt5 come innovazione per me stesso, ma quando si distribuisce un progetto del genere è necessario trascinare un sacco di librerie. Dopo aver provato a compilare un progetto PyQt in un file exe, si è scoperto che era più di 10 MB. Cioè non sarà migliore di un'applicazione scritta in C++\Qt5. Vale anche la pena considerare che non ho esperienza nello sviluppo in Python, ma ho esperienza in Qt5. Pertanto la scelta è caduta su Qt5. Dalla quinta versione è apparso un modulo per lavorare con la seriale e ci ho già lavorato. E un'applicazione basata su Qt5 può essere trasferita su Linux e Mac (per alcuni questo è importante) e dalla versione 5.2 le applicazioni basate su QWidget possono anche essere trasferite su uno smartphone!

Cos'altro è necessario? Naturalmente la scheda è dotata di FPGA. Ne ho due (Cyclone iv EP4CE10E22C8N per 10mila celle e Cyclone ii EP2C5 per 5mila celle). Sceglierò quello a sinistra unicamente per il connettore più comodo. In termini di volume, il progetto non intende essere grande, quindi si adatterà a nessuno dei due. Non differiscono nella velocità di funzionamento. Entrambe le schede hanno a bordo oscillatori da 50 MHz e all'interno dell'FPGA è presente un PLL con il quale posso aumentare la frequenza ai 200 MHz previsti.

Il primo giorno

Dato che avevo già realizzato il modulo DDS nel mio progetto del sintetizzatore, ho subito preso il saldatore e ho iniziato a saldare il DAC con resistori. Ho preso una scheda prototipo. L'installazione è stata eseguita utilizzando il rivestimento. L'unico cambiamento che ha interessato la tecnologia è stato l'abbandono dell'acido F38N per la stagnatura dei supporti a favore del gel di flusso indicatore TT. L'essenza della tecnologia è semplice: saldo i rack in un circuito stampato e saldo i resistori su di essi dal lato del circuito stampato. Faccio i collegamenti mancanti ruotandoli. Inoltre, i rack sono comodi perché posso inserirli direttamente nella scheda FPGA.

Purtroppo a casa non c'erano resistenze da 1 e 2 kiloohm. Non c'era tempo per andare al negozio. Ho dovuto rinunciare ad una delle mie regole e rimuovere le resistenze dalla vecchia scheda non più necessaria. Lì sono stati utilizzati resistori da 15K e 30K. Il risultato è questo Frankenstein:


Dopo aver creato il progetto, è necessario impostare il dispositivo di destinazione: Menu Assegnazioni -> Dispositivo


Nel progetto, ho codificato il modulo DDS principale incontrollabile su una frequenza fissa.

Modulo generatore da 1000 Hz

modulo signal_generator(clk50M, signal_out); cavo di ingresso clk50M; uscita filo segnale_out; filo clk200M; osc osc_200M accumulatore reg; assegnare signal_out = accumulatore; //prova a generare 1000 Hz //50.000.000 Hz - frequenza di clock del generatore esterno //2^32 = 4.294.967.296 - profondità di bit DDS - 32 bit //dividi 1000Hz / 50.000.000 Hz / 2 * 4294967296 => 42949, 67296 sempre @ (posege clk50M) inizia l'accumulatore<= accumulator + 32"d42949; end endmodule


Successivamente, ho fatto clic su "Avvia compilazione" in modo che l'ambiente di sviluppo chiedesse quali linee di input/output abbiamo nel modulo principale del progetto e a quali PIN fisici sono collegate. Puoi connetterti a quasi chiunque assegnare le linee che compaiono ai PIN reali del chip FPGA:

Voce di menu Assegnazioni -> Pianificatore di pin

Per favore ignora le linee HS_OUT, key0 e key1 per ora, appariranno nel progetto più tardi, ma non ho avuto il tempo di fare uno screenshot all'inizio.

In linea di principio è sufficiente “registrare” solo PIN_nn nella colonna Location, ed i restanti parametri (I/O standard, Current Strench e Slew Rate) possono essere lasciati di default, oppure si possono selezionare gli stessi offerti da default (predefinito) in modo che non vi sia alcun avviso "ov.

Come posso sapere quale PIN corrisponde al numero del connettore presente sulla scheda?

I numeri dei pin del connettore sono contrassegnati sulla scheda


Inoltre, i pin dell'FPGA a cui sono collegati i contatti del connettore sono descritti nella documentazione fornita con la scheda FPGA.




Dopo aver assegnato i pin, ricompilo nuovamente il progetto e lo flasho utilizzando un programmatore USB. Se non hai installato i driver per il programmatore USB Byte blaster, comunica a Windows che si trovano nella cartella in cui hai installato Quartus. Poi lo troverà da sola.

Il programmatore deve essere collegato al connettore JTAG. E la voce di menu per la programmazione è "Strumenti -> Programmatore" (o fare clic sull'icona sulla barra degli strumenti). Il pulsante “Start”, il gioioso “Success” e il firmware sono già all'interno dell'FPGA e sono già funzionanti. Basta non spegnere l'FPGA, altrimenti dimenticherà tutto.

Strumenti -> Programmatore


Il DAC è collegato al connettore della scheda FPGA. Collego l'oscilloscopio S1-112A all'uscita del DAC. Il risultato dovrebbe essere una "sega" perché la parte alta della parola DDS dell'accumulatore di fase viene emessa sull'uscita a 8 bit. E aumenta sempre fino a traboccare.

Circa 1,5 ore e per una frequenza di 1000 Hz vedo il seguente oscillogramma:

Vorrei sottolineare che la “sega” presenta una piccola frattura al centro. Ciò è dovuto al fatto che i resistori hanno un intervallo di valori.

Un altro punto importante che deve essere chiarito è la massima frequenza possibile con cui funzionerà il generatore DDS. Con i parametri TimeQuest configurati correttamente, dopo la compilazione nel “Rapporto di compilazione” puoi vedere che la velocità del circuito è superiore a 200 MHz con un margine. Ciò significa che moltiplicherò la frequenza del generatore di 50 MHz per 4 utilizzando PLL aumenterò il valore dell'accumulatore di fase DDS con una frequenza di 200 MHz. L'intervallo di frequenza finale che può essere ottenuto nelle nostre condizioni è 0 - 100 MHz. Precisione dell'impostazione della frequenza:

200.000.000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Cioè, è migliore di ~0,05 Hz. Considero sufficiente la precisione di una frazione di hertz per un generatore con un tale intervallo di frequenze operative (0...100 MHz). Se qualcuno ha bisogno di aumentare la precisione, per fare ciò è possibile aumentare la profondità di bit DDS (ricordarsi di controllare il TimeQuest Timing Analyser che la velocità operativa del circuito logico fosse entro CLK = 200 MHz, perché questo è un sommatore), o semplicemente ridurre la frequenza del clock, se non è richiesta una gamma di frequenze così ampia.

Analizzatore di temporizzazione TimeQuest


Dopo aver visto “saw” sullo schermo, questioni familiari mi hanno costretto ad andare in campagna (era il mio giorno libero). Lì falciavo, cucinavo, grigliavo e non avevo idea della sorpresa che mi aspettava la sera. Più vicino alla notte, prima di andare a letto, ho deciso di osservare la forma del segnale per altre frequenze.

Per frequenza 100 kHz

Per frequenza 250 kHz

Per frequenza 500 kHz

Per la frequenza di 1 MHz

Secondo giorno

Dato che era interessante come avrebbe funzionato il DAC su resistori da 100 e 200 Ohm, ho subito preso il saldatore. Questa volta il DAC si è rivelato più preciso e l'installazione ha richiesto meno tempo.

Mettiamo il DAC sulla scheda FPGA e lo colleghiamo all'oscilloscopio

Controllo 1 MHz - VO! È una questione completamente diversa!

Ho visto 10 MHz

Ho visto 25 MHz


La forma della sega da 10 MHz è ancora simile a quella corretta. Ma a 25 MHz non è più “carino”. Tuttavia, il C1-112a ha una larghezza di banda di 10 MHz, quindi in questo caso il motivo potrebbe essere già nell'oscilloscopio.

In linea di principio, la questione con il DAC può essere considerata chiusa. Ora prendiamo le forme d'onda dell'uscita ad alta velocità. Per fare ciò, invieremo il bit più significativo a un PIN separato dell'FPGA. Prenderemo i dati per questa linea dal bit più significativo dell'accumulatore DDS.

Assegna hs_out = accumulatore;

Onda quadra 1 MHz

Onda quadra 5 MHz

Onda quadra 25 MHz

L'onda quadra da 50 MHz è ormai quasi invisibile


Ma penso che l'uscita FPGA dovrebbe essere carica di resistenza. Forse i fronti sarebbero stati più ripidi.

Il seno è fatto secondo la tabella. La dimensione della tabella è di 256 valori da 8 bit. Sarebbe stato possibile prenderne di più, ma avevo già un file mif già pronto. Utilizzando la procedura guidata, creiamo un elemento ROM con i dati della tabella seno dal file mif.

Creazione di una ROM - Strumenti -> Gestore plugin Mega Wizard


Selezionare 1 porta ROM e assegnare un nome al modulo

Siamo d'accordo

Anche qui siamo d'accordo

Usando Sfoglia, troviamo il nostro file mif con la tabella dei seni

Anche qui non cambiamo nulla.

Deseleziona il modulo sine_rom_bb.v: non è necessario. Prossimo traguardo. Quartus chiederà di aggiungere un modulo al progetto: siamo d'accordo. Successivamente, il modulo può essere utilizzato come qualsiasi altro modulo in Verilog.


Gli 8 bit superiori della parola dell'accumulatore DDS verranno utilizzati come indirizzo ROM e l'uscita dei dati sarà il valore seno.

Codice

//cavo sinusoidale sine_out; sine_rom seno1(.clock(clk200M), .address(accumulatore), .q(sine_out));


L'oscillogramma di un'onda sinusoidale a frequenze diverse sembra... lo stesso.

Se lo si desidera, è possibile considerare i problemi del DAC associati alla diffusione dei resistori:

Bene, questa è la fine del fine settimana. Ma il software per il controllo da PC non è stato ancora scritto. Sono costretto ad ammettere il fatto di non aver rispettato le scadenze previste.

Giorno tre

C'è pochissimo tempo, quindi scriviamo il programma in fretta (secondo le migliori tradizioni). In alcuni punti, per ridurre il numero di lettere e facilitare l'inserimento delle informazioni dalla tastiera, viene utilizzato un filtro eventi in base al nome del widget. Per favore, comprendi e perdona.

Interfaccia

Collegamenti con analoghi

Non un elenco completo
Generatore DDS funzionale. Creato sulla base di AVR. Frequenze 0...65534 Hz.
Recensione del generatore DDS GK101. Creato utilizzando Altera MAX240 FPGA. Frequenze fino a 10 MHz.
Generatore multifunzione su PIC16F870. Gamma di frequenza: 11 Hz - 60 kHz.
generatori Aggiungi tag

Frequenza massima - 65534 Hz ​​(e uscita HS fino a 8 MHz con onda quadra). E poi ho pensato che un generatore è un ottimo compito dove l'FPGA può mostrarsi al meglio. Per una questione sportiva, ho deciso di ripetere il progetto su FPGA, rispettando le scadenze entro due fine settimana, e ottenendo parametri non strettamente definiti, ma il massimo possibile. Puoi scoprire cosa ne è uscito sotto il taglio.

Giorno zero

Prima che arrivasse il fine settimana, ho avuto un po’ di tempo per pensare all’implementazione. Per semplificare il mio compito, ho deciso di realizzare il generatore non come un dispositivo separato con pulsanti e schermo LCD, ma come un dispositivo che si collega a un PC tramite USB. Per questo ho una scheda USB2RS232. La scheda non richiede driver (CDC), quindi penso che funzionerà sotto Linux (per alcuni questo è importante). Inoltre, non nascondo che ho già lavorato con la ricezione di messaggi tramite RS232. Prenderò moduli già pronti per lavorare con RS232 da opencores.com.

Per generare un segnale sinusoidale avrai bisogno di un DAC. Ho scelto il tipo DAC, come nel progetto originale: R2R a 8 bit. Ti permetterà di operare ad alte frequenze, dell'ordine dei megahertz. Sono convinto che l'FPGA dovrebbe far fronte a questo

Stavo pensando a come scrivere un programma per trasmettere dati tramite una porta COM. Da un lato, puoi scrivere in Delphi7; hai già esperienza nella scrittura di un programma del genere e inoltre la dimensione del file eseguibile non sarà grande. Ho anche provato a abbozzare qualcosa con cui lavorare con Serial sotto forma di script Java in una pagina html, ma più o meno funzionava solo tramite l'API seriale di Chrome, ma per questo è necessario installare un plugin... in generale , anche questo è fuori discussione. Ho provato PyQt5 come innovazione per me stesso, ma quando si distribuisce un progetto del genere è necessario trascinare un sacco di librerie. Dopo aver provato a compilare un progetto PyQt in un file exe, si è scoperto che era più di 10 MB. Cioè non sarà migliore di un'applicazione scritta in C++\Qt5. Vale anche la pena considerare che non ho esperienza nello sviluppo in Python, ma ho esperienza in Qt5. Pertanto la scelta è caduta su Qt5. Dalla quinta versione è apparso un modulo per lavorare con la seriale e ci ho già lavorato. E un'applicazione basata su Qt5 può essere trasferita su Linux e Mac (per alcuni questo è importante) e dalla versione 5.2 le applicazioni basate su QWidget possono anche essere trasferite su uno smartphone!

Cos'altro è necessario? Naturalmente la scheda è dotata di FPGA. Ne ho due (Cyclone iv EP4CE10E22C8N per 10mila celle e Cyclone ii EP2C5 per 5mila celle). Sceglierò quello a sinistra unicamente per il connettore più comodo. In termini di volume, il progetto non intende essere grande, quindi si adatterà a nessuno dei due. Non differiscono nella velocità di funzionamento. Entrambe le schede hanno a bordo oscillatori da 50 MHz e all'interno dell'FPGA è presente un PLL con il quale posso aumentare la frequenza ai 200 MHz previsti.

Il primo giorno

Dato che avevo già realizzato il modulo DDS nel mio progetto del sintetizzatore, ho subito preso il saldatore e ho iniziato a saldare il DAC con resistori. Ho preso una scheda prototipo. L'installazione è stata eseguita utilizzando . L'unico cambiamento che ha interessato la tecnologia è stato l'abbandono dell'acido F38N per la stagnatura dei supporti a favore del gel di flusso indicatore TT. L'essenza della tecnologia è semplice: saldo i rack in un circuito stampato e saldo i resistori su di essi dal lato del circuito stampato. Faccio i collegamenti mancanti ruotandoli. Inoltre, i rack sono comodi perché posso inserirli direttamente nella scheda FPGA.

Purtroppo a casa non c'erano resistenze da 1 e 2 kiloohm. Non c'era tempo per andare al negozio. Ho dovuto rinunciare ad una delle mie regole e rimuovere le resistenze dalla vecchia scheda non più necessaria. Lì sono stati utilizzati resistori da 15K e 30K. Il risultato è questo Frankenstein:


Dopo aver creato il progetto, è necessario impostare il dispositivo di destinazione: Menu Assegnazioni -> Dispositivo


Nel progetto, ho codificato il modulo DDS principale incontrollabile su una frequenza fissa.

Modulo generatore da 1000 Hz

modulo signal_generator(clk50M, signal_out); cavo di ingresso clk50M; uscita filo segnale_out; filo clk200M; osc osc_200M accumulatore reg; assegnare signal_out = accumulatore; //prova a generare 1000 Hz //50.000.000 Hz - frequenza di clock del generatore esterno //2^32 = 4.294.967.296 - profondità di bit DDS - 32 bit //dividi 1000Hz / 50.000.000 Hz / 2 * 4294967296 => 42949, 67296 sempre @ (posege clk50M) inizia l'accumulatore<= accumulator + 32"d42949; end endmodule


Successivamente, ho fatto clic su "Avvia compilazione" in modo che l'ambiente di sviluppo chiedesse quali linee di input/output abbiamo nel modulo principale del progetto e a quali PIN fisici sono collegate. Puoi connetterti a quasi chiunque assegnare le linee che compaiono ai PIN reali del chip FPGA:

Voce di menu Assegnazioni -> Pianificatore di pin

Per favore ignora le linee HS_OUT, key0 e key1 per ora, appariranno nel progetto più tardi, ma non ho avuto il tempo di fare uno screenshot all'inizio.

In linea di principio è sufficiente “registrare” solo PIN_nn nella colonna Location, ed i restanti parametri (I/O standard, Current Strench e Slew Rate) possono essere lasciati di default, oppure si possono selezionare gli stessi offerti da default (predefinito) in modo che non vi sia alcun avviso "ov.

Come posso sapere quale PIN corrisponde al numero del connettore presente sulla scheda?

I numeri dei pin del connettore sono contrassegnati sulla scheda


Inoltre, i pin dell'FPGA a cui sono collegati i contatti del connettore sono descritti nella documentazione fornita con la scheda FPGA.




Dopo aver assegnato i pin, ricompilo nuovamente il progetto e lo flasho utilizzando un programmatore USB. Se non hai installato i driver per il programmatore USB Byte blaster, comunica a Windows che si trovano nella cartella in cui hai installato Quartus. Poi lo troverà da sola.

Il programmatore deve essere collegato al connettore JTAG. E la voce di menu per la programmazione è "Strumenti -> Programmatore" (o fare clic sull'icona sulla barra degli strumenti). Il pulsante “Start”, il gioioso “Success” e il firmware sono già all'interno dell'FPGA e sono già funzionanti. Basta non spegnere l'FPGA, altrimenti dimenticherà tutto.

Strumenti -> Programmatore


Il DAC è collegato al connettore della scheda FPGA. Collego l'oscilloscopio S1-112A all'uscita del DAC. Il risultato dovrebbe essere una "sega" perché la parte alta della parola DDS dell'accumulatore di fase viene emessa sull'uscita a 8 bit. E aumenta sempre fino a traboccare.

Circa 1,5 ore e per una frequenza di 1000 Hz vedo il seguente oscillogramma:

Vorrei sottolineare che la “sega” presenta una piccola frattura al centro. Ciò è dovuto al fatto che i resistori hanno un intervallo di valori.

Un altro punto importante che deve essere chiarito è la massima frequenza possibile con cui funzionerà il generatore DDS. Con i parametri TimeQuest configurati correttamente, dopo la compilazione nel “Rapporto di compilazione” puoi vedere che la velocità del circuito è superiore a 200 MHz con un margine. Ciò significa che moltiplicherò la frequenza del generatore di 50 MHz per 4 utilizzando PLL aumenterò il valore dell'accumulatore di fase DDS con una frequenza di 200 MHz. L'intervallo di frequenza finale che può essere ottenuto nelle nostre condizioni è 0 - 100 MHz. Precisione dell'impostazione della frequenza:

200.000.000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Cioè, è migliore di ~0,05 Hz. Considero sufficiente la precisione di una frazione di hertz per un generatore con un tale intervallo di frequenze operative (0...100 MHz). Se qualcuno ha bisogno di aumentare la precisione, per fare ciò è possibile aumentare la profondità di bit DDS (ricordarsi di controllare il TimeQuest Timing Analyser che la velocità operativa del circuito logico fosse entro CLK = 200 MHz, perché questo è un sommatore), o semplicemente ridurre la frequenza del clock, se non è richiesta una gamma di frequenze così ampia.

Analizzatore di temporizzazione TimeQuest


Dopo aver visto “saw” sullo schermo, questioni familiari mi hanno costretto ad andare in campagna (era il mio giorno libero). Lì falciavo, cucinavo, grigliavo e non avevo idea della sorpresa che mi aspettava la sera. Più vicino alla notte, prima di andare a letto, ho deciso di osservare la forma del segnale per altre frequenze.

Per frequenza 100 kHz

Per frequenza 250 kHz

Per frequenza 500 kHz

Per la frequenza di 1 MHz

Secondo giorno

Dato che era interessante come avrebbe funzionato il DAC su resistori da 100 e 200 Ohm, ho subito preso il saldatore. Questa volta il DAC si è rivelato più preciso e l'installazione ha richiesto meno tempo.

Mettiamo il DAC sulla scheda FPGA e lo colleghiamo all'oscilloscopio

Controllo 1 MHz - VO! È una questione completamente diversa!

Ho visto 10 MHz

Ho visto 25 MHz


La forma della sega da 10 MHz è ancora simile a quella corretta. Ma a 25 MHz non è più “carino”. Tuttavia, il C1-112a ha una larghezza di banda di 10 MHz, quindi in questo caso il motivo potrebbe essere già nell'oscilloscopio.

In linea di principio, la questione con il DAC può essere considerata chiusa. Ora prendiamo le forme d'onda dell'uscita ad alta velocità. Per fare ciò, invieremo il bit più significativo a un PIN separato dell'FPGA. Prenderemo i dati per questa linea dal bit più significativo dell'accumulatore DDS.

Assegna hs_out = accumulatore;

Onda quadra 1 MHz

Onda quadra 5 MHz

Onda quadra 25 MHz

L'onda quadra da 50 MHz è ormai quasi invisibile


Ma penso che l'uscita FPGA dovrebbe essere carica di resistenza. Forse i fronti sarebbero stati più ripidi.

Il seno è fatto secondo la tabella. La dimensione della tabella è di 256 valori da 8 bit. Sarebbe stato possibile prenderne di più, ma avevo già un file mif già pronto. Utilizzando la procedura guidata, creiamo un elemento ROM con i dati della tabella seno dal file mif.

Creazione di una ROM - Strumenti -> Gestore plugin Mega Wizard


Selezionare 1 porta ROM e assegnare un nome al modulo

Siamo d'accordo

Anche qui siamo d'accordo

Usando Sfoglia, troviamo il nostro file mif con la tabella dei seni

Anche qui non cambiamo nulla.

Deseleziona il modulo sine_rom_bb.v: non è necessario. Prossimo traguardo. Quartus chiederà di aggiungere un modulo al progetto: siamo d'accordo. Successivamente, il modulo può essere utilizzato come qualsiasi altro modulo in Verilog.


Gli 8 bit superiori della parola dell'accumulatore DDS verranno utilizzati come indirizzo ROM e l'uscita dei dati sarà il valore seno.

Codice

//cavo sinusoidale sine_out; sine_rom seno1(.clock(clk200M), .address(accumulatore), .q(sine_out));


L'oscillogramma di un'onda sinusoidale a frequenze diverse sembra... lo stesso.

Se lo si desidera, è possibile considerare i problemi del DAC associati alla diffusione dei resistori:

Bene, questa è la fine del fine settimana. Ma il software per il controllo da PC non è stato ancora scritto. Sono costretto ad ammettere il fatto di non aver rispettato le scadenze previste.

Giorno tre

C'è pochissimo tempo, quindi scriviamo il programma in fretta (secondo le migliori tradizioni). In alcuni punti, per ridurre il numero di lettere e facilitare l'inserimento delle informazioni dalla tastiera, viene utilizzato un filtro eventi in base al nome del widget. Per favore, comprendi e perdona.

Interfaccia

Collegamenti con analoghi

Non un elenco completo
Generatore DDS funzionale. Creato sulla base di AVR. Frequenze 0...65534 Hz.
Recensione del generatore DDS GK101. Creato utilizzando Altera MAX240 FPGA. Frequenze fino a 10 MHz.
Generatore multifunzione su PIC16F870. Gamma di frequenza: 11 Hz - 60 kHz.
generatori
  • Qt5
  • Aggiungere etichette

    Qualsiasi officina domestica dovrebbe disporre del set necessario di strumenti e strumenti di misurazione. Per le persone che praticano la radioamatore come hobby, gli elevati costi monetari per l'acquisto dell'attrezzatura necessaria sono spesso inaccettabili.

    Quindi nel mio caso l'elenco di questa attrezzatura era lungi dall'essere completo e mancava generatore di segnale.

    Generatore di segnale Si è rivelato facile realizzarsi con gli elementi radio disponibili e alla fine non è costoso. Quindi, dopo aver frugato su Internet, ho trovato un gran numero di circuiti per vari generatori, compresi modelli più avanzati con DAC, ma già costosi da produrre. Per cominciare, mi sono fermato a un semplice Generatore di segnali DDS sul microcontrollore ATMEGA8 di Atmel. Con questo non ho migliorato né cambiato nulla: ho lasciato tutto così com'è, ho solo creato una copia e, inoltre, non rivendico la paternità di questo dispositivo.

    COSÌ, generatore di segnale ha buone caratteristiche ed è adatto a risolvere problemi semplici.

    Visualizzazione delle informazioni in generatore di segnale prodotto su un display LCD da 16x2 caratteri con un controller HD44780. È interessante notare che per risparmiare porte sul microcontrollore, il display LCD è controllato tramite soli tre fili; ciò è stato ottenuto utilizzando un registro a scorrimento: leggi come collegare un display tramite tre fili;

    È necessario salvare le porte, 8 porte vengono utilizzate per un DAC resistivo, 7 porte per i pulsanti. Nell'articolo originale, l'autore aveva promesso di utilizzare la modulazione PWM, ma a quanto pare non l'ha portata a termine, poiché ha iniziato a sviluppare una versione più avanzata su ATMEGA16.

    Diagramma schematico di un generatore di segnale DDS e circuito stampato.

    Il circuito e le schede sono mostrate nell'originale; contengono anche pulsanti per il controllo PWM non utilizzati dall'autore.

    Per il DAC ho acquistato appositamente resistori di precisione con un errore di ±0,05%, ma alla fine sono sufficienti quelli semplici con un errore di ±5%. La forma del segnale era abbastanza accettabile per tutti i tipi di segnali.

    Quando Generatore assemblato e il programma caricato nel microcontrollore, non sono necessarie impostazioni, a meno che non si regoli il contrasto del display.

    Lavorare con il dispositivo è semplice: seleziona la forma del segnale, imposta la frequenza richiesta e puoi modificare il passo di impostazione della frequenza con limiti di 1 - 10 - 100 - 1000 Hz per passo. Quindi fare clic su Start e il generatore inizia a funzionare. Va notato che quando si avvia il generatore, la frequenza e la forma del segnale non possono essere modificate, ciò è dovuto al fatto che il programma entra in un ciclo infinito e per aumentare la frequenza massima di generazione, la procedura di polling del pulsante doveva essere rimosso. Per interrompere la generazione, fare clic su stop/reset, questo riavvia il programma e ritorna al menu delle impostazioni. Ecco la sfumatura.

    Separatamente, vorrei parlare della realizzazione di un alloggiamento per il generatore. Puoi acquistare una custodia già pronta in un negozio o utilizzarne una adatta da qualche altro dispositivo, ma ho deciso di realizzarla interamente da solo. Un pezzo di fibra di vetro a doppia faccia giaceva inattivo, che ho donato al corpo.

    Per prima cosa è necessario prendere tutte le misure, le dimensioni del display LCD e della scheda del generatore di segnale, dell'alimentatore, dei connettori e dei pulsanti, quindi posizionarlo su un foglio di carta così come sarà all'interno del case. In base alle dimensioni ottenute, puoi iniziare la produzione.

    Questo progetto è un generatore di funzioni universale e di alta qualità che, nonostante una certa complessità del circuito, almeno rispetto a quelli più semplici, ha funzionalità molto ampie, che giustificano il costo del suo assemblaggio. È in grado di produrre 9 diverse forme d'onda e funziona anche con la sincronizzazione degli impulsi.

    Diagramma schematico del generatore sul MK

    Impostazioni del dispositivo

    • Gamma di frequenza: 10 Hz - 60 kHz
    • Regolazione digitale della frequenza in 3 diversi passaggi
    • Forme d'onda: sinusoidale, triangolare, quadra, sega, impulso H, impulso L, burst, spazzata, rumore
    • Intervallo di uscita: 15 V per seno e triangolo, 0-5 V per altre modalità
    • È presente un'uscita per la sincronizzazione degli impulsi

    Il dispositivo è alimentato da 12 volt CA, che fornisce una tensione CC sufficientemente elevata (oltre 18 V) necessaria per il normale funzionamento di 78L15 e 79L15, che formano un circuito bipolare da 15 V. Ciò viene fatto in modo che il microcircuito LF353 possa emettere gamma completa di segnali al carico 1 kOhm.

    Regolatore di livello utilizzato ALPS SRBM1L0800. Il circuito dovrebbe utilizzare resistori con tolleranza ±1% o migliore. Limitatori di corrente LED - Resistori serie 4306R. La luminosità può essere aumentata a seconda delle preferenze dell'esecutore. Il generatore è assemblato in un case plastico 178x154x36 mm con pannelli anteriore e posteriore in alluminio.

    Molti componenti di contatto sono montati sui pannelli anteriore e posteriore (pulsanti, manopole, connettori RCA, gruppi LED, connettore di alimentazione). I circuiti stampati sono fissati all'alloggiamento mediante bulloni con distanziatori in plastica. Tutti gli altri elementi del generatore sono montati su circuiti stampati: l'alimentazione è separata. Il pulsante sinistro al centro serve per cambiare la modalità, quello destro per selezionare la frequenza della modalità.

    Il generatore produce vari segnali e funziona in tre modalità, che vengono selezionate tramite il tasto "Select" e indicate dai tre LED superiori (nello schema). La manopola modifica i parametri del segnale secondo la seguente tabella:

    Immediatamente dopo l'impostazione in modalità 1, avviene la generazione del seno. Tuttavia la frequenza iniziale è piuttosto bassa e per aumentarla è necessario almeno un clic dell'encoder. La scheda dispone di un contatto per il collegamento del dispositivo per la programmazione, che consente di modificare rapidamente la funzionalità del generatore di segnale, se necessario. Si trovano tutti i file di progetto: firmware PIC16F870 e disegni della scheda

    Questo generatore di funzioni DDS (versione 2.0) di segnali è assemblato su un microcontrollore AVR, ha una buona funzionalità, ha il controllo dell'ampiezza ed è anche assemblato su un circuito stampato a lato singolo.

    Questo generatore si basa sull'algoritmo del generatore Jesper DDS, il programma è stato modernizzato per AVR-GCC C con inserti di codice assembly. Il generatore ha due segnali in uscita: il primo sono segnali DDS, il secondo è un'uscita “rettangolare” ad alta velocità (1..8 MHz), che può essere utilizzata per ravvivare il MK con fuzz errati e per altri scopi.
    Il segnale HS (High Speed) ad alta velocità viene prelevato direttamente dal microcontrollore Atmega16 OC1A (PD5).
    I segnali DDS vengono generati da altre uscite MC attraverso una matrice resistiva R2R e attraverso il chip LM358N, che consente la regolazione dell'ampiezza e dell'offset del segnale. Offset e ampiezza vengono regolati utilizzando due potenziometri. L'offset può essere regolato nell'intervallo +5V..-5V e l'ampiezza è 0...10V. La frequenza dei segnali DDS può essere regolata nell'intervallo 0...65534 Hz, questo è più che sufficiente per testare circuiti audio e altri compiti radioamatoriali.

    Caratteristiche principali del generatore DDS V2.0:
    - un circuito semplice con radioelementi comuni ed economici;
    - circuito stampato monofaccia;
    - alimentatore integrato;
    - uscita separata ad alta velocità (HS) fino a 8 MHz;
    - Segnali DDS con ampiezza e offset variabili;
    - Segnali DDS: seno, rettangolo, sega e sega rovescia, triangolo, segnale ECG e segnale di rumore;
    -Schermo LCD 2×16;
    - tastiera intuitiva a 5 pulsanti;
    - passi per la regolazione della frequenza: 1, 10, 100, 1000, 10000 Hz;
    - ricordare l'ultimo stato dopo l'accensione.

    Lo schema a blocchi seguente mostra la struttura logica di un generatore di funzioni:

    Come puoi vedere, il dispositivo richiede diverse tensioni di alimentazione: +5V, -12V, +12V. Le tensioni +12V e -12V vengono utilizzate per regolare l'ampiezza e l'offset del segnale. L'alimentatore è progettato utilizzando un trasformatore e diversi chip stabilizzatori di tensione:

    L'alimentatore è assemblato su una scheda separata:

    Se non vuoi assemblare tu stesso l'alimentatore, puoi utilizzare un normale alimentatore ATX da un computer, dove sono già presenti tutte le tensioni necessarie. Disposizione dei connettori ATX.

    Schermo a cristalli liquidi

    Tutte le azioni vengono visualizzate tramite uno schermo LCD. Il generatore è controllato da cinque tasti

    I tasti su/giù vengono utilizzati per spostarsi nel menu, i tasti sinistra/destra vengono utilizzati per modificare il valore della frequenza. Quando si preme il tasto centrale, il segnale selezionato inizia a essere generato. Premendo nuovamente il tasto si arresta il generatore.

    Viene fornito un valore separato per impostare il passo di modifica della frequenza. Ciò è utile se è necessario modificare la frequenza su un ampio intervallo.

    Il generatore di rumore non ha alcuna impostazione. Utilizza la solita funzione rand(), che viene continuamente inviata all'output del generatore DDS.

    L'uscita ad alta velocità HS ha 4 modalità di frequenza: 1, 2, 4 e 8 MHz.

    Diagramma schematico

    Il circuito del generatore di funzioni è semplice e contiene elementi facilmente accessibili:
    - Microcontrollore AVR Atmega16, con quarzo esterno a 16 MHz;
    - schermo LCD standard tipo HD44780 2×16;
    - Matrice DAC R2R composta da resistori ordinari;
    - amplificatore operazionale LM358N (analogo domestico di KR1040UD1);
    - due potenziometri;
    - cinque chiavi;
    - diversi connettori.

    Paga:

    Il generatore funzionale è assemblato in una scatola di plastica:


    Software

    Come ho detto sopra, ho basato il mio programma sull'algoritmo del generatore DDS Jesper. Ho aggiunto alcune righe di codice assembly per implementare l'arresto della generazione. Ora l'algoritmo contiene 10 cicli CPU invece di 9.

    void statico inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)(
    asm volatile("eor r18, r18 ;r18<-0″ "\n\t"
    "eo r19, r19 ;r19<-0″ "\n\t"
    "1:" "\n\t"
    "aggiungi r18, %0 ;1 ciclo" "\n\t"
    "adc r19, %1 ;1 ciclo" "\n\t"
    "adc %A3, %2 ;1 ciclo" "\n\t"
    "lpm ;3 cicli" "\n\t"
    "out %4, __tmp_reg__ ;1 ciclo" "\n\t"
    "sbis %5, 2 ;1 ciclo se non salta" "\n\t"
    "rjmp 1b ;2 cicli. Totale 10 cicli" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),,"e" (segnale),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR ))
    :"r18", "r19"
    );}

    La tabella delle forme dei segnali DDS si trova nella memoria flash del MK, il cui indirizzo inizia con 0xXX00. Queste sezioni sono definite nel makefile, nelle apposite locazioni di memoria:
    #Definire le sezioni in cui memorizzare le tabelle dei segnali
    LDFLAGS += -Wl,-section-start=.MySection1=0x3A00
    LDFLAGS += -Wl,-section-start=.MySection2=0x3B00
    LDFLAGS += -Wl,-section-start=.MySection3=0x3C00
    LDFLAGS += -Wl,-section-start=.MySection4=0x3D00
    LDFLAGS += -Wl,-section-start=.MySection5=0x3E00
    LDFLAGS += -Wl,-section-start=.MySection6=0x3F00