DDS AD9850 i Arduino – wyśw. LCD
Ten projekt jest rozwinięciem opisanego przeze mnie wcześniej układu syntezy DDS. Układ został wzbogacony o obsługę wyświetlacza LCD 2×16 znaków, sterowanego po magistrali I2C. Ponadto zaimplementowałem obsługę zmiany kroku syntezy (10 Hz, 100 Hz, 1 KHz, 10 KHz, 100 KHz) poprzez wciśnięcie pokrętła encodera, lub switch`y zintegrowanych z wyświetlaczem LED (na wyśw. LED dodatkowo obsługa kroku 1 MHz). Aktualna wartość kroku syntezy jest wyświetlana na LCD oraz jednocześnie sygnalizowana zapaleniem (na czerwono) odpowiedniej diody LED na module wyświetlacza LED. Oba wyświetlacze pracują równolegle wskazując tą samą zadaną wartość częstotliwości. Dla uproszczenia kodu można jednak zrezygnować z obsługi któregoś z nich, przy czym po odłączeniu wyśw. LED możliwość zmiany kroku syntezy pozostaje wyłącznie na encoderze (Push Button).
Zastosowany wyświetlacz LCD z interface`em I2C wygląda tak :
Cały układ – DDS + Encoder + Arduino + wyświetlacz LED + wyświetlacz LCD I2C :
#include <AH_AD9850.h> //biblioteka modulu syntezy AD9850 #include <TM1638.h> //biblioteka modulu wysw. LED #include <Encoder_Polling.h> //biblioteka Encoder`a #include <Wire.h> //biblioteka obslugi I2C #include <LCD.h> //biblioteka obslugi LCD #include <LiquidCrystal_I2C.h> //biblioteka obslugi LCD po I2C //************************** Definicja pinow dla DDS ************************* //AH_AD9850(CLK, FQUP, BitData, RESET) AH_AD9850 AD9850(1, 0, 2, 3); //************************** Definicja pinow dla wysw. LED ******************* //TM1638(DIO, CLK, STB0) TM1638 module(8, 9, 7); //************************** Definicja pinow dla Encodera ******************** int encoderPin_A = 4; int encoderPin_B = 5; int PushButt = 6; // pin encodera PushButton //************************** Definicja adresu i pinow wysw. LCD I2C ********** //LiquidCrystal_I2C lcd(0x27,En,Rw,Rs,D4,D5,D6,D7); LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7); #define Light 3 //podswietlanie - pin 3 //**************************************************************************** //************************* Pozostale zmienne ******************************** long Freq = 10000000; //wartosc do przechowywania f long Krok = 10; //10 Hz - aktualny krok DDS int Switch = 0; //stan pocz. switch na wysw. LED String czastota; //zmienna tekstowa - potrzebna przy //wyswietlaniu f na LCD //**************************************************************************** void setup() { module.setupDisplay(true, 2); //intensywnosc swiecenia //wysw. LED domyslnie wali //po oczach (zakres 0-7) module.setLEDs(0x0100); //zapal pierwszy LED - krok 10 Hz encoder_begin(encoderPin_A, encoderPin_B);//start Encoder pinMode(PushButt, INPUT); //funkcja pinu PushButtona lcd.begin (16,2); //def. LCD lcd.setBacklightPin(Light,POSITIVE); //def. podswietlanie/rodzaj LCD lcd.setBacklight(HIGH); //wlacz podsw. LCD } //*************************************************************************** void loop() { AD9850.set_frequency(Freq); //ustaw czest. startowa //********* wyswietl wartosc f na LED *************************************** //(wartosc czest., ustawienie kropek, nieznaczace zera) module.setDisplayToDecNumber(Freq,B01001000,false); Switch=module.getButtons(); //sprawdz switch`e na wysw. LED prezentacja(); //procedura wyswietlania na LCD obsluga_buttona(); //procedura sprawdzania buttona //w encoderze obsluga_switch(); //procedura sprawdzania switchy //na wysw. LED int dir = encoder_data(); //sprawdz Encoder if(dir > 0) //jeśli w prawo to ... { Freq = Freq + Krok; //zwieksz f o krok } else if (dir { Freq = Freq - Krok; //zmniejsz f o krok } else { } delay(50); } //***************** KONIEC GLOWNEJ PETLI *********************************** //***************** PROCEDURY ********************************************** //***************** Procedura obslugi Switch`y na wysw. LED **************** void obsluga_switch() { if (Switch == B00000001) //jesli wcisniety 1 Switch (od lewej) { Krok = 10; //to ustaw 10 Hz module.setLEDs(0x0100); //ustaw LED 2 } else if (Switch == B00000010) //jesli 2 Switch { Krok = 100; //ustaw 100 Hz module.setLEDs(0x0200); //ustaw LED 3 } else if (Switch == B00000100) //jesli 3 Switch { Krok = 1000; //ustaw 1 KHz module.setLEDs(0x0400); //ustaw LED 4 } else if (Switch == B00001000) //jesli 4 Switch { Krok = 10000; //ustaw 10 KHz module.setLEDs(0x0800); //ustaw LED 5 } else if (Switch == B00010000) //jesli 5 Switch { Krok = 100000; //ustaw 100 KHz module.setLEDs(0x1000); //ustaw LED 6 } else if (Switch == B00100000) //jesli 6 Switch { Krok = 1000000; //ustaw 1 MHz module.setLEDs(0x2000); //ustaw LED 7 } else { } } //***************** Procedura obslugi Push Button`a na Encoderze *********** void obsluga_buttona() { if (digitalRead(PushButt)) { // nie wcisniety - nierob nic } else { //wcisniety if (Krok == 10) //jesli krok jest 10 Hz ... { Krok = 100; //to ustaw 100 Hz module.setLEDs(0x0200); //ustaw LED 2 } else if (Krok == 100) //jesli krok jest 100 Hz ... { Krok = 1000; //ustaw 1 KHz module.setLEDs(0x0400); //ustaw LED 3 } else if (Krok == 1000) //jesli krok jest 1 KHz ... { Krok = 10000; //ustaw 10 KHz module.setLEDs(0x0800); //ustaw LED 4 } else if (Krok == 10000) //jesli krok jest 10 KHz ... { Krok = 100000; //ustaw 100 KHz module.setLEDs(0x1000); //ustaw LED 5 } else { Krok = 10; module.setLEDs(0x0100); //ustaw LED 1 } } delay(70); // opoznienie 70 mS } //************ Procedura wyswietlenia czestotliwosci na LCD **************** void prezentacja() { czastota = String(Freq); //zamiana typu danych z long na string int dlugosc = czastota.length(); //ustalam dlugosc ciagu - ile znakow //aby zachowac jednolity wyglad odczytu //na LCD - jednostki/dziesiatki MHz i //rozmieszczenie kropek oddzielajacych //przy nizszych f (juz przy f<1MHz) //nalezy dopisac kolejne warunki //mi wystarczyly jedn. i dziesiatki MHz if (dlugosc == 7) //jesli dlugosc 7 (pojedyncze MHz) { czastota = "0" + czastota; //to dopisz zero z przodu } else //jesli 8 znakow (dziesiatki MHz) //nic nie rob { } lcd.clear(); //wyczysc LCD i wyzeruj poz. kursora lcd.print("STEP="); lcd.print(Krok); //wyswietl w 1 linii aktualny krok lcd.print(" Hz"); lcd.setCursor(0, 1); //ustaw kursor w 2 linii lcd.print("F=" + czastota.substring(0,2) + "." + czastota.substring(2,5) + "." + czastota.substring(5,8) + " Hz"); //linia kodu powyzej tworzy ciag znakow //o strukturze F=MM.KKK.HHH Hz }