1

Тема: AD9833

http://forum.rcl-radio.ru/uploads/images/2020/05/a2f09de60b47d0067090763bb12fdddb.png
http://forum.rcl-radio.ru/uploads/images/2020/05/6166bcfa11fdfc432b7cb5de0e4ec18b.png


#include <SPI.h>
#include <EEPROM.h> 
#include <LiquidCrystal_I2C.h> //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>  // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  Encoder myEnc(9, 8);//CLK, DT

float f=9.4;
long b,h_bit,l_bit,f_lcd,f_ust;
const long f25 = 25000985;
int a[9],i,form;
bool w=1,on;
long oldPosition  = -999,newPosition,times;


void setup() {
  Wire.begin();Serial.begin(9600);
  lcd.init();lcd.backlight();
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  lcd.setCursor(0,0);lcd.print("     AD9833   ");delay(3000);lcd.clear();// ЗАСТАВКА
  pinMode(7,INPUT); // sw
  pinMode(2,INPUT_PULLUP);// on/off out
  pinMode(3,INPUT_PULLUP);// dac,sin,tri
  pinMode(4,INPUT_PULLUP);// F = 0
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
  a[0] = EEPROM.read(0);a[1] = EEPROM.read(1);a[2] = EEPROM.read(2);a[3] = EEPROM.read(3);a[4] = EEPROM.read(4);a[5] = EEPROM.read(5);
  a[6] = EEPROM.read(6);a[7] = EEPROM.read(7);a[8] = EEPROM.read(8);form = EEPROM.read(9);
  ad();
}



void loop() {
   if(digitalRead(4)==LOW){a[0]=0;a[1]=0;a[2]=0;a[3]=0;a[4]=0;a[5]=0;a[6]=0;a[7]=0;a[8]=0;w=1;on=0;delay(300);}
   if(digitalRead(3)==LOW){form++;w=1;on=0;if(form>2){form=0;};delay(300);}
   if(digitalRead(7)==LOW){i++;w=1;on=0;if(i>8){i=0;};delay(300);}
   if(digitalRead(2)==LOW&&on==0){on=1;delay(300);w=1;}
   if(digitalRead(2)==LOW&&on==1){on=0;delay(300);w=1;}
   
   if(on==1){lcd.setCursor(0,1);lcd.print("OUT_ON ");i=100;}else{lcd.setCursor(0,1);lcd.print("OUT_OFF");}
   
   if (newPosition != oldPosition){oldPosition = newPosition;a[i]=a[i]+newPosition;if(a[i]>9){a[i]=9;}if(a[i]<0){a[i]=0;}myEnc.write(0);newPosition=0;} 
   if(a[0]>1){a[0]=1;}if(a[0]==1&&a[1]>2){a[1]=2;}if(a[0]==1&&a[1]==2&&a[2]>5){a[2]=5;}
 
  lcd.setCursor(0,0);lcd.print("F ");
  
if(i==0){if(millis()-times<500){lcd.print(a[0]);}if(millis()-times>=500){lcd.print(" ");}if(millis()-times>1000){times=millis();}}else{lcd.print(a[0]);}
if(i==1){if(millis()-times<500){lcd.print(a[1]);}if(millis()-times>=500){lcd.print(" ");}if(millis()-times>1000){times=millis();}}else{lcd.print(a[1]);}
lcd.print(".");
if(i==2){if(millis()-times<500){lcd.print(a[2]);}if(millis()-times>=500){lcd.print(" ");}if(millis()-times>1000){times=millis();}}else{lcd.print(a[2]);}
if(i==3){if(millis()-times<500){lcd.print(a[3]);}if(millis()-times>=500){lcd.print(" ");}if(millis()-times>1000){times=millis();}}else{lcd.print(a[3]);}
if(i==4){if(millis()-times<500){lcd.print(a[4]);}if(millis()-times>=500){lcd.print(" ");}if(millis()-times>1000){times=millis();}}else{lcd.print(a[4]);}
lcd.print(".");
if(i==5){if(millis()-times<500){lcd.print(a[5]);}if(millis()-times>=500){lcd.print(" ");}if(millis()-times>1000){times=millis();}}else{lcd.print(a[5]);}
if(i==6){if(millis()-times<500){lcd.print(a[6]);}if(millis()-times>=500){lcd.print(" ");}if(millis()-times>1000){times=millis();}}else{lcd.print(a[6]);}
if(i==7){if(millis()-times<500){lcd.print(a[7]);}if(millis()-times>=500){lcd.print(" ");}if(millis()-times>1000){times=millis();}}else{lcd.print(a[7]);}
lcd.print(",");
if(i==8){if(millis()-times<500){lcd.print(a[8]);}if(millis()-times>=500){lcd.print(" ");}if(millis()-times>1000){times=millis();}}else{lcd.print(a[8]);}
  
  f=a[0]*pow(10,7)+a[1]*pow(10,6)+a[2]*pow(10,5)+a[3]*pow(10,4)+a[4]*pow(10,3)+a[5]*pow(10,2)+a[6]*10+a[7]+float(a[8]*0.1);
  lcd.print("Hz");
  if(on==0){f=0;}
  
  if(w==1){ad(); 
  EEPROM.update(0, a[0]);EEPROM.update(1, a[1]);EEPROM.update(2, a[2]);EEPROM.update(3, a[3]);EEPROM.update(9, form);
  EEPROM.update(4, a[4]);EEPROM.update(5, a[5]);EEPROM.update(6, a[6]);EEPROM.update(7, a[7]);EEPROM.update(8, a[8]);
  lcd.setCursor(11,1);
  switch(form){
  case 0: lcd.print("DAC");WriteAD9833(0x2028);break;
  case 1: lcd.print("SIN");WriteAD9833(0x2000);break;
  case 2: lcd.print("TRI");WriteAD9833(0x2002);break;
  }
  w=0;}
  
 }// loop
 
