Schematiskt diagram av en dds-generator på en atmel-mikrokontroller. Funktionell dds-generator på plc. Test av generatordriftslägen efter montering

Schematiskt diagram av en dds-generator på en atmel-mikrokontroller.  Funktionell dds-generator på plc.  Test av generatordriftslägen efter montering
Schematiskt diagram av en dds-generator på en atmel-mikrokontroller. Funktionell dds-generator på plc. Test av generatordriftslägen efter montering

Maximal frekvens - 65534 Hz ​​(och upp till 8 MHz HS-utgång med fyrkantsvåg). Och så tänkte jag att en generator är en utmärkt uppgift där FPGA:n kan visa sig som bäst. Som en sportfråga bestämde jag mig för att upprepa projektet på FPGA, samtidigt som jag höll deadlines inom två helger och fick parametrarna inte strikt definierade, utan maximalt möjliga. Du kan ta reda på vad som kom ut av detta under snittet.

Dag noll

Innan helgen kom hade jag lite tid att tänka på genomförandet. För att förenkla min uppgift bestämde jag mig för att göra generatorn inte som en separat enhet med knappar och en LCD-skärm, utan som en enhet som ansluts till en PC via USB. Till detta har jag ett USB2RS232-kort. Kortet kräver inga drivrutiner (CDC), därför tror jag att det kommer att fungera under Linux (för vissa är detta viktigt). Jag ska heller inte dölja att jag redan har jobbat med att ta emot meddelanden via RS232. Jag kommer att ta färdiga moduler för att arbeta med RS232 från opencores.com.

För att generera en sinusvågssignal behöver du en DAC. Jag valde DAC-typen, som i originalprojektet - R2R 8-bitars. Det gör att du kan arbeta vid höga frekvenser, i storleksordningen megahertz. Jag är övertygad om att FPGA borde klara av detta

Jag funderade på hur man skriver ett program för att överföra data via en COM-port. Å ena sidan kan du skriva i Delphi7 du har redan erfarenhet av att skriva ett sådant program, och dessutom kommer storleken på den körbara filen inte att vara stor. Jag försökte också skissa på något att fungera med Serial i form av ett java-script i en html-sida, men det fungerade mer eller mindre bara genom Chromes seriella API, men för detta måste du installera ett plugin... generellt , det är inte heller aktuellt. Jag försökte PyQt5 som en innovation för mig själv, men när du distribuerar ett sådant projekt måste du dra ett gäng bibliotek. Efter att ha försökt kompilera ett PyQt-projekt till en exe-fil, visade det sig vara mer än 10 MB. Det vill säga, det blir inte bättre än en applikation skriven i C++\Qt5. Det är också värt att tänka på att jag inte har erfarenhet av att utveckla i python, men jag har erfarenhet av Qt5. Därför föll valet på Qt5. Sedan den femte versionen dök det upp en modul för att arbeta med seriell och jag har redan arbetat med den. Och en applikation baserad på Qt5 kan överföras till Linux och Mac (för vissa är detta viktigt), och från version 5.2 kan applikationer baserade på QWidgets till och med överföras till en smartphone!

Vad mer behövs? Naturligtvis har kortet en FPGA. Jag har två av dem (Cyclone iv EP4CE10E22C8N för 10 tusen celler och Cyclone ii EP2C5 för 5 tusen celler). Jag väljer den till vänster enbart på grund av den bekvämare kontakten. Volymmässigt tänker projektet inte bli stort, så det kommer att passa in i någon av de två. De skiljer sig inte i drifthastighet. Båda korten har 50 MHz oscillatorer ombord, och inne i FPGA:n finns en PLL, med vilken jag kan öka frekvensen till de planerade 200 MHz.

Första dagen

På grund av att jag redan hade gjort DDS-modulen i mitt synthesizerprojekt, tog jag omedelbart upp lödkolven och började löda DAC:n med motstånd. Jag tog en prototypbräda. Installationen gjordes med hjälp av omslag. Den enda förändringen som påverkade tekniken var att jag övergav F38N-syran för förtenning av stativen till förmån för TT-indikatorfluxgelen. Kärnan i tekniken är enkel: jag löder rack i ett kretskort och löd motstånd på dem från kretskortets sida. Jag gör de saknade kopplingarna genom att vrida. Dessutom är racken bekväma eftersom jag kan sätta in dem direkt i FPGA-kortet.

Tyvärr fanns det inga 1 och 2 kilo-ohm motstånd tillgängliga hemma. Det fanns inte tid att gå till affären. Jag var tvungen att ge upp en av mina regler och ta bort motstånd från det gamla onödiga kortet. Där användes 15K och 30K motstånd. Resultatet är denna Frankenstein:


