Генераторы на AD9850
Да модифицировали.EgorKa пишет: А пробовали модифицировать этот проект www.ad7c.com ?
Вот шагает 1Гц. От 1Гц до 45МГц
Толику (tesla-nsk) спасибо за верные наводки !
/*
Main code by Richard Visokey AD7C - www.ad7c.com
Revision 2.0 - November 6th, 2013
Mining 17-08-2016г. Диапазон 1Гц-45МГц Но минимум почему то 2Гц надо разобраться.
Стартуем с 1,2МГц и шаг 1Гц
*/
// Include the library code
#include <LiquidCrystal.h>
#include <Rotary.h>
#include <EEPROM.h>
//Setup some items
// Установка DDS AD9850
#define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
#define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
#define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
#define RESET 11 // Pin 11 - connect to reset pin (RST)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
// Установка энкодера
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
// Установка дисплея
LiquidCrystal lcd(12, 13, 7, 6, 5, 4); //RS, E, DB4, DB5, DB6, DB7 . I used an odd pin combination because I need pin 2 and 3 for the interrupts.
// Рабочие переменные
int_fast32_t rx=1200000; // Starting frequency of VFO Стартует с частоты 1,2МГц при первом включении.
// int_fast32_t rx_round=0; // Я добавил , эта строка присутствует в проекте My_AD9850_LCD_ROTARY_WMENUS_v7.8_AUTO_I_1_45MHz
int_fast32_t rx2=1; // variable to hold the updated frequency
int_fast32_t increment = 1; // starting VFO update increment in HZ. Устанавливается шаг при старте в Гцах я изменил int_fast32_t increment = 1; Стал шагать 1Гц (перестало переключаться меню на другие шаги) У автора было так: int_fast32_t increment = 10;
int buttonstate = 0;
String hertz = "1 Hz"; // Выставляется шаг на дисплее при первом включении -появился 1Hz, что бы шагал 1Гц надо править строку и записать: int_fast32_t increment = 1; . У автора : String hertz = "10 Hz";
int hertzPosition = 5;
byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //Placeholders
String freq; // string to hold the frequency
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
int memstatus = 1; // value to notify if memory is current or old. 0=old, 1=current.
int ForceFreq = 1; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!
// Если установить 0 то при включении программа возьмет из памяти EEPROM последнее значение частоты, если 1 то стартует с частоты указанной 29 строке. Т.е. 1,2МГц
// Внимание, при первой прошивке и запуске значение в EEPROM нет, поэтому нужно выствить 1 прошить ардуино. Затем, если нужна память на последнюю частоту, выставить 0 в скетче и прошить ардуино снова.
void setup() {
pinMode(A0,INPUT); // Connect to a button that goes to GND on push
digitalWrite(A0,HIGH);
lcd.begin(16, 2);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
pinMode(FQ_UD, OUTPUT);
pinMode(W_CLK, OUTPUT);
pinMode(DATA, OUTPUT);
pinMode(RESET, OUTPUT);
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
lcd.setCursor(hertzPosition,1);
lcd.print(hertz);
// Load the stored frequency
if (ForceFreq == 0) {
freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
rx = freq.toInt();
}
}
void loop() {
if (rx != rx2){
showFreq();
sendFrequency(rx);
rx2 = rx;
}
buttonstate = digitalRead(A0);
if(buttonstate == LOW) {
setincrement();
};
// Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change.
if(memstatus == 0){
if(timepassed+2000 < millis()){
storeMEM();
}
}
}
// Ловушка прерывания при вращении энкодера
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) // Если начали вращать энкодер
{
// В зависимости от направления вращения "+" или "-" инкремент
if (result == DIR_CW){rx=rx+increment;}
else {rx=rx-increment;};
// if (rx >=45000000){rx=rx2;}; // UPPER VFO LIMIT Ограничение макс. частоты Я поставил 45000000 (45МГц)и изменил строку: У автора Было 30000000 (30МГц)и такая строчка if (rx >=30000000){rx=rx2;};.
if (rx >45000000){rx=rx2;}; // Ограничение макс. частоты
// if (rx <=1){rx=rx2;}; // LOWER VFO LIMIT Ограничение мин. частоты Я поставил 1 (1Гц) Было 1000000 (1МГц)
if (rx <1){rx=rx2;}; // Ограничение мин. частоты Я поставил 1 (1Гц)
} // Конец обработки вращения энкодера
} // Конец ловушки прерывания
// Расчет частоты для DDS
// frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
void sendFrequency(double frequency) {
int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850. You can make 'slight' tuning variations here by adjusting the clock frequency.
for (int b=0; b<4; b++, freq>>=8) { tfr_byte(freq & 0xFF); }
tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
pulseHigh(FQ_UD); // Done! Should see output
} // Конец расчета частоты
// Передача частоты в DDS
// transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
void tfr_byte(byte data)
{
for (int i=0; i<8; i++, data>>=1) {
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
}
}
void setincrement(){
if(increment == 1){increment = 50; hertz = "50 Hz"; hertzPosition=5;} // для шага 1Гц надо записать так: if(increment == 1){increment = 50; hertz = "50 Hz"; hertzPosition=5;} У автора : if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
else if (increment == 50){increment = 100; hertz = "100 Hz"; hertzPosition=4;}
else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
else{increment = 1; hertz = "1 Hz"; hertzPosition=5;}; //для шага 1Гц надо записать так: else{increment = 1; hertz = "1 Hz"; hertzPosition=5;}; У автора было так: else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(hertzPosition,1);
lcd.print(hertz);
delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed. С помощью этой задержки можно менять скорость изменения шага при нажатой кнопке
};
void showFreq(){ //Вывод частоты в верхнюю строку
millions = int(rx/1000000); //Показать колличество мегагерц на верхнюю строку
hundredthousands = ((rx/100000)%10);
tenthousands = ((rx/10000)%10);
thousands = ((rx/1000)%10);
hundreds = ((rx/100)%10);
tens = ((rx/10)%10);
ones = ((rx/1)%10);
lcd.setCursor(0,0);
lcd.print(" "); //Пустой символ перед частотой для выравнивания надписи в верхней строке
if (millions > 9){lcd.setCursor(1,0);}
else{lcd.setCursor(2,0);}
lcd.print(millions);
lcd.print(".");
lcd.print(hundredthousands);
lcd.print(tenthousands);
lcd.print(thousands);
lcd.print(".");
lcd.print(hundreds);
lcd.print(tens);
lcd.print(ones);
lcd.print(" Mhz "); //Вывод на дисплей Mhz после частоты в первой строке
timepassed = millis();
memstatus = 0; // Trigger memory write Сигнализируем об изменении частоты и потенциальной необходимости ее записи в постоянную память
};
void storeMEM(){
//Write each frequency section to a EPROM slot. Yes, it's cheating but it works! //Записываем частоту в постоянную память (EEPROM) поразрядно (это коряво, но работает)
EEPROM.write(0,millions);
EEPROM.write(1,hundredthousands);
EEPROM.write(2,tenthousands);
EEPROM.write(3,thousands);
EEPROM.write(4,hundreds);
EEPROM.write(5,tens);
EEPROM.write(6,ones);
memstatus = 1; // Let program know memory has been written Сигнализируем программе, что последние изменения частоты записаны в постоянную память (EEPROM)
};
Если хочешь что бы стартовал (запомнил) последнюю частоту которую ты установил то выполнить надо такие танцы с бубном
// Если установить 0 то при включении программа возьмет из памяти EEPROM последнее значение частоты, если 1 то стартует с частоты указанной 29 строке. т.е. 1,2МГц
// Внимание, при первой прошивке и запуске значение в EEPROM нет, поэтому нужно выствить 1 прошить ардуино. Затем, если нужна память на последнюю частоту, выставить 0 в скетче и прошить ардуино снова.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Спасибо! Собрал на макетке работает. Последние установки частоты запоминает и выводит при последующем выкл/вкл.Ivan_Kornege пишет:
Да модифицировали.EgorKa пишет: А пробовали модифицировать этот проект www.ad7c.com ?
Вот шагает 1Гц. От 1Гц до 45МГц
Толику (tesla-nsk) спасибо за верные наводки !
Если хочешь что бы стартовал (запомнил) последнюю частоту которую ты установил то выполнить надо такие танцы с бубном
// Если установить 0 то при включении программа возьмет из памяти EEPROM последнее значение частоты, если 1 то стартует с частоты указанной 29 строке. т.е. 1,2МГц
// Внимание, при первой прошивке и запуске значение в EEPROM нет, поэтому нужно выствить 1 прошить ардуино. Затем, если нужна память на последнюю частоту, выставить 0 в скетче и прошить ардуино снова.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Надо модифицировать скетч что бы шагал как заявлено в даташите , с точностью 0.0291 Hz. Мож до зимы слояем.EgorKa пишет:
Спасибо! Собрал на макетке работает. Последние установки частоты запоминает и выводит при последующем выкл/вкл.Ivan_Kornege пишет:
Да модифицировали.EgorKa пишет: А пробовали модифицировать этот проект www.ad7c.com ?
Вот шагает 1Гц. От 1Гц до 45МГц
Толику (tesla-nsk) спасибо за верные наводки !
Если хочешь что бы стартовал (запомнил) последнюю частоту которую ты установил то выполнить надо такие танцы с бубном
// Если установить 0 то при включении программа возьмет из памяти EEPROM последнее значение частоты, если 1 то стартует с частоты указанной 29 строке. т.е. 1,2МГц
// Внимание, при первой прошивке и запуске значение в EEPROM нет, поэтому нужно выствить 1 прошить ардуино. Затем, если нужна память на последнюю частоту, выставить 0 в скетче и прошить ардуино снова.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
В моей установке гармоники ВЧ сигнала некритичны, критична только стабильная частота, которую AD9850 вполне обеспечивает. Что касается согласования сопротивлений, то как то согласовал. Дальнейшая работа покажет достаточно ли такого согласования или нужно будет переделать. Схему выкладывал у себя на ветке, можете посмотреть.
Сейчас занимаюсь полной переделкой инвертора, так как гальваическая развязка на ферритовых трансформаторах с синусом работает плохо. Делаю на оптодрайверах. Схему выложу позже, пока она уточняется.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
tak пишет: вопрос ua4yhz...нужна оптопара(оптоизолятор,оптодрайвер) взамен 6N137 с частотными характеристиками такими же или лучше, но с повышенной изоляцией...
Чтоб с частотными хар. лучше - это надо что то такое :
media.digikey.com/pdf/Data%20Sheets/Sili.../Si8440,41,42,45.pdf
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
HCPL2630, вроде, в одном даташите даже с 6N137 сидят...ua4yhz пишет:
У меня из высокоскоростных оптронов есть в наличии только HCPL2630 у них на 500в изоляция получше будет,это практически полный аналог 6N137.tak пишет: вопрос ua4yhz...нужна оптопара(оптоизолятор,оптодрайвер) взамен 6N137 с частотными характеристиками такими же или лучше, но с повышенной изоляцией...
Вложение не найдено
lib.chipdip.ru/158/DOC000158150.pdf
хотелось бы найти с изоляцией раза в два больше чем 6N137...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
самая большая заморочка, как оказалось, найти аналог 6N137 с изоляцией до 10kV....with пишет:
tak пишет: вопрос ua4yhz...нужна оптопара(оптоизолятор,оптодрайвер) взамен 6N137 с частотными характеристиками такими же или лучше, но с повышенной изоляцией...
Чтоб с частотными хар. лучше - это надо что то такое :
media.digikey.com/pdf/Data%20Sheets/Sili.../Si8440,41,42,45.pdf
пока, из доступного, не нашел ничего...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Если обязательно нужна именно опторазвязка - тогда можно включить две оптики последовательно .. там самым поднять общее развязывающее напряжение ... правда это будет дороже ..tak пишет:
самая большая заморочка, как оказалось, найти аналог 6N137 с изоляцией до 10kV....with пишет:
tak пишет: вопрос ua4yhz...нужна оптопара(оптоизолятор,оптодрайвер) взамен 6N137 с частотными характеристиками такими же или лучше, но с повышенной изоляцией...
Чтоб с частотными хар. лучше - это надо что то такое :
media.digikey.com/pdf/Data%20Sheets/Sili.../Si8440,41,42,45.pdf
пока, из доступного, не нашел ничего...
10КВ это серьезно.
На такое напряжение я применял трансы вот такие
Делал на них гальваноразвязку для кнопки сварочной ТИГ горелки, в которой применялся сварочный осциллятор.
Правда трансик работал работал всего на 50 КГц .. но на мегагерцах будет работать даже лучше, у этих сердечников проницаемость большая, только пересчитать и перемотать.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Но вот так у нас оно работало .. напряжение как раз около 10К в момент срабатывания осциллятора
А вообще по хорошему можно и родной каркасик оставить и на нем мотать уже своё.
Я просто это к тому что сердечники такие - неплохой бюджетный вариант для сигнальных развязывающих цепей.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.