Генераторы на AD9850
ТРАНСИКИ УЖЕ ДАВНО РАБОТАЮТ ДО 10KV...все ок...with пишет:
Если обязательно нужна именно опторазвязка - тогда можно включить две оптики последовательно .. там самым поднять общее развязывающее напряжение ... правда это будет дороже ..tak пишет:
самая большая заморочка, как оказалось, найти аналог 6N137 с изоляцией до 10kV....with пишет:
tak пишет: вопрос ua4yhz...нужна оптопара(оптоизолятор,оптодрайвер) взамен 6N137 с частотными характеристиками такими же или лучше, но с повышенной изоляцией...
Чтоб с частотными хар. лучше - это надо что то такое :
media.digikey.com/pdf/Data%20Sheets/Sili.../Si8440,41,42,45.pdf
пока, из доступного, не нашел ничего...
10КВ это серьезно.
На такое напряжение я применял трансы вот такие
Делал на них гальваноразвязку для кнопки сварочной ТИГ горелки, в которой применялся сварочный осциллятор.
Правда трансик работал работал всего на 50 КГц .. но на мегагерцах будет работать даже лучше, у этих сердечников проницаемость большая, только пересчитать и перемотать.
возникла необходимость именно опто....вообщем пока будем ставить последовательно...
всем спасибо за ответы...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
2-а диаппазона:
1-й 1,0 Hz - 1000,0 kHz
2-й 1000,0 - 40000,0 kHz
Шаг регулировки частоты:
0 = 1,0000 kHz
1 = 0,1000 kHz
2 = 0,0100 kHz
3 = 0,0010 kHz
4 = 0,0001 kHz
Для управления частотой генератора используется энкодер типа Rotary Encoder KY-040
Скетч под спойлером
/* http://arduino.ru/forum/proekty/dds-generator-na-arduino-ad9850#comment-225334
Генератор частоты на Arduino (Atmega328, 16MHz) + AD9850 с выводом информации на дисплей Nokia 5110
2-а диаппазона:
1-й 1,0 Hz - 1000,0 kHz
2-й 1000,0 - 40000,0 kHz
Шаг регулировки частоты:
0 = 1,0000 kHz
1 = 0,1000 kHz
2 = 0,0100 kHz
3 = 0,0010 kHz
4 = 0,0001 kHz
Для управления частотой генератора используется энкодер типа Rotary Encoder KY-040 с подтягтвающими резисторами 10 кОм установленными на плате энкодера.
Паралельно вывходам энкодера,для устранения дребезга, на ножки котроллера 2,12,3 установить неполярные конденсаторы 10пФ.
Вывод информации на ЖК дисплей Nokia 5110
За основу взят скетч Автор seawar <a href="http://cxem.net/cb/1-110.php" rel="nofollow">http://cxem.net/cb/1-110.php</a>
Скетч для ардуино на мк atmega328 (UNO,Nano, MiniPro 16MHz) переаботан для генартора, скомпилирован Arduino 1.6.8, протестирован на Arduino nano (Atmega328, 16MHz).
AVG 08-10-2016
*/
// подключаем для Nokia 5110 библиотеку LCD5110_SSVS качаем отсюда <a href="https://github.com/ssvs111/ARDUINO-LCD-NOKIA5110-SSVS-RUS" rel="nofollow">https://github.com/ssvs111/ARDUINO-LCD-NOKIA5110-SSVS-RUS</a> , содержит русский шрифт, инструкция для библиотеки на русском.
#include <LCD5110_SSVS.h> // Бибилиотека для подключения Nokia 5110 по ЧЕТЫРЕМ контактам к котроллеру. пример: 0→CLK,1→DIN,14→DC,5→RST, остальные GND→минус(общий провод), LIGHT→подсветка(можно не подлючать если не нужна),VCC→ +3,3V, CE→ минус(общий провод)
extern uint8_t SmallFont[]; // Размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч
extern uint8_t MediumNumbers[]; // Размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч
extern uint8_t RusFont[]; // Подключаем русский шрифт //размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч
LCD5110 lcd(4, 5, 6, 7); // Объявляем контакты на Ардуино для подключения Nokia 5110 4→CLK,5→DIN,6→DC,7→RST
//lcd.setContrast(60); // Контрастность в % дисплея Nokia 5110. Если закомментировать, то по умолчанию будет 70%
#define pin_A 2 // Контакт 2 для подключения энкодера - поворот энкодера
#define pin_B 12 // Контакт 12 для подключения энкодера - направление вращения энкодера
#define pin_sw 3 // Контакт 3 для подключения кнопки энкодера
#define RESET 8 // Контакт 8 - вход сброса модуля AD9850 (RST)
#define FQ_UD 9 // Контакт 9 - вход обновления частоты модуля AD9850 (FQ)
#define W_CLK 10 // Контакт 10 - стробирующий вход модуля AD9850 (CLK)
#define DATA 11 // Контакт 11 - вход последовательных данных модуля AD9850 (D7)
#define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
#define band_select 13 // Контакт 13 - подключаем кнопку переключателя диапазонов, второй контакт кнопки на общий провод.
#define bands_number 2 // Количество диапазонов 2 .
const float band[bands_number*2] =
{
0.001, 1000.0, // Частота диапазона №2 переключается с диапазона №1 когда кнопка нажата - подаем землю "-" на 13 контакт (светодиод на ардуине потухнет).
1000.0, 40000.0 // Частота диапазона №1 от 1000.0 до 40000.0 кГц запускается при включении ардуино.
};
byte current_band; // номер текущего диапазона
//double Frequency; // частота генератора , закомментировал что то не нравятся мне даблы
float Frequency; // частота генератора , что то не нравятся мне даблы поэтому float
float change_step = 1.0; // устанавливаем шаг изменения частоты генератора - 1.0 кГц
byte tuning_flag = 0;
volatile byte flag_interrupt_turn = 0;
volatile byte flag_interrupt_button = 0;
void setup()
{
pinMode(pin_A, INPUT); // для чтения с выхода А энкодера
//digitalWrite(pin_A, HIGH); // включаем подтягивающий резистор, если его нет на энкодере
pinMode(pin_B, INPUT); // для чтения с выхода В энкодера
//digitalWrite(pin_B, HIGH); // включаем подтягивающий резистор, если его нет на энкодере
pinMode(pin_sw, INPUT); // для чтения с кнопки энкодера
//digitalWrite(pin_sw, HIGH); // включаем подтягивающий резистор, если его нет на кнопке SW энкодера
pinMode(FQ_UD, OUTPUT); // для выдачи на модуль AD9850
pinMode(W_CLK, OUTPUT); // для выдачи на модуль AD9850
pinMode(DATA, OUTPUT); // для выдачи на модуль AD9850
pinMode(RESET, OUTPUT); // для выдачи на модуль AD9850
pinMode(band_select, INPUT); // для чтения с переключателя диапазонов
digitalWrite(band_select, HIGH); // включаем подтягивающий резистор для кнопки переключения диапазонов
pulseHigh(RESET);
pulseHigh(W_CLK);
pulseHigh(FQ_UD); // разрешение последовательного режима AD9850
// ***************************************************************************************************************
//Делаем заставку и выводим на Nokia 5110 при старте. Экран с разрешением 84х48 пикселей мы можем выводить шрифт SmallFont до 6 строк по 14 символов. высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,24,32,40
lcd.InitLCD(); // инициализация дисплея Nokia 5110
lcd.clrScr(); // очищаем весь дисплей Nokia 5110
//Вывод первой строчки, высота стандартного шрифта 8 точек, поэтому строки текста должны идти с интервалами через 8 точек: 0 -1я строка, 8 -2-я строка, 16 -3я строка, 24 -4я строка, 32 -5я строка, 40 -6я строка
// lcd.setFont(SmallFont); //устанавливам шрифт мелкий
lcd.setFont(RusFont); //устанавливам русский шрифт RusFont
lcd.print("UTYTHFNJH", CENTER, 0); // слово "ГЕНЕРАТОР" печатаем англиским шрифтом клавиатуру на EN. Выводим в первой строке дисплея по центу.
//Вывод второй строчки
lcd.setFont(SmallFont); //устанавливам шрифт мелкий
lcd.print("Arduino 328", CENTER, 8); //выводим в 8-й строке дисплея по центу.
//Вывод третьей строчки
lcd.print("+", CENTER, 16); //выводим в 16-й строке дисплея по центу. Если пишем LEFT -слева
//Вывод четвертой строчки
lcd.print("AD9850", CENTER, 24); //выводим в 24-й строке дисплея по центу.
//Вывод пятой строчки
lcd.setFont(RusFont); //устанавливам русский шрифт RusFont
lcd.print("1Uw - 1000 rUw",CENTER, 32); //выводим 1Гц-1000кГц в 32-й строке дисплея по центру
//Вывод шестой строчки
lcd.print("VUw", 66, 40); //выводим МГц в 40-й строке дисплея начиная с 58-й точки дисплея . Отступил 58 точек -эксперементально определил. ширина символа 6точек*9символа =54
lcd.setFont(SmallFont);
lcd.print("1,0 - 2,0", 0, 40); //выводим в 40-й строке дисплея начиная с 3-го символа. ширина символа 6точек*2символа =12
delay(3000); // 3000 миллисекунд показываем текст указанный выше при старте.
// Закончили вывод заставки при старте Ардуино.
// *************************************************************************************************
current_band = digitalRead(band_select);
Frequency = band[current_band*2]; // Задаем частоту диапазона N1 при первом включении Ардуино. было: Frequency = band[current_band*2] + (band[current_band*2+1]-band[current_band*2])/2;// середина текущего диапазона
sendFrequency(Frequency*1000); // Начальная установка частоты AD9850 в Гц
lcd_print_frequency(); // Инициализация lcd_print_frequency .
attachInterrupt(0, enc_turn, FALLING); // Выход А энкодера подключен к пин 2 (int 0). Ожидаем срез импульса
attachInterrupt(1, enc_button, FALLING); // Выход кнопки энкодера подключен к пин 3 (int 1). Ожидаем срез импульса
}
void loop()
{
if(flag_interrupt_turn)
check_flag_turn();
if(flag_interrupt_button)
check_flag_button();
if (current_band != digitalRead(band_select)) // Если переключился диапазон
{
delay(3);
current_band = digitalRead(band_select);
Frequency = band[current_band*2]; // устанавливаем начальную частоту текущего диапазона. можно поставить середину если записать так: Frequency = band[current_band*2] + (band[current_band*2+1]-band[current_band*2])/2;// середина текущего диапазона
sendFrequency(Frequency*1000); // установка частоты AD9850 в Гц
lcd_print_frequency(); // выводим частоту на дисплей
}
}
void enc_turn() // обработчик прерываний от вращения энкодера
{
noInterrupts(); // запрет прерываний во избежание дребезга
flag_interrupt_turn = 1;
return;
}
void enc_button() // обработчик прерываний от кнопки энкодера
{
noInterrupts(); // запрет прерываний во избежание дребезга
flag_interrupt_button = 1;
return;
}
void check_flag_turn() // проверка флага вращения энкодера
{
delay(2); // задержка перед обработкой прерывания для избежания дребезга
if(digitalRead(pin_A)) // если выход А высокий, значит прерывание ложное
{
flag_interrupt_turn = 0;
interrupts(); // разрешение прерываний
return;
}
current_band = digitalRead(band_select); // считываем текущий диапазон
if(digitalRead(pin_B))
{
// выход В в сост. 1, значит, вращение по часовой стрелке, увеличиваем не более чем до верхней границы диапазона
if(Frequency + change_step <= band[current_band*2+1]) Frequency += change_step;
else Frequency = band[current_band*2+1] ;
}
else
{
// выход В в 0 сост., значит, вращение против часовой стрелки ,уменьшаем, но не ниже нижней границы диапазона
if(Frequency - change_step >= band[current_band*2]) Frequency -= change_step;
else Frequency = band[current_band*2] ;
}
sendFrequency(Frequency*1000); // Установка новой частоты AD9850
lcd_print_frequency();
flag_interrupt_turn = 0;
interrupts(); // разрешение прерываний
return;
}
void check_flag_button() // проверка флага кнопки энкодера
{
delay(2); // задержка перед обработкой прерывания для избежания дребезга
if(digitalRead(pin_sw)) // если выход кнопки высокий, значит прерывание ложное
{
flag_interrupt_button = 0;
interrupts(); // разрешение прерываний
return;
}
// **** переключение диапазонов точной настройки кнопкой энкодера.
if (++tuning_flag > 4)
tuning_flag = 0;
switch(tuning_flag)
{
case 0: // Режим 0
change_step = 1.0; // Шаг настройки 1,0кГц
break;
case 1: // Режим 1
change_step = 0.1; // Шаг настройки 100,0Гц
break;
case 2: // Режим 2
change_step = 0.01; // Шаг настройки 10,0Гц
break;
case 3: // Режим 3
change_step = 0.001; // Шаг настройки 1,0Гц
break;
case 4: // Режим 4
change_step = 0.0001; // Шаг настройки 0,1Гц
break;
}
// ***** Выводим информацию показания точной настройки на дисплей Nokia 5110. Экран с разрешением 84х48 пикселей мы можем выводить шрифтом SmallFont Размер символов: 6x8 точек, до 6 строк по 14 символов
//lcd.clrScr(); //очищаем дисплей Nokia 5110
//или
//clrRow(8, [start], [40]) //очистка выбранной строки номер row, от позиции start до end;
//Вывод во втророй строчке, первая занята под вывод частоты генератора. Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40
lcd.setFont(RusFont); // Применить русский шрифт RusFont для нижеследующей информации.
lcd.print("Ifu",LEFT,8 ); // Выводим слово "Шаг" в 8-й строке дисплея начиная с лева
lcd.print("rUw", RIGHT, 8); // Обозначение индикации режима точной настройки в кГц выводим в 8-й строке дисплея равнение с права.
lcd.setFont(SmallFont); // Применить шрифт -млкий.
lcd.printNumF( ((float)change_step),4 ,18, 8); //индикация режима точной настройки выводим 4-е знака после запятой в 8-й строке дисплея начиная с 4-го символа. ширина символа 6точек*3символа =18
//Вывод третьей строчки
lcd.printNumI(tuning_flag, LEFT, 16); // Индикация режима номер шага от 0 до 4 точной настройки выводим в 16-й строке дисплея начиная слева
lcd.print("*************", 6, 16); // Украшательства
// Украшательства, заполняем пустые строчки Nokia 5110
//Вывод четвёртой строчки
lcd.setFont(RusFont); //устанавливам русский шрифт RusFont
lcd.print("UTYTHFNJH", CENTER, 24 ); // слово "ГЕНЕРАТОР" печатаем переключив клавиатуру на EN. Выводим в 24 строке дисплея по центу.
//Вывод пятой строчки
lcd.print("1Uw - 1000 rUw",CENTER, 32); //выводим диапазон 1Гц-1000кГц в 32-й строке дисплея по центру
//Вывод шестой строчки
lcd.print("VUw", 66, 40); // Выводим МГц в 40-й строке дисплея начиная с 10-го . ширина символа 6точек*9символа =54 точно получилось 58 точек
lcd.setFont(SmallFont); // Применить шрифт -млкий.
lcd.print("1,0 - 2,00", 0, 40); // Выводим в 40-й строке дисплея начиная с 3-го символа. ширина символа 6точек*2символа =12
// закончили украшательства
flag_interrupt_button = 0;
interrupts(); // Разрешение прерываний
return;
}
// *******************************************************
void lcd_print_frequency() // Вывод частоты генератора на Nokia 5110
{
lcd.clrScr(); // Очищаем экран Nokia 5110;
//lcd.clrRow(row, [start], [end]); // Очистка выбранной строки номер row, от позиции start до end;
//Вывод в первой строчке Nokia 5110, Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40
lcd.setFont(SmallFont); // Применить шрифт, ширина символа 6точек, для вывода на Nokia 5110 нижеледующей информации.
lcd.printNumF(Frequency,4 ,LEFT, 0); // Частота сигнала 4-е знака после запятой выводим в первой строке начиная слева. //printNumF(num, dec, x, y, [divider], [length], [filler]); //вывести число с плавающей запятой; dec – число знаков после запятой; divider – знак десятичного разделителя, по умолчанию точка ".";
lcd.setFont(RusFont); // Применить русский шрифт RusFont для нижеследующей информации.
lcd.print("rUw", RIGHT, 0); // Индикация измерения частоты в кГц выводим в 1-й строке дисплея равнение справа.
// подключаем вывод точной настройки и номера режима точной настройки на Nokia 5110
//Вывод во втророй строчке, первая занята под вывод частоты генератора. Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40
lcd.print("Ifu",LEFT,8 ); // Выводим слово Шаг в 8-й строке дисплея начиная с лева
lcd.print("rUw", RIGHT, 8); // Обозначение индикации режима точной настройки в кГц выводим в 8-й строке дисплея равнение с права.
lcd.setFont(SmallFont); // Выставляем шрифт -млкий.
lcd.printNumF( ((float)change_step),4 ,18, 8); // Индикация режима точной настройки 4-е знака после запятой выводим в 8-й строке дисплея начиная с 18-го символа. ширина символа 6точек*3символа =18
//Вывод третьей строчки
lcd.printNumI(tuning_flag, LEFT, 16); // Индикация номера от 0 до 4 точной настройки выводим в 16-й строке дисплея начиная слева
lcd.print("*************", 6, 16); // Украшательства
// Украшательства
//Вывод четвёртой строчки
lcd.setFont(RusFont); // Устанавливам русский шрифт RusFont
lcd.print("UTYTHFNJH", CENTER, 24 ); // Слово "ГЕНЕРАТОР" печатаем переключив клавиатуру на EN. Выводим в 24 строке дисплея по центу.
//Вывод пятой строчки
lcd.print("1Uw - 1000 rUw",CENTER, 32); // Выводим 1Гц-1000 кГц в 32-й строке дисплея по центру
//Вывод шестой строчки
lcd.print("VUw", 66, 40); // Выводим МГц в 40-й строке дисплея начиная с 60-й точки/ подобрал визуально . ширина символа 6точек*9символа =54
lcd.setFont(SmallFont);
lcd.print("1,0 - 2,00", 0, 40); // Выводим в 40-й строке дисплея начиная с 12-го символа. ширина символа 6точек*2символа =12
// Закончили украшательства
}
// **************************AD9850*****************************************************
void tfr_byte(byte data)// последовательная передача байта в модуль AD9850 на вход DATA
{
for (int i=0; i<8; i++, data>>=1)
{
digitalWrite(DATA, data & 0x01);
pulseHigh(W_CLK); //строб каждого бита
}
}
void sendFrequency(float frequency)// расчет и передача управляющего 32 битного числа "frequency tuning word"
//для задания частоты: frequency = <sys clock> * <frequency tuning word>/2^32
{
//unsigned long freq = frequency * 4294967295/125000000; // расчет числа. частота домножается на 4294967295 / 125000000 = 34.35973836 и 34.35973836^-1 = 0.02910383 или 1/34.35973836 = 0.02910383
int32_t freq = frequency * 0.99999890 * 4294967295/125000000; // мой модуль AD9850 расчет числа, поправка для конкретного экземпляра платы
//unsigned long freq = frequency * 1.00000965 * 4294967295/125000000; // расчет числа, 1.00000965 - поправка для конкретного экземпляра платы
//int32_t freq = frequency * 4294967296/180000000; // Для тактовой 180 МГц на AD9851. Можно слегка поиграться значением для более точной настройки.
for (int b=0; b<4; b++, freq>>=8)
{
tfr_byte(freq & 0xFF); //передача числа в AD9850
}
tfr_byte(0x000); // завершающий байт, все 0 для AD9850
// tfr_byte(0x001); // Завершающий байт последовательности, 1 для AD9851
pulseHigh(FQ_UD); // строб новой частоты
}
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Ivan, схему подключения можно, что бы не разбираться в коде?!Ivan_Kornege пишет: Генератор частоты на Arduino (Atmega328, 16MHz) + AD9850 с выводом информации на дисплей Nokia 5110
2-а диаппазона:
1-й 1,0 Hz - 1000,0 kHz
2-й 1000,0 - 40000,0 kHz
Шаг регулировки частоты:
0 = 1,0000 kHz
1 = 0,1000 kHz
2 = 0,0100 kHz
3 = 0,0010 kHz
4 = 0,0001 kHz
Для управления частотой генератора используется энкодер типа Rotary Encoder KY-040
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ] [ Нажмите, чтобы скрыть ]/* http://arduino.ru/forum/proekty/dds-generator-na-arduino-ad9850#comment-225334 Генератор частоты на Arduino (Atmega328, 16MHz) + AD9850 с выводом информации на дисплей Nokia 5110 2-а диаппазона: 1-й 1,0 Hz - 1000,0 kHz 2-й 1000,0 - 40000,0 kHz Шаг регулировки частоты: 0 = 1,0000 kHz 1 = 0,1000 kHz 2 = 0,0100 kHz 3 = 0,0010 kHz 4 = 0,0001 kHz Для управления частотой генератора используется энкодер типа Rotary Encoder KY-040 с подтягтвающими резисторами 10 кОм установленными на плате энкодера. Паралельно вывходам энкодера,для устранения дребезга, на ножки котроллера 2,12,3 установить неполярные конденсаторы 10пФ. Вывод информации на ЖК дисплей Nokia 5110 За основу взят скетч Автор seawar <a href="http://cxem.net/cb/1-110.php" rel="nofollow">http://cxem.net/cb/1-110.php</a> Скетч для ардуино на мк atmega328 (UNO,Nano, MiniPro 16MHz) переаботан для генартора, скомпилирован Arduino 1.6.8, протестирован на Arduino nano (Atmega328, 16MHz). AVG 08-10-2016 */ // подключаем для Nokia 5110 библиотеку LCD5110_SSVS качаем отсюда <a href="https://github.com/ssvs111/ARDUINO-LCD-NOKIA5110-SSVS-RUS" rel="nofollow">https://github.com/ssvs111/ARDUINO-LCD-NOKIA5110-SSVS-RUS</a> , содержит русский шрифт, инструкция для библиотеки на русском. #include <LCD5110_SSVS.h> // Бибилиотека для подключения Nokia 5110 по ЧЕТЫРЕМ контактам к котроллеру. пример: 0→CLK,1→DIN,14→DC,5→RST, остальные GND→минус(общий провод), LIGHT→подсветка(можно не подлючать если не нужна),VCC→ +3,3V, CE→ минус(общий провод) extern uint8_t SmallFont[]; // Размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч extern uint8_t MediumNumbers[]; // Размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч extern uint8_t RusFont[]; // Подключаем русский шрифт //размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч LCD5110 lcd(4, 5, 6, 7); // Объявляем контакты на Ардуино для подключения Nokia 5110 4→CLK,5→DIN,6→DC,7→RST //lcd.setContrast(60); // Контрастность в % дисплея Nokia 5110. Если закомментировать, то по умолчанию будет 70% #define pin_A 2 // Контакт 2 для подключения энкодера - поворот энкодера #define pin_B 12 // Контакт 12 для подключения энкодера - направление вращения энкодера #define pin_sw 3 // Контакт 3 для подключения кнопки энкодера #define RESET 8 // Контакт 8 - вход сброса модуля AD9850 (RST) #define FQ_UD 9 // Контакт 9 - вход обновления частоты модуля AD9850 (FQ) #define W_CLK 10 // Контакт 10 - стробирующий вход модуля AD9850 (CLK) #define DATA 11 // Контакт 11 - вход последовательных данных модуля AD9850 (D7) #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } #define band_select 13 // Контакт 13 - подключаем кнопку переключателя диапазонов, второй контакт кнопки на общий провод. #define bands_number 2 // Количество диапазонов 2 . const float band[bands_number*2] = { 0.001, 1000.0, // Частота диапазона №2 переключается с диапазона №1 когда кнопка нажата - подаем землю "-" на 13 контакт (светодиод на ардуине потухнет). 1000.0, 40000.0 // Частота диапазона №1 от 1000.0 до 40000.0 кГц запускается при включении ардуино. }; byte current_band; // номер текущего диапазона //double Frequency; // частота генератора , закомментировал что то не нравятся мне даблы float Frequency; // частота генератора , что то не нравятся мне даблы поэтому float float change_step = 1.0; // устанавливаем шаг изменения частоты генератора - 1.0 кГц byte tuning_flag = 0; volatile byte flag_interrupt_turn = 0; volatile byte flag_interrupt_button = 0; void setup() { pinMode(pin_A, INPUT); // для чтения с выхода А энкодера //digitalWrite(pin_A, HIGH); // включаем подтягивающий резистор, если его нет на энкодере pinMode(pin_B, INPUT); // для чтения с выхода В энкодера //digitalWrite(pin_B, HIGH); // включаем подтягивающий резистор, если его нет на энкодере pinMode(pin_sw, INPUT); // для чтения с кнопки энкодера //digitalWrite(pin_sw, HIGH); // включаем подтягивающий резистор, если его нет на кнопке SW энкодера pinMode(FQ_UD, OUTPUT); // для выдачи на модуль AD9850 pinMode(W_CLK, OUTPUT); // для выдачи на модуль AD9850 pinMode(DATA, OUTPUT); // для выдачи на модуль AD9850 pinMode(RESET, OUTPUT); // для выдачи на модуль AD9850 pinMode(band_select, INPUT); // для чтения с переключателя диапазонов digitalWrite(band_select, HIGH); // включаем подтягивающий резистор для кнопки переключения диапазонов pulseHigh(RESET); pulseHigh(W_CLK); pulseHigh(FQ_UD); // разрешение последовательного режима AD9850 // *************************************************************************************************************** //Делаем заставку и выводим на Nokia 5110 при старте. Экран с разрешением 84х48 пикселей мы можем выводить шрифт SmallFont до 6 строк по 14 символов. высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,24,32,40 lcd.InitLCD(); // инициализация дисплея Nokia 5110 lcd.clrScr(); // очищаем весь дисплей Nokia 5110 //Вывод первой строчки, высота стандартного шрифта 8 точек, поэтому строки текста должны идти с интервалами через 8 точек: 0 -1я строка, 8 -2-я строка, 16 -3я строка, 24 -4я строка, 32 -5я строка, 40 -6я строка // lcd.setFont(SmallFont); //устанавливам шрифт мелкий lcd.setFont(RusFont); //устанавливам русский шрифт RusFont lcd.print("UTYTHFNJH", CENTER, 0); // слово "ГЕНЕРАТОР" печатаем англиским шрифтом клавиатуру на EN. Выводим в первой строке дисплея по центу. //Вывод второй строчки lcd.setFont(SmallFont); //устанавливам шрифт мелкий lcd.print("Arduino 328", CENTER, 8); //выводим в 8-й строке дисплея по центу. //Вывод третьей строчки lcd.print("+", CENTER, 16); //выводим в 16-й строке дисплея по центу. Если пишем LEFT -слева //Вывод четвертой строчки lcd.print("AD9850", CENTER, 24); //выводим в 24-й строке дисплея по центу. //Вывод пятой строчки lcd.setFont(RusFont); //устанавливам русский шрифт RusFont lcd.print("1Uw - 1000 rUw",CENTER, 32); //выводим 1Гц-1000кГц в 32-й строке дисплея по центру //Вывод шестой строчки lcd.print("VUw", 66, 40); //выводим МГц в 40-й строке дисплея начиная с 58-й точки дисплея . Отступил 58 точек -эксперементально определил. ширина символа 6точек*9символа =54 lcd.setFont(SmallFont); lcd.print("1,0 - 2,0", 0, 40); //выводим в 40-й строке дисплея начиная с 3-го символа. ширина символа 6точек*2символа =12 delay(3000); // 3000 миллисекунд показываем текст указанный выше при старте. // Закончили вывод заставки при старте Ардуино. // ************************************************************************************************* current_band = digitalRead(band_select); Frequency = band[current_band*2]; // Задаем частоту диапазона N1 при первом включении Ардуино. было: Frequency = band[current_band*2] + (band[current_band*2+1]-band[current_band*2])/2;// середина текущего диапазона sendFrequency(Frequency*1000); // Начальная установка частоты AD9850 в Гц lcd_print_frequency(); // Инициализация lcd_print_frequency . attachInterrupt(0, enc_turn, FALLING); // Выход А энкодера подключен к пин 2 (int 0). Ожидаем срез импульса attachInterrupt(1, enc_button, FALLING); // Выход кнопки энкодера подключен к пин 3 (int 1). Ожидаем срез импульса } void loop() { if(flag_interrupt_turn) check_flag_turn(); if(flag_interrupt_button) check_flag_button(); if (current_band != digitalRead(band_select)) // Если переключился диапазон { delay(3); current_band = digitalRead(band_select); Frequency = band[current_band*2]; // устанавливаем начальную частоту текущего диапазона. можно поставить середину если записать так: Frequency = band[current_band*2] + (band[current_band*2+1]-band[current_band*2])/2;// середина текущего диапазона sendFrequency(Frequency*1000); // установка частоты AD9850 в Гц lcd_print_frequency(); // выводим частоту на дисплей } } void enc_turn() // обработчик прерываний от вращения энкодера { noInterrupts(); // запрет прерываний во избежание дребезга flag_interrupt_turn = 1; return; } void enc_button() // обработчик прерываний от кнопки энкодера { noInterrupts(); // запрет прерываний во избежание дребезга flag_interrupt_button = 1; return; } void check_flag_turn() // проверка флага вращения энкодера { delay(2); // задержка перед обработкой прерывания для избежания дребезга if(digitalRead(pin_A)) // если выход А высокий, значит прерывание ложное { flag_interrupt_turn = 0; interrupts(); // разрешение прерываний return; } current_band = digitalRead(band_select); // считываем текущий диапазон if(digitalRead(pin_B)) { // выход В в сост. 1, значит, вращение по часовой стрелке, увеличиваем не более чем до верхней границы диапазона if(Frequency + change_step <= band[current_band*2+1]) Frequency += change_step; else Frequency = band[current_band*2+1] ; } else { // выход В в 0 сост., значит, вращение против часовой стрелки ,уменьшаем, но не ниже нижней границы диапазона if(Frequency - change_step >= band[current_band*2]) Frequency -= change_step; else Frequency = band[current_band*2] ; } sendFrequency(Frequency*1000); // Установка новой частоты AD9850 lcd_print_frequency(); flag_interrupt_turn = 0; interrupts(); // разрешение прерываний return; } void check_flag_button() // проверка флага кнопки энкодера { delay(2); // задержка перед обработкой прерывания для избежания дребезга if(digitalRead(pin_sw)) // если выход кнопки высокий, значит прерывание ложное { flag_interrupt_button = 0; interrupts(); // разрешение прерываний return; } // **** переключение диапазонов точной настройки кнопкой энкодера. if (++tuning_flag > 4) tuning_flag = 0; switch(tuning_flag) { case 0: // Режим 0 change_step = 1.0; // Шаг настройки 1,0кГц break; case 1: // Режим 1 change_step = 0.1; // Шаг настройки 100,0Гц break; case 2: // Режим 2 change_step = 0.01; // Шаг настройки 10,0Гц break; case 3: // Режим 3 change_step = 0.001; // Шаг настройки 1,0Гц break; case 4: // Режим 4 change_step = 0.0001; // Шаг настройки 0,1Гц break; } // ***** Выводим информацию показания точной настройки на дисплей Nokia 5110. Экран с разрешением 84х48 пикселей мы можем выводить шрифтом SmallFont Размер символов: 6x8 точек, до 6 строк по 14 символов //lcd.clrScr(); //очищаем дисплей Nokia 5110 //или //clrRow(8, [start], [40]) //очистка выбранной строки номер row, от позиции start до end; //Вывод во втророй строчке, первая занята под вывод частоты генератора. Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40 lcd.setFont(RusFont); // Применить русский шрифт RusFont для нижеследующей информации. lcd.print("Ifu",LEFT,8 ); // Выводим слово "Шаг" в 8-й строке дисплея начиная с лева lcd.print("rUw", RIGHT, 8); // Обозначение индикации режима точной настройки в кГц выводим в 8-й строке дисплея равнение с права. lcd.setFont(SmallFont); // Применить шрифт -млкий. lcd.printNumF( ((float)change_step),4 ,18, 8); //индикация режима точной настройки выводим 4-е знака после запятой в 8-й строке дисплея начиная с 4-го символа. ширина символа 6точек*3символа =18 //Вывод третьей строчки lcd.printNumI(tuning_flag, LEFT, 16); // Индикация режима номер шага от 0 до 4 точной настройки выводим в 16-й строке дисплея начиная слева lcd.print("*************", 6, 16); // Украшательства // Украшательства, заполняем пустые строчки Nokia 5110 //Вывод четвёртой строчки lcd.setFont(RusFont); //устанавливам русский шрифт RusFont lcd.print("UTYTHFNJH", CENTER, 24 ); // слово "ГЕНЕРАТОР" печатаем переключив клавиатуру на EN. Выводим в 24 строке дисплея по центу. //Вывод пятой строчки lcd.print("1Uw - 1000 rUw",CENTER, 32); //выводим диапазон 1Гц-1000кГц в 32-й строке дисплея по центру //Вывод шестой строчки lcd.print("VUw", 66, 40); // Выводим МГц в 40-й строке дисплея начиная с 10-го . ширина символа 6точек*9символа =54 точно получилось 58 точек lcd.setFont(SmallFont); // Применить шрифт -млкий. lcd.print("1,0 - 2,00", 0, 40); // Выводим в 40-й строке дисплея начиная с 3-го символа. ширина символа 6точек*2символа =12 // закончили украшательства flag_interrupt_button = 0; interrupts(); // Разрешение прерываний return; } // ******************************************************* void lcd_print_frequency() // Вывод частоты генератора на Nokia 5110 { lcd.clrScr(); // Очищаем экран Nokia 5110; //lcd.clrRow(row, [start], [end]); // Очистка выбранной строки номер row, от позиции start до end; //Вывод в первой строчке Nokia 5110, Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40 lcd.setFont(SmallFont); // Применить шрифт, ширина символа 6точек, для вывода на Nokia 5110 нижеледующей информации. lcd.printNumF(Frequency,4 ,LEFT, 0); // Частота сигнала 4-е знака после запятой выводим в первой строке начиная слева. //printNumF(num, dec, x, y, [divider], [length], [filler]); //вывести число с плавающей запятой; dec – число знаков после запятой; divider – знак десятичного разделителя, по умолчанию точка "."; lcd.setFont(RusFont); // Применить русский шрифт RusFont для нижеследующей информации. lcd.print("rUw", RIGHT, 0); // Индикация измерения частоты в кГц выводим в 1-й строке дисплея равнение справа. // подключаем вывод точной настройки и номера режима точной настройки на Nokia 5110 //Вывод во втророй строчке, первая занята под вывод частоты генератора. Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40 lcd.print("Ifu",LEFT,8 ); // Выводим слово Шаг в 8-й строке дисплея начиная с лева lcd.print("rUw", RIGHT, 8); // Обозначение индикации режима точной настройки в кГц выводим в 8-й строке дисплея равнение с права. lcd.setFont(SmallFont); // Выставляем шрифт -млкий. lcd.printNumF( ((float)change_step),4 ,18, 8); // Индикация режима точной настройки 4-е знака после запятой выводим в 8-й строке дисплея начиная с 18-го символа. ширина символа 6точек*3символа =18 //Вывод третьей строчки lcd.printNumI(tuning_flag, LEFT, 16); // Индикация номера от 0 до 4 точной настройки выводим в 16-й строке дисплея начиная слева lcd.print("*************", 6, 16); // Украшательства // Украшательства //Вывод четвёртой строчки lcd.setFont(RusFont); // Устанавливам русский шрифт RusFont lcd.print("UTYTHFNJH", CENTER, 24 ); // Слово "ГЕНЕРАТОР" печатаем переключив клавиатуру на EN. Выводим в 24 строке дисплея по центу. //Вывод пятой строчки lcd.print("1Uw - 1000 rUw",CENTER, 32); // Выводим 1Гц-1000 кГц в 32-й строке дисплея по центру //Вывод шестой строчки lcd.print("VUw", 66, 40); // Выводим МГц в 40-й строке дисплея начиная с 60-й точки/ подобрал визуально . ширина символа 6точек*9символа =54 lcd.setFont(SmallFont); lcd.print("1,0 - 2,00", 0, 40); // Выводим в 40-й строке дисплея начиная с 12-го символа. ширина символа 6точек*2символа =12 // Закончили украшательства } // **************************AD9850***************************************************** void tfr_byte(byte data)// последовательная передача байта в модуль AD9850 на вход DATA { for (int i=0; i<8; i++, data>>=1) { digitalWrite(DATA, data & 0x01); pulseHigh(W_CLK); //строб каждого бита } } void sendFrequency(float frequency)// расчет и передача управляющего 32 битного числа "frequency tuning word" //для задания частоты: frequency = <sys clock> * <frequency tuning word>/2^32 { //unsigned long freq = frequency * 4294967295/125000000; // расчет числа. частота домножается на 4294967295 / 125000000 = 34.35973836 и 34.35973836^-1 = 0.02910383 или 1/34.35973836 = 0.02910383 int32_t freq = frequency * 0.99999890 * 4294967295/125000000; // мой модуль AD9850 расчет числа, поправка для конкретного экземпляра платы //unsigned long freq = frequency * 1.00000965 * 4294967295/125000000; // расчет числа, 1.00000965 - поправка для конкретного экземпляра платы //int32_t freq = frequency * 4294967296/180000000; // Для тактовой 180 МГц на AD9851. Можно слегка поиграться значением для более точной настройки. for (int b=0; b<4; b++, freq>>=8) { tfr_byte(freq & 0xFF); //передача числа в AD9850 } tfr_byte(0x000); // завершающий байт, все 0 для AD9850 // tfr_byte(0x001); // Завершающий байт последовательности, 1 для AD9851 pulseHigh(FQ_UD); // строб новой частоты }
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Я не чертил. За длинные праздники попробую нарисовать.. выложу.Alfic пишет:
Ivan, схему подключения можно, что бы не разбираться в коде?!Ivan_Kornege пишет: Генератор частоты на Arduino (Atmega328, 16MHz) + AD9850 с выводом информации на дисплей Nokia 5110
2-а диаппазона:
1-й 1,0 Hz - 1000,0 kHz
2-й 1000,0 - 40000,0 kHz
Шаг регулировки частоты:
0 = 1,0000 kHz
1 = 0,1000 kHz
2 = 0,0100 kHz
3 = 0,0010 kHz
4 = 0,0001 kHz
Для управления частотой генератора используется энкодер типа Rotary Encoder KY-040
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ] [ Нажмите, чтобы скрыть ]/* http://arduino.ru/forum/proekty/dds-generator-na-arduino-ad9850#comment-225334 Генератор частоты на Arduino (Atmega328, 16MHz) + AD9850 с выводом информации на дисплей Nokia 5110 2-а диаппазона: 1-й 1,0 Hz - 1000,0 kHz 2-й 1000,0 - 40000,0 kHz Шаг регулировки частоты: 0 = 1,0000 kHz 1 = 0,1000 kHz 2 = 0,0100 kHz 3 = 0,0010 kHz 4 = 0,0001 kHz Для управления частотой генератора используется энкодер типа Rotary Encoder KY-040 с подтягтвающими резисторами 10 кОм установленными на плате энкодера. Паралельно вывходам энкодера,для устранения дребезга, на ножки котроллера 2,12,3 установить неполярные конденсаторы 10пФ. Вывод информации на ЖК дисплей Nokia 5110 За основу взят скетч Автор seawar <a href="http://cxem.net/cb/1-110.php" rel="nofollow">http://cxem.net/cb/1-110.php</a> Скетч для ардуино на мк atmega328 (UNO,Nano, MiniPro 16MHz) переаботан для генартора, скомпилирован Arduino 1.6.8, протестирован на Arduino nano (Atmega328, 16MHz). AVG 08-10-2016 */ // подключаем для Nokia 5110 библиотеку LCD5110_SSVS качаем отсюда <a href="https://github.com/ssvs111/ARDUINO-LCD-NOKIA5110-SSVS-RUS" rel="nofollow">https://github.com/ssvs111/ARDUINO-LCD-NOKIA5110-SSVS-RUS</a> , содержит русский шрифт, инструкция для библиотеки на русском. #include <LCD5110_SSVS.h> // Бибилиотека для подключения Nokia 5110 по ЧЕТЫРЕМ контактам к котроллеру. пример: 0→CLK,1→DIN,14→DC,5→RST, остальные GND→минус(общий провод), LIGHT→подсветка(можно не подлючать если не нужна),VCC→ +3,3V, CE→ минус(общий провод) extern uint8_t SmallFont[]; // Размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч extern uint8_t MediumNumbers[]; // Размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч extern uint8_t RusFont[]; // Подключаем русский шрифт //размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч LCD5110 lcd(4, 5, 6, 7); // Объявляем контакты на Ардуино для подключения Nokia 5110 4→CLK,5→DIN,6→DC,7→RST //lcd.setContrast(60); // Контрастность в % дисплея Nokia 5110. Если закомментировать, то по умолчанию будет 70% #define pin_A 2 // Контакт 2 для подключения энкодера - поворот энкодера #define pin_B 12 // Контакт 12 для подключения энкодера - направление вращения энкодера #define pin_sw 3 // Контакт 3 для подключения кнопки энкодера #define RESET 8 // Контакт 8 - вход сброса модуля AD9850 (RST) #define FQ_UD 9 // Контакт 9 - вход обновления частоты модуля AD9850 (FQ) #define W_CLK 10 // Контакт 10 - стробирующий вход модуля AD9850 (CLK) #define DATA 11 // Контакт 11 - вход последовательных данных модуля AD9850 (D7) #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } #define band_select 13 // Контакт 13 - подключаем кнопку переключателя диапазонов, второй контакт кнопки на общий провод. #define bands_number 2 // Количество диапазонов 2 . const float band[bands_number*2] = { 0.001, 1000.0, // Частота диапазона №2 переключается с диапазона №1 когда кнопка нажата - подаем землю "-" на 13 контакт (светодиод на ардуине потухнет). 1000.0, 40000.0 // Частота диапазона №1 от 1000.0 до 40000.0 кГц запускается при включении ардуино. }; byte current_band; // номер текущего диапазона //double Frequency; // частота генератора , закомментировал что то не нравятся мне даблы float Frequency; // частота генератора , что то не нравятся мне даблы поэтому float float change_step = 1.0; // устанавливаем шаг изменения частоты генератора - 1.0 кГц byte tuning_flag = 0; volatile byte flag_interrupt_turn = 0; volatile byte flag_interrupt_button = 0; void setup() { pinMode(pin_A, INPUT); // для чтения с выхода А энкодера //digitalWrite(pin_A, HIGH); // включаем подтягивающий резистор, если его нет на энкодере pinMode(pin_B, INPUT); // для чтения с выхода В энкодера //digitalWrite(pin_B, HIGH); // включаем подтягивающий резистор, если его нет на энкодере pinMode(pin_sw, INPUT); // для чтения с кнопки энкодера //digitalWrite(pin_sw, HIGH); // включаем подтягивающий резистор, если его нет на кнопке SW энкодера pinMode(FQ_UD, OUTPUT); // для выдачи на модуль AD9850 pinMode(W_CLK, OUTPUT); // для выдачи на модуль AD9850 pinMode(DATA, OUTPUT); // для выдачи на модуль AD9850 pinMode(RESET, OUTPUT); // для выдачи на модуль AD9850 pinMode(band_select, INPUT); // для чтения с переключателя диапазонов digitalWrite(band_select, HIGH); // включаем подтягивающий резистор для кнопки переключения диапазонов pulseHigh(RESET); pulseHigh(W_CLK); pulseHigh(FQ_UD); // разрешение последовательного режима AD9850 // *************************************************************************************************************** //Делаем заставку и выводим на Nokia 5110 при старте. Экран с разрешением 84х48 пикселей мы можем выводить шрифт SmallFont до 6 строк по 14 символов. высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,24,32,40 lcd.InitLCD(); // инициализация дисплея Nokia 5110 lcd.clrScr(); // очищаем весь дисплей Nokia 5110 //Вывод первой строчки, высота стандартного шрифта 8 точек, поэтому строки текста должны идти с интервалами через 8 точек: 0 -1я строка, 8 -2-я строка, 16 -3я строка, 24 -4я строка, 32 -5я строка, 40 -6я строка // lcd.setFont(SmallFont); //устанавливам шрифт мелкий lcd.setFont(RusFont); //устанавливам русский шрифт RusFont lcd.print("UTYTHFNJH", CENTER, 0); // слово "ГЕНЕРАТОР" печатаем англиским шрифтом клавиатуру на EN. Выводим в первой строке дисплея по центу. //Вывод второй строчки lcd.setFont(SmallFont); //устанавливам шрифт мелкий lcd.print("Arduino 328", CENTER, 8); //выводим в 8-й строке дисплея по центу. //Вывод третьей строчки lcd.print("+", CENTER, 16); //выводим в 16-й строке дисплея по центу. Если пишем LEFT -слева //Вывод четвертой строчки lcd.print("AD9850", CENTER, 24); //выводим в 24-й строке дисплея по центу. //Вывод пятой строчки lcd.setFont(RusFont); //устанавливам русский шрифт RusFont lcd.print("1Uw - 1000 rUw",CENTER, 32); //выводим 1Гц-1000кГц в 32-й строке дисплея по центру //Вывод шестой строчки lcd.print("VUw", 66, 40); //выводим МГц в 40-й строке дисплея начиная с 58-й точки дисплея . Отступил 58 точек -эксперементально определил. ширина символа 6точек*9символа =54 lcd.setFont(SmallFont); lcd.print("1,0 - 2,0", 0, 40); //выводим в 40-й строке дисплея начиная с 3-го символа. ширина символа 6точек*2символа =12 delay(3000); // 3000 миллисекунд показываем текст указанный выше при старте. // Закончили вывод заставки при старте Ардуино. // ************************************************************************************************* current_band = digitalRead(band_select); Frequency = band[current_band*2]; // Задаем частоту диапазона N1 при первом включении Ардуино. было: Frequency = band[current_band*2] + (band[current_band*2+1]-band[current_band*2])/2;// середина текущего диапазона sendFrequency(Frequency*1000); // Начальная установка частоты AD9850 в Гц lcd_print_frequency(); // Инициализация lcd_print_frequency . attachInterrupt(0, enc_turn, FALLING); // Выход А энкодера подключен к пин 2 (int 0). Ожидаем срез импульса attachInterrupt(1, enc_button, FALLING); // Выход кнопки энкодера подключен к пин 3 (int 1). Ожидаем срез импульса } void loop() { if(flag_interrupt_turn) check_flag_turn(); if(flag_interrupt_button) check_flag_button(); if (current_band != digitalRead(band_select)) // Если переключился диапазон { delay(3); current_band = digitalRead(band_select); Frequency = band[current_band*2]; // устанавливаем начальную частоту текущего диапазона. можно поставить середину если записать так: Frequency = band[current_band*2] + (band[current_band*2+1]-band[current_band*2])/2;// середина текущего диапазона sendFrequency(Frequency*1000); // установка частоты AD9850 в Гц lcd_print_frequency(); // выводим частоту на дисплей } } void enc_turn() // обработчик прерываний от вращения энкодера { noInterrupts(); // запрет прерываний во избежание дребезга flag_interrupt_turn = 1; return; } void enc_button() // обработчик прерываний от кнопки энкодера { noInterrupts(); // запрет прерываний во избежание дребезга flag_interrupt_button = 1; return; } void check_flag_turn() // проверка флага вращения энкодера { delay(2); // задержка перед обработкой прерывания для избежания дребезга if(digitalRead(pin_A)) // если выход А высокий, значит прерывание ложное { flag_interrupt_turn = 0; interrupts(); // разрешение прерываний return; } current_band = digitalRead(band_select); // считываем текущий диапазон if(digitalRead(pin_B)) { // выход В в сост. 1, значит, вращение по часовой стрелке, увеличиваем не более чем до верхней границы диапазона if(Frequency + change_step <= band[current_band*2+1]) Frequency += change_step; else Frequency = band[current_band*2+1] ; } else { // выход В в 0 сост., значит, вращение против часовой стрелки ,уменьшаем, но не ниже нижней границы диапазона if(Frequency - change_step >= band[current_band*2]) Frequency -= change_step; else Frequency = band[current_band*2] ; } sendFrequency(Frequency*1000); // Установка новой частоты AD9850 lcd_print_frequency(); flag_interrupt_turn = 0; interrupts(); // разрешение прерываний return; } void check_flag_button() // проверка флага кнопки энкодера { delay(2); // задержка перед обработкой прерывания для избежания дребезга if(digitalRead(pin_sw)) // если выход кнопки высокий, значит прерывание ложное { flag_interrupt_button = 0; interrupts(); // разрешение прерываний return; } // **** переключение диапазонов точной настройки кнопкой энкодера. if (++tuning_flag > 4) tuning_flag = 0; switch(tuning_flag) { case 0: // Режим 0 change_step = 1.0; // Шаг настройки 1,0кГц break; case 1: // Режим 1 change_step = 0.1; // Шаг настройки 100,0Гц break; case 2: // Режим 2 change_step = 0.01; // Шаг настройки 10,0Гц break; case 3: // Режим 3 change_step = 0.001; // Шаг настройки 1,0Гц break; case 4: // Режим 4 change_step = 0.0001; // Шаг настройки 0,1Гц break; } // ***** Выводим информацию показания точной настройки на дисплей Nokia 5110. Экран с разрешением 84х48 пикселей мы можем выводить шрифтом SmallFont Размер символов: 6x8 точек, до 6 строк по 14 символов //lcd.clrScr(); //очищаем дисплей Nokia 5110 //или //clrRow(8, [start], [40]) //очистка выбранной строки номер row, от позиции start до end; //Вывод во втророй строчке, первая занята под вывод частоты генератора. Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40 lcd.setFont(RusFont); // Применить русский шрифт RusFont для нижеследующей информации. lcd.print("Ifu",LEFT,8 ); // Выводим слово "Шаг" в 8-й строке дисплея начиная с лева lcd.print("rUw", RIGHT, 8); // Обозначение индикации режима точной настройки в кГц выводим в 8-й строке дисплея равнение с права. lcd.setFont(SmallFont); // Применить шрифт -млкий. lcd.printNumF( ((float)change_step),4 ,18, 8); //индикация режима точной настройки выводим 4-е знака после запятой в 8-й строке дисплея начиная с 4-го символа. ширина символа 6точек*3символа =18 //Вывод третьей строчки lcd.printNumI(tuning_flag, LEFT, 16); // Индикация режима номер шага от 0 до 4 точной настройки выводим в 16-й строке дисплея начиная слева lcd.print("*************", 6, 16); // Украшательства // Украшательства, заполняем пустые строчки Nokia 5110 //Вывод четвёртой строчки lcd.setFont(RusFont); //устанавливам русский шрифт RusFont lcd.print("UTYTHFNJH", CENTER, 24 ); // слово "ГЕНЕРАТОР" печатаем переключив клавиатуру на EN. Выводим в 24 строке дисплея по центу. //Вывод пятой строчки lcd.print("1Uw - 1000 rUw",CENTER, 32); //выводим диапазон 1Гц-1000кГц в 32-й строке дисплея по центру //Вывод шестой строчки lcd.print("VUw", 66, 40); // Выводим МГц в 40-й строке дисплея начиная с 10-го . ширина символа 6точек*9символа =54 точно получилось 58 точек lcd.setFont(SmallFont); // Применить шрифт -млкий. lcd.print("1,0 - 2,00", 0, 40); // Выводим в 40-й строке дисплея начиная с 3-го символа. ширина символа 6точек*2символа =12 // закончили украшательства flag_interrupt_button = 0; interrupts(); // Разрешение прерываний return; } // ******************************************************* void lcd_print_frequency() // Вывод частоты генератора на Nokia 5110 { lcd.clrScr(); // Очищаем экран Nokia 5110; //lcd.clrRow(row, [start], [end]); // Очистка выбранной строки номер row, от позиции start до end; //Вывод в первой строчке Nokia 5110, Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40 lcd.setFont(SmallFont); // Применить шрифт, ширина символа 6точек, для вывода на Nokia 5110 нижеледующей информации. lcd.printNumF(Frequency,4 ,LEFT, 0); // Частота сигнала 4-е знака после запятой выводим в первой строке начиная слева. //printNumF(num, dec, x, y, [divider], [length], [filler]); //вывести число с плавающей запятой; dec – число знаков после запятой; divider – знак десятичного разделителя, по умолчанию точка "."; lcd.setFont(RusFont); // Применить русский шрифт RusFont для нижеследующей информации. lcd.print("rUw", RIGHT, 0); // Индикация измерения частоты в кГц выводим в 1-й строке дисплея равнение справа. // подключаем вывод точной настройки и номера режима точной настройки на Nokia 5110 //Вывод во втророй строчке, первая занята под вывод частоты генератора. Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40 lcd.print("Ifu",LEFT,8 ); // Выводим слово Шаг в 8-й строке дисплея начиная с лева lcd.print("rUw", RIGHT, 8); // Обозначение индикации режима точной настройки в кГц выводим в 8-й строке дисплея равнение с права. lcd.setFont(SmallFont); // Выставляем шрифт -млкий. lcd.printNumF( ((float)change_step),4 ,18, 8); // Индикация режима точной настройки 4-е знака после запятой выводим в 8-й строке дисплея начиная с 18-го символа. ширина символа 6точек*3символа =18 //Вывод третьей строчки lcd.printNumI(tuning_flag, LEFT, 16); // Индикация номера от 0 до 4 точной настройки выводим в 16-й строке дисплея начиная слева lcd.print("*************", 6, 16); // Украшательства // Украшательства //Вывод четвёртой строчки lcd.setFont(RusFont); // Устанавливам русский шрифт RusFont lcd.print("UTYTHFNJH", CENTER, 24 ); // Слово "ГЕНЕРАТОР" печатаем переключив клавиатуру на EN. Выводим в 24 строке дисплея по центу. //Вывод пятой строчки lcd.print("1Uw - 1000 rUw",CENTER, 32); // Выводим 1Гц-1000 кГц в 32-й строке дисплея по центру //Вывод шестой строчки lcd.print("VUw", 66, 40); // Выводим МГц в 40-й строке дисплея начиная с 60-й точки/ подобрал визуально . ширина символа 6точек*9символа =54 lcd.setFont(SmallFont); lcd.print("1,0 - 2,00", 0, 40); // Выводим в 40-й строке дисплея начиная с 12-го символа. ширина символа 6точек*2символа =12 // Закончили украшательства } // **************************AD9850***************************************************** void tfr_byte(byte data)// последовательная передача байта в модуль AD9850 на вход DATA { for (int i=0; i<8; i++, data>>=1) { digitalWrite(DATA, data & 0x01); pulseHigh(W_CLK); //строб каждого бита } } void sendFrequency(float frequency)// расчет и передача управляющего 32 битного числа "frequency tuning word" //для задания частоты: frequency = <sys clock> * <frequency tuning word>/2^32 { //unsigned long freq = frequency * 4294967295/125000000; // расчет числа. частота домножается на 4294967295 / 125000000 = 34.35973836 и 34.35973836^-1 = 0.02910383 или 1/34.35973836 = 0.02910383 int32_t freq = frequency * 0.99999890 * 4294967295/125000000; // мой модуль AD9850 расчет числа, поправка для конкретного экземпляра платы //unsigned long freq = frequency * 1.00000965 * 4294967295/125000000; // расчет числа, 1.00000965 - поправка для конкретного экземпляра платы //int32_t freq = frequency * 4294967296/180000000; // Для тактовой 180 МГц на AD9851. Можно слегка поиграться значением для более точной настройки. for (int b=0; b<4; b++, freq>>=8) { tfr_byte(freq & 0xFF); //передача числа в AD9850 } tfr_byte(0x000); // завершающий байт, все 0 для AD9850 // tfr_byte(0x001); // Завершающий байт последовательности, 1 для AD9851 pulseHigh(FQ_UD); // строб новой частоты }
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Хорошая работа Иван! Спасибо! Вы не моглибы добавить в код режим сканирования частоты? Огромное спасибо ещё раз!Abadiya пишет:
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ] [ Нажмите, чтобы скрыть ]Ivan_Kornege пишет: Генератор частоты на Arduino (Atmega328, 16MHz) + AD9850 с выводом информации на дисплей Nokia 5110
2-а диаппазона:
1-й 1,0 Hz - 1000,0 kHz
2-й 1000,0 - 40000,0 kHz
Шаг регулировки частоты:
0 = 1,0000 kHz
1 = 0,1000 kHz
2 = 0,0100 kHz
3 = 0,0010 kHz
4 = 0,0001 kHz
Для управления частотой генератора используется энкодер типа Rotary Encoder KY-040
/* http://arduino.ru/forum/proekty/dds-generator-na-arduino-ad9850#comment-225334 Генератор частоты на Arduino (Atmega328, 16MHz) + AD9850 с выводом информации на дисплей Nokia 5110 2-а диаппазона: 1-й 1,0 Hz - 1000,0 kHz 2-й 1000,0 - 40000,0 kHz Шаг регулировки частоты: 0 = 1,0000 kHz 1 = 0,1000 kHz 2 = 0,0100 kHz 3 = 0,0010 kHz 4 = 0,0001 kHz Для управления частотой генератора используется энкодер типа Rotary Encoder KY-040 с подтягтвающими резисторами 10 кОм установленными на плате энкодера. Паралельно вывходам энкодера,для устранения дребезга, на ножки котроллера 2,12,3 установить неполярные конденсаторы 10пФ. Вывод информации на ЖК дисплей Nokia 5110 За основу взят скетч Автор seawar <a href="http://cxem.net/cb/1-110.php" rel="nofollow">http://cxem.net/cb/1-110.php</a> Скетч для ардуино на мк atmega328 (UNO,Nano, MiniPro 16MHz) переаботан для генартора, скомпилирован Arduino 1.6.8, протестирован на Arduino nano (Atmega328, 16MHz). AVG 08-10-2016 */ // подключаем для Nokia 5110 библиотеку LCD5110_SSVS качаем отсюда <a href="https://github.com/ssvs111/ARDUINO-LCD-NOKIA5110-SSVS-RUS" rel="nofollow">https://github.com/ssvs111/ARDUINO-LCD-NOKIA5110-SSVS-RUS</a> , содержит русский шрифт, инструкция для библиотеки на русском. #include <LCD5110_SSVS.h> // Бибилиотека для подключения Nokia 5110 по ЧЕТЫРЕМ контактам к котроллеру. пример: 0→CLK,1→DIN,14→DC,5→RST, остальные GND→минус(общий провод), LIGHT→подсветка(можно не подлючать если не нужна),VCC→ +3,3V, CE→ минус(общий провод) extern uint8_t SmallFont[]; // Размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч extern uint8_t MediumNumbers[]; // Размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч extern uint8_t RusFont[]; // Подключаем русский шрифт //размер шрифта из библиотеки, объявить массив шрифта в качестве внешнего или включить его в свой скетч LCD5110 lcd(4, 5, 6, 7); // Объявляем контакты на Ардуино для подключения Nokia 5110 4→CLK,5→DIN,6→DC,7→RST //lcd.setContrast(60); // Контрастность в % дисплея Nokia 5110. Если закомментировать, то по умолчанию будет 70% #define pin_A 2 // Контакт 2 для подключения энкодера - поворот энкодера #define pin_B 12 // Контакт 12 для подключения энкодера - направление вращения энкодера #define pin_sw 3 // Контакт 3 для подключения кнопки энкодера #define RESET 8 // Контакт 8 - вход сброса модуля AD9850 (RST) #define FQ_UD 9 // Контакт 9 - вход обновления частоты модуля AD9850 (FQ) #define W_CLK 10 // Контакт 10 - стробирующий вход модуля AD9850 (CLK) #define DATA 11 // Контакт 11 - вход последовательных данных модуля AD9850 (D7) #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } #define band_select 13 // Контакт 13 - подключаем кнопку переключателя диапазонов, второй контакт кнопки на общий провод. #define bands_number 2 // Количество диапазонов 2 . const float band[bands_number*2] = { 0.001, 1000.0, // Частота диапазона №2 переключается с диапазона №1 когда кнопка нажата - подаем землю "-" на 13 контакт (светодиод на ардуине потухнет). 1000.0, 40000.0 // Частота диапазона №1 от 1000.0 до 40000.0 кГц запускается при включении ардуино. }; byte current_band; // номер текущего диапазона //double Frequency; // частота генератора , закомментировал что то не нравятся мне даблы float Frequency; // частота генератора , что то не нравятся мне даблы поэтому float float change_step = 1.0; // устанавливаем шаг изменения частоты генератора - 1.0 кГц byte tuning_flag = 0; volatile byte flag_interrupt_turn = 0; volatile byte flag_interrupt_button = 0; void setup() { pinMode(pin_A, INPUT); // для чтения с выхода А энкодера //digitalWrite(pin_A, HIGH); // включаем подтягивающий резистор, если его нет на энкодере pinMode(pin_B, INPUT); // для чтения с выхода В энкодера //digitalWrite(pin_B, HIGH); // включаем подтягивающий резистор, если его нет на энкодере pinMode(pin_sw, INPUT); // для чтения с кнопки энкодера //digitalWrite(pin_sw, HIGH); // включаем подтягивающий резистор, если его нет на кнопке SW энкодера pinMode(FQ_UD, OUTPUT); // для выдачи на модуль AD9850 pinMode(W_CLK, OUTPUT); // для выдачи на модуль AD9850 pinMode(DATA, OUTPUT); // для выдачи на модуль AD9850 pinMode(RESET, OUTPUT); // для выдачи на модуль AD9850 pinMode(band_select, INPUT); // для чтения с переключателя диапазонов digitalWrite(band_select, HIGH); // включаем подтягивающий резистор для кнопки переключения диапазонов pulseHigh(RESET); pulseHigh(W_CLK); pulseHigh(FQ_UD); // разрешение последовательного режима AD9850 // *************************************************************************************************************** //Делаем заставку и выводим на Nokia 5110 при старте. Экран с разрешением 84х48 пикселей мы можем выводить шрифт SmallFont до 6 строк по 14 символов. высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,24,32,40 lcd.InitLCD(); // инициализация дисплея Nokia 5110 lcd.clrScr(); // очищаем весь дисплей Nokia 5110 //Вывод первой строчки, высота стандартного шрифта 8 точек, поэтому строки текста должны идти с интервалами через 8 точек: 0 -1я строка, 8 -2-я строка, 16 -3я строка, 24 -4я строка, 32 -5я строка, 40 -6я строка // lcd.setFont(SmallFont); //устанавливам шрифт мелкий lcd.setFont(RusFont); //устанавливам русский шрифт RusFont lcd.print("UTYTHFNJH", CENTER, 0); // слово "ГЕНЕРАТОР" печатаем англиским шрифтом клавиатуру на EN. Выводим в первой строке дисплея по центу. //Вывод второй строчки lcd.setFont(SmallFont); //устанавливам шрифт мелкий lcd.print("Arduino 328", CENTER, 8); //выводим в 8-й строке дисплея по центу. //Вывод третьей строчки lcd.print("+", CENTER, 16); //выводим в 16-й строке дисплея по центу. Если пишем LEFT -слева //Вывод четвертой строчки lcd.print("AD9850", CENTER, 24); //выводим в 24-й строке дисплея по центу. //Вывод пятой строчки lcd.setFont(RusFont); //устанавливам русский шрифт RusFont lcd.print("1Uw - 1000 rUw",CENTER, 32); //выводим 1Гц-1000кГц в 32-й строке дисплея по центру //Вывод шестой строчки lcd.print("VUw", 66, 40); //выводим МГц в 40-й строке дисплея начиная с 58-й точки дисплея . Отступил 58 точек -эксперементально определил. ширина символа 6точек*9символа =54 lcd.setFont(SmallFont); lcd.print("1,0 - 2,0", 0, 40); //выводим в 40-й строке дисплея начиная с 3-го символа. ширина символа 6точек*2символа =12 delay(3000); // 3000 миллисекунд показываем текст указанный выше при старте. // Закончили вывод заставки при старте Ардуино. // ************************************************************************************************* current_band = digitalRead(band_select); Frequency = band[current_band*2]; // Задаем частоту диапазона N1 при первом включении Ардуино. было: Frequency = band[current_band*2] + (band[current_band*2+1]-band[current_band*2])/2;// середина текущего диапазона sendFrequency(Frequency*1000); // Начальная установка частоты AD9850 в Гц lcd_print_frequency(); // Инициализация lcd_print_frequency . attachInterrupt(0, enc_turn, FALLING); // Выход А энкодера подключен к пин 2 (int 0). Ожидаем срез импульса attachInterrupt(1, enc_button, FALLING); // Выход кнопки энкодера подключен к пин 3 (int 1). Ожидаем срез импульса } void loop() { if(flag_interrupt_turn) check_flag_turn(); if(flag_interrupt_button) check_flag_button(); if (current_band != digitalRead(band_select)) // Если переключился диапазон { delay(3); current_band = digitalRead(band_select); Frequency = band[current_band*2]; // устанавливаем начальную частоту текущего диапазона. можно поставить середину если записать так: Frequency = band[current_band*2] + (band[current_band*2+1]-band[current_band*2])/2;// середина текущего диапазона sendFrequency(Frequency*1000); // установка частоты AD9850 в Гц lcd_print_frequency(); // выводим частоту на дисплей } } void enc_turn() // обработчик прерываний от вращения энкодера { noInterrupts(); // запрет прерываний во избежание дребезга flag_interrupt_turn = 1; return; } void enc_button() // обработчик прерываний от кнопки энкодера { noInterrupts(); // запрет прерываний во избежание дребезга flag_interrupt_button = 1; return; } void check_flag_turn() // проверка флага вращения энкодера { delay(2); // задержка перед обработкой прерывания для избежания дребезга if(digitalRead(pin_A)) // если выход А высокий, значит прерывание ложное { flag_interrupt_turn = 0; interrupts(); // разрешение прерываний return; } current_band = digitalRead(band_select); // считываем текущий диапазон if(digitalRead(pin_B)) { // выход В в сост. 1, значит, вращение по часовой стрелке, увеличиваем не более чем до верхней границы диапазона if(Frequency + change_step <= band[current_band*2+1]) Frequency += change_step; else Frequency = band[current_band*2+1] ; } else { // выход В в 0 сост., значит, вращение против часовой стрелки ,уменьшаем, но не ниже нижней границы диапазона if(Frequency - change_step >= band[current_band*2]) Frequency -= change_step; else Frequency = band[current_band*2] ; } sendFrequency(Frequency*1000); // Установка новой частоты AD9850 lcd_print_frequency(); flag_interrupt_turn = 0; interrupts(); // разрешение прерываний return; } void check_flag_button() // проверка флага кнопки энкодера { delay(2); // задержка перед обработкой прерывания для избежания дребезга if(digitalRead(pin_sw)) // если выход кнопки высокий, значит прерывание ложное { flag_interrupt_button = 0; interrupts(); // разрешение прерываний return; } // **** переключение диапазонов точной настройки кнопкой энкодера. if (++tuning_flag > 4) tuning_flag = 0; switch(tuning_flag) { case 0: // Режим 0 change_step = 1.0; // Шаг настройки 1,0кГц break; case 1: // Режим 1 change_step = 0.1; // Шаг настройки 100,0Гц break; case 2: // Режим 2 change_step = 0.01; // Шаг настройки 10,0Гц break; case 3: // Режим 3 change_step = 0.001; // Шаг настройки 1,0Гц break; case 4: // Режим 4 change_step = 0.0001; // Шаг настройки 0,1Гц break; } // ***** Выводим информацию показания точной настройки на дисплей Nokia 5110. Экран с разрешением 84х48 пикселей мы можем выводить шрифтом SmallFont Размер символов: 6x8 точек, до 6 строк по 14 символов //lcd.clrScr(); //очищаем дисплей Nokia 5110 //или //clrRow(8, [start], [40]) //очистка выбранной строки номер row, от позиции start до end; //Вывод во втророй строчке, первая занята под вывод частоты генератора. Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40 lcd.setFont(RusFont); // Применить русский шрифт RusFont для нижеследующей информации. lcd.print("Ifu",LEFT,8 ); // Выводим слово "Шаг" в 8-й строке дисплея начиная с лева lcd.print("rUw", RIGHT, 8); // Обозначение индикации режима точной настройки в кГц выводим в 8-й строке дисплея равнение с права. lcd.setFont(SmallFont); // Применить шрифт -млкий. lcd.printNumF( ((float)change_step),4 ,18, 8); //индикация режима точной настройки выводим 4-е знака после запятой в 8-й строке дисплея начиная с 4-го символа. ширина символа 6точек*3символа =18 //Вывод третьей строчки lcd.printNumI(tuning_flag, LEFT, 16); // Индикация режима номер шага от 0 до 4 точной настройки выводим в 16-й строке дисплея начиная слева lcd.print("*************", 6, 16); // Украшательства // Украшательства, заполняем пустые строчки Nokia 5110 //Вывод четвёртой строчки lcd.setFont(RusFont); //устанавливам русский шрифт RusFont lcd.print("UTYTHFNJH", CENTER, 24 ); // слово "ГЕНЕРАТОР" печатаем переключив клавиатуру на EN. Выводим в 24 строке дисплея по центу. //Вывод пятой строчки lcd.print("1Uw - 1000 rUw",CENTER, 32); //выводим диапазон 1Гц-1000кГц в 32-й строке дисплея по центру //Вывод шестой строчки lcd.print("VUw", 66, 40); // Выводим МГц в 40-й строке дисплея начиная с 10-го . ширина символа 6точек*9символа =54 точно получилось 58 точек lcd.setFont(SmallFont); // Применить шрифт -млкий. lcd.print("1,0 - 2,00", 0, 40); // Выводим в 40-й строке дисплея начиная с 3-го символа. ширина символа 6точек*2символа =12 // закончили украшательства flag_interrupt_button = 0; interrupts(); // Разрешение прерываний return; } // ******************************************************* void lcd_print_frequency() // Вывод частоты генератора на Nokia 5110 { lcd.clrScr(); // Очищаем экран Nokia 5110; //lcd.clrRow(row, [start], [end]); // Очистка выбранной строки номер row, от позиции start до end; //Вывод в первой строчке Nokia 5110, Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40 lcd.setFont(SmallFont); // Применить шрифт, ширина символа 6точек, для вывода на Nokia 5110 нижеледующей информации. lcd.printNumF(Frequency,4 ,LEFT, 0); // Частота сигнала 4-е знака после запятой выводим в первой строке начиная слева. //printNumF(num, dec, x, y, [divider], [length], [filler]); //вывести число с плавающей запятой; dec – число знаков после запятой; divider – знак десятичного разделителя, по умолчанию точка "."; lcd.setFont(RusFont); // Применить русский шрифт RusFont для нижеследующей информации. lcd.print("rUw", RIGHT, 0); // Индикация измерения частоты в кГц выводим в 1-й строке дисплея равнение справа. // подключаем вывод точной настройки и номера режима точной настройки на Nokia 5110 //Вывод во втророй строчке, первая занята под вывод частоты генератора. Высота стандартного шрифта 8 точек, поэтому строки должны идти с интервалами через 8: 0,8,16,32,40 lcd.print("Ifu",LEFT,8 ); // Выводим слово Шаг в 8-й строке дисплея начиная с лева lcd.print("rUw", RIGHT, 8); // Обозначение индикации режима точной настройки в кГц выводим в 8-й строке дисплея равнение с права. lcd.setFont(SmallFont); // Выставляем шрифт -млкий. lcd.printNumF( ((float)change_step),4 ,18, 8); // Индикация режима точной настройки 4-е знака после запятой выводим в 8-й строке дисплея начиная с 18-го символа. ширина символа 6точек*3символа =18 //Вывод третьей строчки lcd.printNumI(tuning_flag, LEFT, 16); // Индикация номера от 0 до 4 точной настройки выводим в 16-й строке дисплея начиная слева lcd.print("*************", 6, 16); // Украшательства // Украшательства //Вывод четвёртой строчки lcd.setFont(RusFont); // Устанавливам русский шрифт RusFont lcd.print("UTYTHFNJH", CENTER, 24 ); // Слово "ГЕНЕРАТОР" печатаем переключив клавиатуру на EN. Выводим в 24 строке дисплея по центу. //Вывод пятой строчки lcd.print("1Uw - 1000 rUw",CENTER, 32); // Выводим 1Гц-1000 кГц в 32-й строке дисплея по центру //Вывод шестой строчки lcd.print("VUw", 66, 40); // Выводим МГц в 40-й строке дисплея начиная с 60-й точки/ подобрал визуально . ширина символа 6точек*9символа =54 lcd.setFont(SmallFont); lcd.print("1,0 - 2,00", 0, 40); // Выводим в 40-й строке дисплея начиная с 12-го символа. ширина символа 6точек*2символа =12 // Закончили украшательства } // **************************AD9850***************************************************** void tfr_byte(byte data)// последовательная передача байта в модуль AD9850 на вход DATA { for (int i=0; i<8; i++, data>>=1) { digitalWrite(DATA, data & 0x01); pulseHigh(W_CLK); //строб каждого бита } } void sendFrequency(float frequency)// расчет и передача управляющего 32 битного числа "frequency tuning word" //для задания частоты: frequency = <sys clock> * <frequency tuning word>/2^32 { //unsigned long freq = frequency * 4294967295/125000000; // расчет числа. частота домножается на 4294967295 / 125000000 = 34.35973836 и 34.35973836^-1 = 0.02910383 или 1/34.35973836 = 0.02910383 int32_t freq = frequency * 0.99999890 * 4294967295/125000000; // мой модуль AD9850 расчет числа, поправка для конкретного экземпляра платы //unsigned long freq = frequency * 1.00000965 * 4294967295/125000000; // расчет числа, 1.00000965 - поправка для конкретного экземпляра платы //int32_t freq = frequency * 4294967296/180000000; // Для тактовой 180 МГц на AD9851. Можно слегка поиграться значением для более точной настройки. for (int b=0; b<4; b++, freq>>=8) { tfr_byte(freq & 0xFF); //передача числа в AD9850 } tfr_byte(0x000); // завершающий байт, все 0 для AD9850 // tfr_byte(0x001); // Завершающий байт последовательности, 1 для AD9851 pulseHigh(FQ_UD); // строб новой частоты }
P.S. Если возникнет вопрос для чего это может пригодиться? То ответ находится вот здесь БТГ сканер частоты
Чет не въехал -нафига генератору сканировать частоту? Он выдает ту частоту которую выставляет оператор.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
И возможна ли плавная перестройка? Или только ступенчато?
А можно было б изменить управление? Энкодера нету.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Там есть фильтр. Речь то здесь идет о блоке из китая.ua4yhz пишет: .........
Товарищ не правильно выразился, ему нужен не сканер,а генератор качающейся частоты.
То бишь задается начало и конец диапазона,а так же шаг и время перестройки частоты в этом диапазоне.
Второй генератор пилообразного напряжения делается уже с помощью ШИМ-а ардуины и идет например на развертку Z осциллографа.
Получается не плохой анализатор спектра.По крайней мере так раньше делали самопальные анализаторы.
А с его помощью уже не только АЧХ катушек и контуров снимали,но и полосовых фильтров,усилителей и прочих четырех полюсников.
Не забываем на выходе Ad9850 устанавливать фильтр с частотой среза порядка 40 МГц из даташита и усилитель с переключаемым аттенюатором,типа такого:
А так пора уже потихоньку переходить на STM процессоры и OLED или TFT дисплеи.
Иван уже выкладывал схему.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
ua4yhz пишет:
Плавной перестройки нет,там перестройка по частоте идет с помощью записи 40 знаковой команды в микросхему.Belogrost пишет: А какая максимальная скорость перестройки частоты возможна у 9850?
И возможна ли плавная перестройка? Или только ступенчато?
А можно было б изменить управление? Энкодера нету.
Вместо энкодера можно приделать клавиатуру,только в этом случае нужно подправить скетч.
Про скорость записи команд в АД-шку не скажу так сразу,нужно даташит читать.
Плавную перестройку сделать можно без особых проблем. Нужно просто использовать для записи команд микроконтроллер побыстрее. Могу сделать если кому то нужно такое. Тут как я понимаю нужно задавать начальную частоту перестройки, конечную частоту перестройки, шаг перестройки и скорость перестройки частоты, Ну и цикличность повторения. Для целей исследований СЕ удобно сначала прогнать например в более широком диапазоне, а затем более плавно в более узком.
Но конечно ua4yhz правильно заметил, что на больших частотах при использовании AD9850 будут немаленький коэффициент гармоник, поэтому на выходе очень желателен фильтр с частотой среза чуть выше максимальной частоты. А ещё лучше, если частота среза фильтра будет также меняться ступенчато в зависимости от частоты сигнала на выходе AD9850.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
piko пишет: Вот cxem.net/izmer/izmer161.php то что доктор прописал. И не мучайтесь.
Ну это далеко не то, что доктор прописал. Уже говорил в предыдущем посте, что нужна более гибкая настройка, чем в этом устройстве.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.