När du har skapat projektet måste du ställa in målenheten: Menytilldelningar -> Enhet


I projektet kodade jag den okontrollerbara DDS-huvudmodulen till en fast frekvens.

1000 Hz generatormodul

modul signal_generator(clk50M, signal_out); ingångstråd clk50M; trådutgång signal_out; tråd clk200M; osc osc_200M reg ackumulator; tilldela signal_out = ackumulator; //försök att generera 1 000 Hz //50 000 000 Hz - klockfrekvensen för den externa generatorn //2^32 = 4 294 967 296 - DDS-bitdjup - 32 bitar //dela ​​1 000 Hz / 50 000 9 / 429 / 429 * 429 * 429 * 429 Hz 7296 alltid @ (posedge clk50M) börja ackumulator<= accumulator + 32"d42949; end endmodule


Efter det klickade jag på "Starta kompilering" så att utvecklingsmiljön skulle fråga vilka input/output-linjer vi har i projektets huvudmodul och vilka fysiska PIN-koder de är anslutna till. Efter kompilering kan vi tilldela raderna som visas till de verkliga PIN-koderna för chip-FPGA:

Menyalternativ Tilldelningar -> Pin Planner

Vänligen ignorera raderna HS_OUT, key0 och key1 för nu, de dyker upp i projektet senare, men jag hade inte tid att ta en skärmdump i början.

I princip räcker det att endast "registrera" PIN_nn i kolumnen Plats, och de återstående parametrarna (I/O-standard, Current Strench och Slew Rate) kan lämnas som standard, eller så kan du välja samma som erbjuds av default (standard) så att det inte finns någon varning "ov.

Hur kan jag ta reda på vilken PIN-kod som motsvarar kontaktnumret på kortet?

Kontaktstiftsnumren är markerade på kortet


Och FPGA-stiften som kontaktkontakterna är anslutna till beskrivs i dokumentationen som medföljer FPGA-kortet.




Efter att stiften har tilldelats kompilerar jag projektet igen och flashar det med en USB-programmerare. Om du inte har installerade drivrutiner för USB Byte blaster-programmerare, berätta för Windows att de finns i mappen där du har Quartus installerat. Då hittar hon det själv.

Programmeraren måste vara ansluten till JTAG-kontakten. Och menyalternativet för programmering är "Verktyg -> Programmerare" (eller klicka på ikonen i verktygsfältet). "Start"-knappen, den glada "framgången" och den fasta programvaran finns redan inne i FPGA:n och fungerar redan. Stäng bara inte av FPGA, annars kommer den att glömma allt.

Verktyg -> Programmerare


DAC:n är ansluten till FPGA-kortets kontakt. Jag ansluter S1-112A-oscilloskopet till DAC-utgången. Resultatet bör vara en "såg" eftersom den höga delen av DDS-ordet i fasackumulatorn matas ut till 8-bitars utgången. Och den ökar alltid tills den svämmar över.

Cirka 1,5 timme och för en frekvens på 1000 Hz ser jag följande oscillogram:

Jag skulle vilja notera att "sågen" har en liten fraktur i mitten. Det beror på det faktum att motstånd har en rad värden.

En annan viktig punkt som behövde klargöras är den högsta möjliga frekvensen med vilken DDS-generatorn kommer att fungera. Med korrekt konfigurerade TimeQuest-parametrar kan du efter kompilering i "Kompileringsrapporten" se att kretsens hastighet är över 200 MHz med en marginal. Detta innebär att jag multiplicerar generatorfrekvensen på 50 MHz med 4 med PLL. Jag kommer att öka värdet på DDS-fasackumulatorn med en frekvens på 200 MHz. Det slutliga frekvensområdet som kan erhållas under våra förhållanden är 0 - 100 MHz. Frekvensinställningsnoggrannhet:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Det vill säga, det är bättre än ~0,05 Hz. Jag anser att noggrannheten på en bråkdel av en hertz är tillräcklig för en generator med ett sådant intervall av driftfrekvenser (0...100 MHz). Om någon behöver öka noggrannheten kan du för att göra detta öka DDS-bitdjupet (kom ihåg att kontrollera TimeQuest Timing Analyzer att drifthastigheten för den logiska kretsen var inom CLK = 200 MHz, eftersom detta är en adderare), eller helt enkelt minska klockfrekvensen, om ett så brett frekvensområde inte krävs.

TimeQuest Timing Analyzer


Efter att jag såg "såg" på skärmen tvingade familjefrågor mig att åka till landet (det var min lediga dag). Där mejade jag, lagade mat, grillade och hade ingen aning om överraskningen som väntade mig på kvällen. Närmare natten, innan jag gick och la mig, bestämde jag mig för att titta på signalformen för andra frekvenser.