void WriteAD9833(uint16_t Data){
  SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV2, MSBFIRST, SPI_MODE2));
  digitalWrite(SS, LOW);
  delayMicroseconds(1);
  SPI.transfer16(Data);
  digitalWrite(SS, HIGH);
  SPI.endTransaction();
}
void ad(){
  b = f*pow(2,28)/f25;
  if(b<16383){l_bit = b + 0x4000 ;h_bit = 0x4000;}
  else{h_bit = (b>>14) + 0x4000;l_bit = b - (h_bit<<14) + 0x4000;}
  SPI.begin();
  WriteAD9833(0x2100);// 0010 0001 0000 0000 - Reset + DB28
  WriteAD9833(l_bit); // 0100 0000 0000 0000 - Freq0 LSB 
  WriteAD9833(h_bit); // 0100 0000 0000 0000 - Freq0 MSB 
  WriteAD9833(0xC000);// 1100 0000 0000 0000 - Phase0 
  WriteAD9833(0x2000);// 0010 0000 0000 0000 - Exit Reset
  } 
void to_Timer(){newPosition = myEnc.read()/4;}
  

2

Re: AD9833

Добрый день. Я собрал генератор по предложенной вами схеме, залил скетч, но ничего не происходит. Дисплей светится и показывает только квадратики. При включении Arduino Nano V3.0 горит зеленый светодиод и моргает синий, через несколько секунд синий гаснет. Подскажите куда копать?

3

Re: AD9833

Проверьте подключение экрана, загрузите тестовый скетч:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
void setup()
{
  lcd.init();                     
  lcd.backlight();// Включаем подсветку дисплея
  lcd.print("  rcl-radio.ru  ");
  lcd.setCursor(0, 1);
  lcd.print("    LCD 1602    ");
  delay(5000);
  lcd.noBacklight();// Выключаем подсветку дисплея
  delay(5000);
  lcd.backlight();// Включаем подсветку дисплея
}
void loop(){}

4

Re: AD9833

Загрузил тестовый скетч. Результат тот же. Может быть дисплей бракованный или I2C модуль?

5

Re: AD9833

Загрузите i2c сканер, проверить адрес подключенного дисплея с i2c модулем - http://forum.rcl-radio.ru/viewtopic.php?id=64

6

Re: AD9833

http://forum.rcl-radio.ru/uploads/images/2020/07/0fbeb63fe2daf6446ef5c1ed0ccc87fe.jpg

http://forum.rcl-radio.ru/uploads/images/2020/07/cb3ec6e6bf723c2c86b8de3c5019d26d.png


#include <SPI.h>
#include <EEPROM.h> 
#include <iarduino_KB.h>  // https://github.com/tremaru/iarduino_KB.git
#include <LiquidCrystal_I2C.h> //Библиотека -  http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
  LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей 
  iarduino_KB KB(6,5,4,3,2,1,0); /// 6543 210
  
