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

}

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

szesnaście − dziesięć =