För frekvens 100 kHz

För frekvens 250 kHz

För frekvens 500 kHz

För 1 MHz frekvens

Andra dagen

På grund av att det var intressant hur DAC:n skulle fungera på motstånd på 100 och 200 Ohm tog jag genast upp lödkolven. Den här gången visade sig DAC:n vara mer exakt och det tog kortare tid att installera den.

Vi sätter DAC:n på FPGA-kortet och ansluter den till oscilloskopet

Kontrollerar 1 MHz - VO! Det är en helt annan sak!

Såg 10 MHz

Såg 25 MHz


Formen på 10 MHz-sågen liknar fortfarande den korrekta. Men vid 25 MHz är det inte längre "snyggt" alls. C1-112a har dock en bandbredd på 10 MHz, så i det här fallet kan orsaken redan finnas i oscilloskopet.

I princip kan denna fråga med DAC anses vara avslutad. Låt oss nu ta vågformer av höghastighetsutgången. För att göra detta kommer vi att mata ut den mest signifikanta biten till en separat PIN-kod för FPGA. Vi kommer att ta data för denna linje från den viktigaste biten av DDS-ackumulatorn.

Tilldela hs_out = ackumulator;

Fyrkantsvåg 1 MHz

Fyrkantsvåg 5 MHz

Fyrkantsvåg 25 MHz

50 MHz fyrkantvågen är nästan osynlig nu


Men jag tycker att FPGA-utgången bör laddas med motstånd. Kanske hade fronterna varit brantare.

Sinuset görs enligt tabellen. Tabellstorleken är 256 värden på 8 bitar. Det hade gått att ta mer, men jag hade redan en färdig mif-fil. Med hjälp av guiden skapar vi ett ROM-element med sinustabelldata från mif-filen.

Skapa en ROM - Verktyg -> Mega Wizard Plugin-hanterare


Välj 1 port ROM och ge modulen ett namn

Vi instämmer

Vi håller med här också

Med Browse hittar vi vår mif-fil med sinustabellen

Vi ändrar ingenting här heller.

Avmarkera modulen sine_rom_bb.v - den behövs inte. Nästa målgång. Quartus kommer att be om att få lägga till en modul till projektet - vi håller med. Därefter kan modulen användas precis som vilken annan modul som helst i Verilog.


De övre 8 bitarna av DDS-ackumulatorordet kommer att användas som ROM-adress, och datautgången kommer att vara sinusvärdet.

Koda

//sine rom tråd sine_out; sinus_rom sinus1(.klocka(clk200M), .adress(ackumulator), .q(sinus_ut));


Oscillogrammet för en sinusvåg vid olika frekvenser ser... likadant ut.

Om så önskas kan du överväga DAC-problem i samband med resistorspridning:

Nåväl, det är slutet på helgen. Men programvara för styrning från en PC har ännu inte skrivits. Jag är tvungen att erkänna att jag inte höll de planerade deadlines.

Dag tre

Det finns väldigt lite tid, så vi skriver programmet i all hast (i bästa traditioner). På vissa ställen, för att minska antalet bokstäver och förenkla inmatning av information från tangentbordet, används ett händelsefilter efter widgetnamn. Snälla förstå och förlåt.

Gränssnitt

Länkar med analoger

Inte en komplett lista
Funktionell DDS-generator. Skapad utifrån AVR. Frekvenser 0... 65534 Hz.
Recension av DDS-generator GK101. Skapad med Altera MAX240 FPGA. Frekvenser upp till 10 MHz.
Multifunktionsgenerator på PIC16F870. Frekvensområde: 11 Hz - 60 kHz.
generatorer Lägg till taggar

Maximal frekvens - 65534 Hz ​​(och upp till 8 MHz HS-utgång med fyrkantsvåg). Och så tänkte jag att en generator är en utmärkt uppgift där FPGA:n kan visa sig som bäst. Som en sportfråga bestämde jag mig för att upprepa projektet på FPGA, samtidigt som jag höll deadlines inom två helger och fick parametrarna inte strikt definierade, utan maximalt möjliga. Du kan ta reda på vad som kom ut av detta under snittet.

Dag noll

Innan helgen kom hade jag lite tid att tänka på genomförandet. För att förenkla min uppgift bestämde jag mig för att göra generatorn inte som en separat enhet med knappar och en LCD-skärm, utan som en enhet som ansluts till en PC via USB. Till detta har jag ett USB2RS232-kort. Kortet kräver inga drivrutiner (CDC), därför tror jag att det kommer att fungera under Linux (för vissa är detta viktigt). Jag ska heller inte dölja att jag redan har jobbat med att ta emot meddelanden via RS232. Jag kommer att ta färdiga moduler för att arbeta med RS232 från opencores.com.

