{"id":286,"date":"2020-10-14T08:50:16","date_gmt":"2020-10-14T06:50:16","guid":{"rendered":"http:\/\/sq9tla.pzk.pl\/?p=286"},"modified":"2020-10-14T13:08:25","modified_gmt":"2020-10-14T11:08:25","slug":"dds-z-arduino-nano-oraz-ad9850","status":"publish","type":"post","link":"https:\/\/sq9tla.pzk.pl\/index.php\/2020\/10\/14\/dds-z-arduino-nano-oraz-ad9850\/","title":{"rendered":"DDS z Arduino NANO oraz AD9850"},"content":{"rendered":"\n<p>Najpro\u015bciej wykonany uk\u0142ad DDS z popularnym modu\u0142em AD9850. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" width=\"1024\" height=\"951\" src=\"http:\/\/sq9tla.pzk.pl\/wp-content\/uploads\/2018\/04\/dds_bb-1024x951.jpg\" alt=\"\" class=\"wp-image-287\" srcset=\"https:\/\/sq9tla.pzk.pl\/wp-content\/uploads\/2018\/04\/dds_bb-1024x951.jpg 1024w, https:\/\/sq9tla.pzk.pl\/wp-content\/uploads\/2018\/04\/dds_bb-300x279.jpg 300w, https:\/\/sq9tla.pzk.pl\/wp-content\/uploads\/2018\/04\/dds_bb-768x713.jpg 768w, https:\/\/sq9tla.pzk.pl\/wp-content\/uploads\/2018\/04\/dds_bb-960x891.jpg 960w, https:\/\/sq9tla.pzk.pl\/wp-content\/uploads\/2018\/04\/dds_bb.jpg 1200w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Schemat pod\u0142\u0105czenia uk\u0142adu.<br><\/figcaption><\/figure>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;Wire.h>\n#include &lt;<strong>EEPROM<\/strong>.h>\n#include &lt;<strong>LiquidCrystal_I2C<\/strong>.h>\n#include &lt;Encoder_Polling.h>\n#include &lt;AH_AD9850.h>\n\n\/\/************ PORTY ARDUINO******************\n\n\/\/porty dla DDS AD9850\n#define AD9850_RESET \u00a0\u00a0\u00a09\n#define AD9850_BITDATA \u00a08\n#define AD9850_FQUP \u00a0\u00a0\u00a0\u00a07\n#define AD9850_CLK \u00a0\u00a0\u00a0\u00a0\u00a06\n\n\/\/porty dla ENCODER\n#define ENCODER_SW \u00a0\u00a0\u00a0\u00a0\u00a05\n#define ENCODER_CLK \u00a0\u00a0\u00a0\u00a04\n#define ENCODER_DT \u00a0\u00a0\u00a0\u00a0\u00a03\n\n\/\/porty dla przycisk\u00f3w\n\n#define BUTTON_1 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a012\n#define BUTTON_2 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a011\n#define BUTTON_3 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a010\n#define BUTTON_4 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0A0\n\n\/\/port dla diod LED \n#define LED \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a02\n\/\/pomiar napiecia\n#define VOL \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0A1\n\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ OBIEKTY \/\/\/\/\/\n\n\/\/********** \u00a0MODUL DDS *********************************\n\/\/ definicja AH_AD9850(CLK, FQUP, BitData, RESET)\nAH_AD9850 AD9850(AD9850_CLK, AD9850_FQUP, AD9850_BITDATA, AD9850_RESET); \n\n#define LCD_I2C_ADDRESS 0x27 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\/\/\/LiquidCrystal_I2C(lcd_Addr,En,Rw,Rs,d4,d5,d6,d7,backlighPin,backlighPol);\n<strong>LiquidCrystal_I2C<\/strong> lcd(LCD_I2C_ADDRESS, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); \n\n\/\/Sta\u0142e\n#define ROW_1 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00\n#define ROW_2 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a01\nconst long MIN_FREQ \u00a0= 7000000; \/\/ Poczatek zakresu pasma 40 m\nconst long MAX_FREQ \u00a0= 7200000; \/\/ Koniec zakresu pasma 40 m\nconst long DEF_FREQ \u00a0= 7100000; \/\/ Domy\u015bla cz\u0119stotliwo\u015b\u0107 pasma 40 m\n\nconst long OSCILATOR \u00a0\u00a0\u00a0= 11998000; \/\/Cz\u0119stotliwo\u015b\u0107 oscylatora BFO\nconst long MAX_STEP \u00a0\u00a0\u00a0\u00a0= 10000; \/\/Maksymaly krok zmiany cz\u0119stotliwo\u015bci\nconst long MIN_STEP \u00a0\u00a0\u00a0\u00a0= 10; \/\/ Minimalny krok zmiany cz\u0119stotliowsci\nconst int \u00a0MIN_ARRAY_STEP = 0;\nconst int \u00a0MAX_ARRAY_STEP = 9;\n\n\n\/\/Zmienne\nlong Freq = DEF_FREQ;\nlong Step = 10;\nint \u00a0Encoder_SW_state = HIGH; \u00a0\u00a0\nlong Freq_VFO=0;\nint \u00a0Is_display_freq = \u00a0HIGH;\nint Volty =0;\nint Current_step = 0;\nint Array_steps[]={10,25,50,100,250,500,1000,2500,5000,10000};\nint scan_up = LOW;\nint scan_down = LOW;\nint scan = LOW;\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\/\/*******************************************************\nvoid setup()\n{\n \u00a0pinMode(BUTTON_1, INPUT);\n \u00a0pinMode(BUTTON_2, INPUT);\n \u00a0pinMode(BUTTON_3, INPUT);\n \u00a0pinMode(BUTTON_4, INPUT);\n \u00a0pinMode(ENCODER_SW, INPUT);\n \u00a0lcd.begin(16,2);\n \u00a0lcd.home();\n \u00a0lcd.print(\"* RADUINO 3.0 \u00a0*\");\n \u00a0lcd.setCursor(0,ROW_2); \u00a0\n \u00a0lcd.print(\" A.Sliwa SQ9TLA \");\n \u00a0delay(3000);\n \u00a0lcd.home ();\n \u00a0lcd.print(\"U: \u00a0\u00a0\u00a0V,S: 10 Hz\");\n \u00a0lcd.setCursor (0, ROW_2);\n \u00a0lcd.print(\"FERQ: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MHz\"); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n \u00a0encoder_begin(ENCODER_DT,ENCODER_CLK);\n \u00a0Freq=DEF_FREQ;\n}\n\n\/\/*******************************************************\nvoid loop() \u00a0{\n \u00a0\/\/Oodczyt stanu przycisk\u00f3w\n \u00a0int button_1 = digitalRead(BUTTON_1);\n \u00a0int button_2 = digitalRead(BUTTON_2);\n \u00a0int button_3 = digitalRead(BUTTON_3);\n \u00a0int button_4 = digitalRead(BUTTON_4);\n \u00a0\/\/Skanowanie pasma\n \u00a0if ((button_1 == HIGH) and (scan_up == LOW)) \u00a0{\n \u00a0\u00a0\u00a0scan_down=LOW; \n \u00a0\u00a0\u00a0scan_up = HIGH;\n \u00a0}\n \u00a0if ((button_1 == HIGH) and (scan_up == HIGH)) { \n \u00a0\u00a0\u00a0scan_down=LOW; \n \u00a0\u00a0\u00a0scan_up = LOW; \n \u00a0}\n \u00a0if ((button_2 == HIGH) and (scan_down == LOW)) \u00a0{ \n \u00a0\u00a0\u00a0scan_down=HIGH; \n \u00a0\u00a0\u00a0scan_up = LOW;\n \u00a0}\n \u00a0if ((button_2 == HIGH) and (scan_down == HIGH)) { \n \u00a0\u00a0\u00a0scan_down=LOW; \n \u00a0\u00a0\u00a0scan_up = LOW; \n \u00a0}\n \u00a0if (scan_up == HIGH) { \n \u00a0\u00a0\u00a0Freq = Freq + Step; \n \u00a0\u00a0\u00a0delay(1000); \n \u00a0}\n \u00a0if (scan_down == HIGH) { \n \u00a0\u00a0\u00a0Freq = Freq - Step; \n \u00a0\u00a0\u00a0delay(1000); \n \u00a0}\n \u00a0\/\/Zmiana freq od przycisk\u00f3w\n \u00a0if (button_3 == HIGH) Freq=Freq - 100; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n \u00a0if (button_4 == HIGH) Freq=Freq + 100;\n \u00a0\/\/Obs\u0142uga enkodera\n \u00a0int dir = encoder_data();\n \u00a0Encoder_SW_state= digitalRead(ENCODER_SW);\n \u00a0\/\/Zmiana kroku\n \u00a0if (Encoder_SW_state == LOW) {\n \u00a0\u00a0\u00a0\u00a0\u00a0if( dir > 0) { \n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (Current_step &lt; MAX_ARRAY_STEP) Current_step++;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\u00a0\u00a0if (dir &lt; 0 ) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (Current_step > MIN_ARRAY_STEP) \u00a0Current_step--;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0}\n \u00a0\/\/Zmiana cz\u0119stotliwo\u015bci\n \u00a0else {\n \u00a0\u00a0\u00a0\u00a0\u00a0if(dir > 0) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Freq = Freq + Step;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0\u00a0\u00a0if (dir &lt;0 ) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Freq = Freq - Step;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0}\n \u00a0Step=Array_steps[Current_step];\n \u00a0\/\/Ograniczniki dla pasm\n \u00a0if (Freq &lt; MIN_FREQ) { \n \u00a0\u00a0\u00a0Freq = MIN_FREQ; \n \u00a0\u00a0\u00a0scan_down = LOW; \n \u00a0}\n \u00a0if (Freq > MAX_FREQ) { \n \u00a0\u00a0\u00a0Freq = MAX_FREQ; \n \u00a0\u00a0\u00a0scan_up = LOW; \n \u00a0}\n \u00a0\/\/Wyswietlanie kroku na wy\u015bwietlaczu\n \u00a0if (Encoder_SW_state == LOW) {\n \u00a0\u00a0\u00a0if (Is_display_freq == HIGH) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lcd.setCursor(0,ROW_2);\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lcd.print(\"STEP: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Hz\");\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Is_display_freq = LOW;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0lcd.setCursor(6,ROW_2);\n \u00a0\u00a0\u00a0switch(Step) {\n \u00a0\u00a0\u00a0\u00a0\u00a0case 10000 \u00a0: lcd.print(\" \u00a010000\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 5000 \u00a0\u00a0: lcd.print(\" \u00a0\u00a05000\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 2500 \u00a0\u00a0: lcd.print(\" \u00a0\u00a02500\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 1000 \u00a0\u00a0: lcd.print(\" \u00a0\u00a01000\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 500 \u00a0\u00a0\u00a0: lcd.print(\" \u00a0\u00a0\u00a0500\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 250 \u00a0\u00a0\u00a0: lcd.print(\" \u00a0\u00a0\u00a0250\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 100 \u00a0\u00a0\u00a0: lcd.print(\" \u00a0\u00a0\u00a0100\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 50 \u00a0\u00a0\u00a0\u00a0: lcd.print(\" \u00a0\u00a0\u00a0\u00a050\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 25 \u00a0\u00a0\u00a0\u00a0: lcd.print(\" \u00a0\u00a0\u00a0\u00a025\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 10 \u00a0\u00a0\u00a0\u00a0: lcd.print(\" \u00a0\u00a0\u00a0\u00a010\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 1 \u00a0\u00a0\u00a0\u00a0\u00a0: lcd.print(\" \u00a0\u00a0\u00a0\u00a0\u00a01\"); break;\n \u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0lcd.setCursor(10,ROW_1); \u00a0\n \u00a0\u00a0\u00a0switch(Step) {\n \u00a0\u00a0\u00a0\u00a0\u00a0case 10000 \u00a0: lcd.print(\"10 kHz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 5000 \u00a0\u00a0: lcd.print(\" 5 kHz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 2500 \u00a0\u00a0: lcd.print(\"2.5kHz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 1000 \u00a0\u00a0: lcd.print(\" 1 kHz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 500 \u00a0\u00a0\u00a0: lcd.print(\"500 Hz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 250 \u00a0\u00a0\u00a0: lcd.print(\"250 Hz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 100 \u00a0\u00a0\u00a0: lcd.print(\"100 Hz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 50 \u00a0\u00a0\u00a0\u00a0: lcd.print(\" 50 Hz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 25 \u00a0\u00a0\u00a0\u00a0: lcd.print(\" 25 Hz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 10 \u00a0\u00a0\u00a0\u00a0: lcd.print(\" 10 Hz\"); break;\n \u00a0\u00a0\u00a0\u00a0\u00a0case 1 \u00a0\u00a0\u00a0\u00a0\u00a0: lcd.print(\" \u00a01 HZ\"); break;\n \u00a0\u00a0\u00a0}\n \u00a0}\n \u00a0else {\n \u00a0\u00a0\u00a0\u00a0if (Is_display_freq == LOW) {\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lcd.setCursor(0,ROW_2); \n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0lcd.print(\"FERQ: \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MHz\");\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Is_display_freq = HIGH;\n \u00a0\u00a0\u00a0\u00a0\u00a0}\n \u00a0\u00a0\u00a0lcd.setCursor(6,ROW_2); lcd.print(Freq\/10);\n \u00a0\u00a0\u00a0lcd.setCursor(5,ROW_2); lcd.print(\"7.\");\n \u00a0} \u00a0\n \u00a0\/\/Obs\u0142uga DDS-a\n \u00a0Freq_VFO=OSCILATOR - Freq;\n \u00a0AD9850.set_frequency(Freq_VFO);\n \u00a0button_1 = LOW;\n \u00a0button_2 = LOW;\n \u00a0button_3 = LOW;\n \u00a0button_4 = LOW;\n \u00a0delay(100);\n}\n\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Najpro\u015bciej wykonany uk\u0142ad DDS z popularnym modu\u0142em AD9850. #include &lt;Wire.h> #include &lt;EEPROM.h> #include &lt;LiquidCrystal_I2C.h> #include &lt;Encoder_Polling.h> #include &lt;AH_AD9850.h> \/\/************ PORTY ARDUINO****************** \/\/porty dla DDS AD9850 #define AD9850_RESET \u00a0\u00a0\u00a09 #define AD9850_BITDATA \u00a08 #define AD9850_FQUP \u00a0\u00a0\u00a0\u00a07 #define AD9850_CLK \u00a0\u00a0\u00a0\u00a0\u00a06 \/\/porty dla ENCODER #define ENCODER_SW \u00a0\u00a0\u00a0\u00a0\u00a05 #define ENCODER_CLK \u00a0\u00a0\u00a0\u00a04 #define ENCODER_DT \u00a0\u00a0\u00a0\u00a0\u00a03 \/\/porty dla przycisk\u00f3w #define BUTTON_1 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a012 <a href=\"https:\/\/sq9tla.pzk.pl\/index.php\/2020\/10\/14\/dds-z-arduino-nano-oraz-ad9850\/\" class=\"more-link\">Czytaj dalej...<span class=\"screen-reader-text\"> \"DDS z Arduino NANO oraz AD9850\"<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/posts\/286"}],"collection":[{"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/comments?post=286"}],"version-history":[{"count":14,"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/posts\/286\/revisions"}],"predecessor-version":[{"id":355,"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/posts\/286\/revisions\/355"}],"wp:attachment":[{"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/media?parent=286"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/categories?post=286"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sq9tla.pzk.pl\/index.php\/wp-json\/wp\/v2\/tags?post=286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}