long b,h_bit,l_bit,f_lcd,f_ust;
const long f25 = 25000985;// частота кварца, если нет эталонного частотомера установите частоту 25000000 Гц
bool w=1,on;
long times,code[8],ccc;
int i,i1,form;
 
 
void setup() {
  Wire.begin();lcd.init();lcd.backlight(); KB.begin(KB3);
  pinMode(8,INPUT_PULLUP);   // форма сигнала
  lcd.setCursor(0,0);lcd.print("     AD9833   ");delay(3000);lcd.clear();// ЗАСТАВКА
  if(EEPROM.read(100)!=0){for(int i=0;i<101;i++){EEPROM.update(i,0);}}// очистка памяти при первом включении
  ad();
}
 
 
void loop() {
/////////////////// клавиатура + кнопка //////////////////////////////////////////////////////////////////////////////////////// 
  if(digitalRead(8)==LOW){form++;w=1;if(form>2){form=0;};delay(300);} 
  if(KB.check(KEY_DOWN )){
     
     if(KB.getNum==15){i=0;ccc=0;w=1;on=0;for(i1=0;i1<8;i1++){code[i]=0;}} // # стереть число
     if(KB.getNum==14&&on==0&&w==0){w=1;on=1;delay(200);} // * вкл.ген
     if(KB.getNum==14&&on==1&&w==0){w=1;on=0;delay(200);} // * откл.ген
     if(KB.getNum<10&&i<8){
      code[i] = KB.getNum; 
   switch(i){
     case 0: ccc = code[0];break;
     case 1: ccc = code[0]*10 + code[1];break;
     case 2: ccc = code[0]*100 + code[1]*10 + code[2];break;
     case 3: ccc = code[0]*1000 + code[1]*100 + code[2]*10 + code[3];break;
     case 4: ccc = code[0]*10000 + code[1]*1000 + code[2]*100 + code[3]*10 + code[4];break;
     case 5: ccc = code[0]*100000 + code[1]*10000 + code[2]*1000 + code[3]*100 + code[4]*10 + code[5];break;
     case 6: ccc = code[0]*1000000 + code[1]*100000 + code[2]*10000 + code[3]*1000 + code[4]*100 + code[5]*10 + code[6];break;
     case 7: ccc = code[0]*10000000 + code[1]*1000000 + code[2]*100000 + code[3]*10000 + code[4]*1000 + code[5]*100 + code[6]*10 + code[7];break;
    }i++; if(i>7){i=8;}delay(200);}
    }

///////////////// вывод на lcd ////////////////////////////////////////////////////////////
   lcd.setCursor(0,0);lcd.print("F ");lcd.print(ccc/10000000);lcd.print(ccc/1000000%10);lcd.print(".");lcd.print(ccc/100000%10);lcd.print(ccc/10000%10);
   lcd.print(ccc/1000%10);lcd.print(".");lcd.print(ccc/100%10);lcd.print(ccc/10%10);lcd.print(ccc%10);lcd.print(" Hz ");
   if(on==1){lcd.setCursor(0,1);lcd.print("OUT_ON ");i=100;}else{lcd.setCursor(0,1);lcd.print("OUT_OFF");}
 
  if(w==1){ad(); 
  lcd.setCursor(11,1);
  switch(form){ // форма сигн.
  case 0: lcd.print("DAC");WriteAD9833(0x2028);break;
  case 1: lcd.print("SIN");WriteAD9833(0x2000);break;
  case 2: lcd.print("TRI");WriteAD9833(0x2002);break;
  }
  w=0;}
 
 }// loop
 
void WriteAD9833(uint16_t Data){
  SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV2, MSBFIRST, SPI_MODE2));
  digitalWrite(SS, LOW);
  delayMicroseconds(1);
  SPI.transfer16(Data);
  digitalWrite(SS, HIGH);
  SPI.endTransaction();
}
void ad(){
  if(on==1){b = ccc*pow(2,28)/f25;}else{b=0;}
  if(b<16383){l_bit = b + 0x4000 ;h_bit = 0x4000;}
  else{h_bit = (b>>14) + 0x4000;l_bit = b - (h_bit<<14) + 0x4000;}
  SPI.begin();
  WriteAD9833(0x2100);// 0010 0001 0000 0000 - Reset + DB28
  WriteAD9833(l_bit); // 0100 0000 0000 0000 - Freq0 LSB 
  WriteAD9833(h_bit); // 0100 0000 0000 0000 - Freq0 MSB 
  WriteAD9833(0xC000);// 1100 0000 0000 0000 - Phase0 
  WriteAD9833(0x2000);// 0010 0000 0000 0000 - Exit Reset
  } 

7

Re: AD9833

Спасибо за помощь. Все получилось со сканером i2c. Ввел вручную адрес подключенного дисплея с i2c модулем и все заработало.

Re: AD9833

Привет.
А можно в прошивку добавить еще второй генератор нч до +-30 кгц меандр с шагом 1 гц , чтоб сама ардуинка генерировала сигнал (+ енкодер для 2 канала или матричную клавиатуру). Переделать проект в 2 канальний генератор для настройки трансивера например. На 1 канале (ad9833) оставить синусоиду только, если будет мало памяти. Спасибо

9

Re: AD9833

Arduino не сможет выдавать меандр с шагом 1 Гц

10

Re: AD9833

liman324 пишет:

Arduino не сможет выдавать меандр с шагом 1 Гц

видел, ардуинка работала от 32гц до 30 кгц, даже сам заливал скетч и работало. только как обьеденить тот скетч с вашим проектом?
еще один проект ,даю линк
https://www.youtube.com/watch?v=PdL-m0O … ctrozoneTV

11

Re: AD9833

Ровно шаг  1Гц на всем диапазоне вроде как не возможно получить, очень близко можно.

12

Re: AD9833

купил сегодня на али атмегу328pb, там есть уже 3 spi (reborn популярного avr). Буду ждать, может кто прикрутит две ad9833 на atmega328pb