För att generera en sinusvågssignal behöver du en DAC. Jag valde DAC-typen, som i originalprojektet - R2R 8-bitars. Det gör att du kan arbeta vid höga frekvenser, i storleksordningen megahertz. Jag är övertygad om att FPGA borde klara av detta

Jag funderade på hur man skriver ett program för att överföra data via en COM-port. Å ena sidan kan du skriva i Delphi7 du har redan erfarenhet av att skriva ett sådant program, och dessutom kommer storleken på den körbara filen inte att vara stor. Jag försökte också skissa på något att fungera med Serial i form av ett java-script i en html-sida, men det fungerade mer eller mindre bara genom Chromes seriella API, men för detta måste du installera ett plugin... generellt , det är inte heller aktuellt. Jag försökte PyQt5 som en innovation för mig själv, men när du distribuerar ett sådant projekt måste du dra ett gäng bibliotek. Efter att ha försökt kompilera ett PyQt-projekt till en exe-fil, visade det sig vara mer än 10 MB. Det vill säga, det blir inte bättre än en applikation skriven i C++\Qt5. Det är också värt att tänka på att jag inte har erfarenhet av att utveckla i python, men jag har erfarenhet av Qt5. Därför föll valet på Qt5. Sedan den femte versionen dök det upp en modul för att arbeta med seriell och jag har redan arbetat med den. Och en applikation baserad på Qt5 kan överföras till Linux och Mac (för vissa är detta viktigt), och från version 5.2 kan applikationer baserade på QWidgets till och med överföras till en smartphone!

Vad mer behövs? Naturligtvis har kortet en FPGA. Jag har två av dem (Cyclone iv EP4CE10E22C8N för 10 tusen celler och Cyclone ii EP2C5 för 5 tusen celler). Jag väljer den till vänster enbart på grund av den bekvämare kontakten. Volymmässigt tänker projektet inte bli stort, så det kommer att passa in i någon av de två. De skiljer sig inte i drifthastighet. Båda korten har 50 MHz oscillatorer ombord, och inne i FPGA:n finns en PLL, med vilken jag kan öka frekvensen till de planerade 200 MHz.

Första dagen

På grund av det faktum att jag redan hade gjort DDS-modulen i mitt synthesizerprojekt, tog jag omedelbart upp lödkolven och började löda DAC:n med motstånd. Jag tog en prototypbräda. Installationen gjordes med . Den enda förändringen som påverkade tekniken var att jag övergav F38N-syran för förtenning av stativen till förmån för TT-indikatorfluxgelen. Kärnan i tekniken är enkel: jag löder rack i ett kretskort och löd motstånd på dem från kretskortssidan. Jag gör de saknade kopplingarna genom att vrida. Dessutom är racken bekväma eftersom jag kan sätta in dem direkt i FPGA-kortet.

Tyvärr fanns det inga 1 och 2 kilo-ohm motstånd tillgängliga hemma. Det fanns inte tid att gå till affären. Jag var tvungen att ge upp en av mina regler och ta bort motstånd från det gamla onödiga kortet. Där användes 15K och 30K motstånd. Resultatet är denna Frankenstein:


När du har skapat projektet måste du ställa in målenheten: Menytilldelningar -> Enhet


I projektet kodade jag den okontrollerbara DDS-huvudmodulen till en fast frekvens.

1000 Hz generatormodul

modul signal_generator(clk50M, signal_out); ingångstråd clk50M; trådutgång signal_out; tråd clk200M; osc osc_200M reg ackumulator; tilldela signal_out = ackumulator; //försök att generera 1 000 Hz //50 000 000 Hz - klockfrekvensen för den externa generatorn //2^32 = 4 294 967 296 - DDS-bitdjup - 32 bitar //dela ​​1 000 Hz / 50 000 9 / 429 / 429 * 429 * 429 * 429 Hz 7296 alltid @ (posedge clk50M) börja ackumulator<= accumulator + 32"d42949; end endmodule


Efter det klickade jag på "Starta kompilering" så att utvecklingsmiljön skulle fråga vilka input/output-linjer vi har i projektets huvudmodul och vilka fysiska PIN-koder de är anslutna till. Efter kompilering kan vi tilldela raderna som visas till de verkliga PIN-koderna för chip-FPGA:

Menyalternativ Tilldelningar -> Pin Planner

Vänligen ignorera raderna HS_OUT, key0 och key1 för nu, de dyker upp i projektet senare, men jag hade inte tid att ta en skärmdump i början.

I princip räcker det att endast "registrera" PIN_nn i kolumnen Plats, och de återstående parametrarna (I/O-standard, Current Strench och Slew Rate) kan lämnas som standard, eller så kan du välja samma som erbjuds av default (standard) så att det inte finns någon varning "ov.

Hur kan jag ta reda på vilken PIN-kod som motsvarar kontaktnumret på kortet?

Kontaktstiftsnumren är markerade på kortet


Och FPGA-stiften som kontaktkontakterna är anslutna till beskrivs i dokumentationen som medföljer FPGA-kortet.




Efter att stiften har tilldelats kompilerar jag projektet igen och flashar det med en USB-programmerare. Om du inte har installerade drivrutiner för USB Byte blaster-programmerare, berätta för Windows att de finns i mappen där du har Quartus installerat. Då hittar hon det själv.

Programmeraren måste vara ansluten till JTAG-kontakten. Och menyalternativet för programmering är "Verktyg -> Programmerare" (eller klicka på ikonen i verktygsfältet). "Start"-knappen, den glada "framgången" och den fasta programvaran finns redan inne i FPGA:n och fungerar redan. Stäng bara inte av FPGA, annars kommer den att glömma allt.

Verktyg -> Programmerare


DAC:n är ansluten till FPGA-kortets kontakt. Jag ansluter S1-112A-oscilloskopet till DAC-utgången. Resultatet bör vara en "såg" eftersom den höga delen av DDS-ordet i fasackumulatorn matas ut till 8-bitars utgången. Och den ökar alltid tills den svämmar över.

Cirka 1,5 timme och för en frekvens på 1000 Hz ser jag följande oscillogram:

Jag skulle vilja notera att "sågen" har en liten fraktur i mitten. Det beror på det faktum att motstånd har en rad värden.

En annan viktig punkt som behövde klargöras är den högsta möjliga frekvensen med vilken DDS-generatorn kommer att fungera. Med korrekt konfigurerade TimeQuest-parametrar kan du efter kompilering i "Kompileringsrapporten" se att kretsens hastighet är över 200 MHz med en marginal. Detta innebär att jag multiplicerar generatorfrekvensen på 50 MHz med 4 med PLL. Jag kommer att öka värdet på DDS-fasackumulatorn med en frekvens på 200 MHz. Det slutliga frekvensområdet som kan erhållas under våra förhållanden är 0 - 100 MHz. Frekvensinställningsnoggrannhet:

200 000 000 Hz (clk) / 2^32 (DDS) = 0,047 Hz
Det vill säga, det är bättre än ~0,05 Hz. Jag anser att noggrannheten på en bråkdel av en hertz är tillräcklig för en generator med ett sådant intervall av driftfrekvenser (0...100 MHz). Om någon behöver öka noggrannheten kan du för att göra detta öka DDS-bitdjupet (kom ihåg att kontrollera TimeQuest Timing Analyzer att drifthastigheten för den logiska kretsen var inom CLK = 200 MHz, eftersom detta är en adderare), eller helt enkelt minska klockfrekvensen, om ett så brett frekvensområde inte krävs.

TimeQuest Timing Analyzer


Efter att jag såg "såg" på skärmen tvingade familjefrågor mig att åka till landet (det var min lediga dag). Där mejade jag, lagade mat, grillade och hade ingen aning om överraskningen som väntade mig på kvällen. Närmare natten, innan jag gick och la mig, bestämde jag mig för att titta på signalformen för andra frekvenser.

För frekvens 100 kHz

För frekvens 250 kHz

För frekvens 500 kHz

För 1 MHz frekvens

Andra dagen

På grund av att det var intressant hur DAC:n skulle fungera på motstånd på 100 och 200 Ohm tog jag genast upp lödkolven. Den här gången visade sig DAC:n vara mer exakt och det tog kortare tid att installera den.

Vi sätter DAC:n på FPGA-kortet och ansluter den till oscilloskopet

Kontrollerar 1 MHz - VO! Det är en helt annan sak!

Såg 10 MHz

Såg 25 MHz


Formen på 10 MHz-sågen liknar fortfarande den korrekta. Men vid 25 MHz är det inte längre "snyggt" alls. C1-112a har dock en bandbredd på 10 MHz, så i det här fallet kan orsaken redan finnas i oscilloskopet.

I princip kan denna fråga med DAC anses vara avslutad. Låt oss nu ta vågformer av höghastighetsutgången. För att göra detta kommer vi att mata ut den mest signifikanta biten till en separat PIN-kod för FPGA. Vi kommer att ta data för denna linje från den viktigaste biten av DDS-ackumulatorn.

Tilldela hs_out = ackumulator;

Fyrkantsvåg 1 MHz

Fyrkantsvåg 5 MHz

Fyrkantsvåg 25 MHz

50 MHz fyrkantvågen är nästan osynlig nu


Men jag tycker att FPGA-utgången bör laddas med motstånd. Kanske hade fronterna varit brantare.

Sinuset görs enligt tabellen. Tabellstorleken är 256 värden på 8 bitar. Det hade gått att ta mer, men jag hade redan en färdig mif-fil. Med hjälp av guiden skapar vi ett ROM-element med sinustabelldata från mif-filen.

Skapa en ROM - Verktyg -> Mega Wizard Plugin-hanterare


Välj 1 port ROM och ge modulen ett namn

Vi instämmer

Vi håller med här också

Med Browse hittar vi vår mif-fil med sinustabellen

Vi ändrar ingenting här heller.

Avmarkera modulen sine_rom_bb.v - den behövs inte. Nästa målgång. Quartus kommer att be om att få lägga till en modul till projektet - vi håller med. Därefter kan modulen användas precis som vilken annan modul som helst i Verilog.


De övre 8 bitarna av DDS-ackumulatorordet kommer att användas som ROM-adress, och datautgången kommer att vara sinusvärdet.

Koda

//sine rom tråd sine_out; sinus_rom sinus1(.klocka(clk200M), .adress(ackumulator), .q(sinus_ut));


Oscillogrammet för en sinusvåg vid olika frekvenser ser... likadant ut.

Om så önskas kan du överväga DAC-problem i samband med resistorspridning:

Nåväl, det är slutet på helgen. Men programvara för styrning från en PC har ännu inte skrivits. Jag är tvungen att erkänna att jag inte höll de planerade deadlines.

Dag tre

Det finns väldigt lite tid, så vi skriver programmet i all hast (i bästa traditioner). På vissa ställen, för att minska antalet bokstäver och förenkla inmatning av information från tangentbordet, används ett händelsefilter efter widgetnamn. Snälla förstå och förlåt.

Gränssnitt

Länkar med analoger

Inte en komplett lista
Funktionell DDS-generator. Skapad utifrån AVR. Frekvenser 0... 65534 Hz.
Recension av DDS-generator GK101. Skapad med Altera MAX240 FPGA. Frekvenser upp till 10 MHz.
Multifunktionsgenerator på PIC16F870. Frekvensområde: 11 Hz - 60 kHz.
generatorer
  • Qt5
  • Lägg till taggar

    Varje hemverkstad bör ha den nödvändiga uppsättningen verktyg och mätinstrument. För personer som är engagerade i amatörradio som hobby är de höga ekonomiska kostnaderna för att köpa den nödvändiga utrustningen ofta oacceptabla.

    Så i mitt fall var listan över denna utrustning långt ifrån komplett och saknad signalgenerator.

    Signalgenerator Det visade sig vara enkelt att göra själv av tillgängliga radioelement och inte dyrt i slutändan. Så efter att ha rotat på Internet hittade jag ett stort antal kretsar för olika generatorer, inklusive mer avancerade modeller med en DAC, men redan dyra att tillverka. Till att börja med stannade jag vid en enkel DDS signalgenerator på ATMEGA8 mikrokontroller från Atmel. Den här, jag har inte förbättrat eller ändrat någonting - jag lämnade allt som det är, jag skapade bara en kopia och dessutom hävdar jag inte att den här enheten är författare.

    Så, signalgenerator har goda egenskaper och lämpar sig för att lösa enkla problem.

    Visar information i signalgenerator produceras på en 16x2 teckens LCD-skärm med en HD44780-kontroller. Det är anmärkningsvärt att för att spara mikrokontrollerportar styrs LCD-skärmen via endast tre ledningar detta uppnåddes genom att använda ett skiftregister - läs om hur du ansluter en skärm via tre ledningar.

    Det är nödvändigt att spara portar, 8 portar används för en resistiv DAC, 7 portar för knappar. I den ursprungliga artikeln lovade författaren att använda PWM-modulering, men avslutade uppenbarligen inte den, eftersom han började utveckla en mer avancerad version på ATMEGA16.

    Schematisk bild av en DDS-signalgenerator och kretskort.

    Kretsen och korten visas i originalet, de innehåller även knappar för PWM-kontroll som inte används av författaren.

    För DAC:n köpte jag specifikt precisionsmotstånd med ett fel på ±0,05%, men som det visade sig är enkla med ett fel på ±5% tillräckligt. Signalformen var ganska acceptabel för alla typer av signaler.

    När generator monteras och programmet laddats in i mikrokontrollern, inga inställningar krävs, såvida du inte justerar displaykontrasten.

    Att arbeta med enheten är enkelt - välj signalform, ställ in önskad frekvens och du kan ändra frekvensinställningssteget med gränser på 1 - 10 - 100 - 1000 Hz per steg. Klicka sedan på Start och generatorn börjar fungera. Det bör noteras att när generatorn startas kan frekvensen och formen på signalen inte ändras, detta beror på att programmet går in i en ändlös slinga och för att öka den maximala genereringsfrekvensen, knappen polling proceduren måste tas bort. För att stoppa genereringen, klicka på stop/reset, detta startar om programmet och det återgår till inställningsmenyn. Här är nyansen.

    Separat skulle jag vilja prata om att göra ett hus för generatorn. Du kan köpa ett färdigt fodral i en butik eller använda ett passande från någon annan enhet, men jag bestämde mig för att göra det helt själv. En bit dubbelsidig glasfiber låg på tomgång som jag skänkte till kroppen.

    Först måste du ta alla mått, dimensionerna på LCD-skärmen och signalgeneratorkortet, strömförsörjning, kontakter och knappar, och sedan placera det på ett pappersark som det kommer att vara inuti höljet. Baserat på de erhållna dimensionerna kan du börja tillverka.

    Detta projekt är en högkvalitativ och universell funktionsgenerator, som trots viss komplexitet hos kretsen, åtminstone i jämförelse med enklare, har mycket bred funktionalitet, vilket motiverar kostnaden för monteringen. Den kan producera 9 olika vågformer och fungerar även med pulssynkronisering.

    Schematiskt diagram av generatorn på MK

    Enhetsinställningar

    • Frekvensområde: 10 Hz - 60 kHz
    • Digital frekvensjustering i 3 olika steg
    • Vågformer: sinus, triangel, fyrkant, såg, H-puls, L-puls, burst, svep, brus
    • Utgångsområde: 15V för sinus och triangel, 0-5V för andra lägen
    • Det finns en utgång för pulssynkronisering

    Enheten drivs från 12 volt växelström, vilket ger en tillräckligt hög (över 18 V) likspänning som krävs för normal drift av 78L15 och 79L15, som bildar en bipolär 15 V-krets. Detta görs så att LF353-mikrokretsen kan mata ut fullt spektrum av signaler till lasten 1 kOhm.

    Nivåregulator använd ALPS SRBM1L0800. Kretsen bör använda motstånd med ±1% tolerans eller bättre. LED-strömbegränsare - 4306R-seriens motstånd. Ljusstyrkan kan ökas beroende på artistens preferenser. Generatorn är monterad i en plastlåda 178x154x36 mm med front- och bakpaneler i aluminium.

    Många kontaktkomponenter är monterade på front- och bakpanelen (knappar, vred, RCA-kontakter, LED-enheter, strömkontakt). Tryckta kretskort fästs på höljet med bultar med plastdistanser. Alla andra element i generatorn är monterade på kretskort - strömförsörjningen är separat. Den vänstra knappen i mitten är för att ändra läge, den högra är för att välja lägesfrekvens.

    Generatorn producerar olika signaler och arbetar i tre lägen, som väljs med "Select"-tangenten och indikeras av de tre övre (i diagrammet) lysdioderna. Vridreglaget ändrar signalparametrarna enligt följande tabell:

    Omedelbart efter inställning i läge 1 sker sinusgenerering. Startfrekvensen är dock ganska låg och minst ett klick på kodaren behövs för att öka den. Kortet har en kontakt för att ansluta enheten för programmering, vilket gör att du snabbt kan ändra funktionaliteten hos signalgeneratorn, om det behövs. Alla projektfiler - PIC16F870 firmware, kortritningar, finns

    Denna DDS-funktionsgenerator (version 2.0) av signaler är monterad på en AVR-mikrokontroller, har bra funktionalitet, har amplitudkontroll och är även monterad på ett enkelsidigt kretskort.

    Denna generator är baserad på Jesper DDS generatoralgoritm, programmet har moderniserats för AVR-GCC C med monteringskodinsatser. Generatorn har två utsignaler: den första är DDS-signaler, den andra är en höghastighets (1..8 MHz) "rektangulär" utgång, som kan användas för att återuppliva MK med felaktiga fuzzes och för andra ändamål.
    Höghastighetssignalen HS (High Speed) tas direkt från Atmega16 OC1A (PD5) mikrokontroller.
    DDS-signaler genereras från andra MC-utgångar genom en resistiv R2R-matris och genom LM358N-chippet, vilket möjliggör justering av signalamplitud och offset. Offset och amplitud justeras med två potentiometrar. Offseten kan justeras i intervallet +5V..-5V, och amplituden är 0...10V. Frekvensen för DDS-signaler kan justeras inom intervallet 0...65534 Hz, detta är mer än tillräckligt för att testa ljudkretsar och andra radioamatöruppgifter.

    Huvudegenskaper hos DDS-generator V2.0:
    - en enkel krets med vanliga och billiga radioelement;
    - enkelsidigt kretskort;
    - inbyggd strömförsörjning;
    - separat höghastighetsutgång (HS) upp till 8 MHz;
    - DDS-signaler med variabel amplitud och offset;
    - DDS-signaler: sinus, rektangel, såg och omvänd såg, triangel, EKG-signal och brussignal;
    - 2×16 LCD-skärm;
    - intuitivt 5-knapps tangentbord;
    - steg för frekvensjustering: 1, 10, 100, 1000, 10000 Hz;
    - kommer ihåg det senaste tillståndet efter att strömmen slagits på.

    Blockschemat nedan visar den logiska strukturen för en funktionsgenerator:

    Som du kan se kräver enheten flera matningsspänningar: +5V, -12V, +12V. Spänningar +12V och -12V används för att reglera signalamplitud och offset. Strömförsörjningen är utformad med hjälp av en transformator och flera spänningsstabilisatorchips:

    Strömförsörjningen är monterad på ett separat kort:

    Om du inte vill montera strömförsörjningen själv kan du använda en vanlig ATX-strömförsörjning från en dator, där alla nödvändiga spänningar redan finns. ATX-kontaktlayout.

    LCD skärm

    Alla åtgärder visas via en LCD-skärm. Generatorn styrs av fem nycklar

    Upp/ner-knapparna används för att flytta genom menyn, vänster/höger-knapparna används för att ändra frekvensvärdet. När mittknappen trycks in börjar den valda signalen att genereras. Genom att trycka på knappen igen stoppas generatorn.

    Ett separat värde tillhandahålls för att ställa in frekvensändringssteget. Detta är praktiskt om du behöver ändra frekvensen över ett brett område.

    Brusgeneratorn har inga inställningar. Den använder den vanliga rand()-funktionen, som kontinuerligt matas till utgången från DDS-generatorn.

    HS-höghastighetsutgången har 4 frekvenslägen: 1, 2, 4 och 8 MHz.

    Schematiskt diagram

    Funktionsgeneratorkretsen är enkel och innehåller lättillgängliga element:
    - AVR Atmega16 mikrokontroller, med extern kvarts vid 16 MHz;
    - standard LCD-skärm av typen HD44780 2×16;
    - R2R DAC-matris gjord av vanliga motstånd;
    - operationsförstärkare LM358N (inhemsk analog till KR1040UD1);
    - två potentiometrar;
    - fem nycklar;
    - flera kontakter.

    Betala:

    Den funktionella generatorn är monterad i en plastlåda:


    programvara

    Som jag sa ovan baserade jag mitt program på Jesper DDS-generatoralgoritmen. Jag lade till några rader med monteringskod för att implementera generationsstoppet. Nu innehåller algoritmen 10 CPU-cykler istället för 9.

    void statisk 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"
    "eor r19, r19 ;r19<-0″ "\n\t"
    "1:" "\n\t"
    "lägg till r18, %0 ;1 cykel" "\n\t"
    "adc r19, %1 ;1 cykel" "\n\t"
    "adc %A3, %2 ;1 cykel" "\n\t"
    "lpm ;3 cykler" "\n\t"
    "ut %4, __tmp_reg__ ;1 cykel" "\n\t"
    "sbis %5, 2 ;1 cykel om ingen hoppa över" "\n\t"
    "rjmp 1b ;2 cykler. Totalt 10 cykler" "\n\t"
    :
    :"r" (ad0),,"r" (ad1),,"r" (ad2),,"e" (signal),,"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR) ))
    :"r18″, "r19″
    );}

    Tabellen över DDS-signalformer finns i MK:ns flashminne, vars adress börjar på 0xXX00. Dessa sektioner är definierade i makefilen, på lämpliga minnesplatser:
    #Definiera avsnitt där signaltabeller ska lagras
    LDFLAGS += -Wl,-sektion-start=.MySection1=0x3A00
    LDFLAGS += -Wl,-sektion-start=.MySection2=0x3B00
    LDFLAGS += -Wl,-sektion-start=.MySection3=0x3C00
    LDFLAGS += -Wl,-sektion-start=.MySection4=0x3D00
    LDFLAGS += -Wl,-sektion-start=.MySection5=0x3E00
    LDFLAGS += -Wl,-sektion-start=.MySection6=0x3F00