Код (C++): #include <LiquidCrystal.h> // Подключение библиотек LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Инициализация LCD с указанием пинов float freq = 10000; // Оглашение переменных -- Частота float bigStep = 1000; // Шаг изменения частоты при нажатии вверх/вниз float littleStep = 10; // Шаг изменения частоты при нажатии вправо/влево int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 // Создание директив для кнопок #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 #define W_CLK 15 // Пин A1 Arduino - подключен к CLK #define FQ_UD 16 // Пин A2 Arduino - подключен к FQ (FU) #define DATA 17 // Пин A3 Arduino - подключен к DATA #define RESET 18 // Пин A4 Arduino - подключен к RST #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } //------------------------------------------------------ int read_LCD_buttons(){ // Функция считывания нажатия кнопок adc_key_in = analogRead(0); if (adc_key_in > 1000) return btnNONE; if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 150) return btnUP; if (adc_key_in < 315) return btnDOWN; if (adc_key_in < 600) return btnLEFT; if (adc_key_in < 850) return btnSELECT; return btnNONE;} //------------------------------------------------------- void tfr_byte(byte data){ // Функция побитной отправки байта for (int i=0; i<8; i++, data>>=1) { // данных в модуль генератора digitalWrite(DATA, data & 0x01); pulseHigh(W_CLK);}} // Подача импульса на CLK после каждого бита //------------------------------------------------------- void sendFrequency(double frequency) { // Преобразование и отправка int32_t freq = frequency * 4294967295/125000000; // значения частоты for (int b=0; b<4; b++, freq>>=8) {tfr_byte(freq & 0xFF);} tfr_byte(0x000); // Отправка завершательного контрольного байта pulseHigh(FQ_UD);} // Обновление частоты генератора //---------------------------------------------------- void setup() { lcd.begin(16, 2); // Старт библиотеки. Указанием количества символов и строк pinMode(FQ_UD, OUTPUT); pinMode(W_CLK, OUTPUT); pinMode(DATA, OUTPUT); pinMode(RESET, OUTPUT); pulseHigh(RESET); // Отправка импульсов для запуска модуля генератора pulseHigh(W_CLK); pulseHigh(FQ_UD); } //---------------------------------------------------- void loop() { lcd.setCursor(0,0); // Далее вывод текущего значения частоты lcd.print("Freq: "); lcd.setCursor(6,0); lcd.print(" "); lcd.setCursor(6,0); if (freq<1000){lcd.print(freq); lcd.print("Hz");} if ((freq>=1000)&&(freq<1000000)){lcd.print(freq / 1000); lcd.print("kHz");} if ((freq>=1000000)&&(freq<50000000)){lcd.print(freq / 1000000); lcd.print("MHz");} lcd.setCursor(0,1); lcd.print(" Genie v1.0"); if (freq<100){bigStep = 10; // Определение шага грубой и точной littleStep = 1;} // настройки в зависимости от частоты if ((freq>=100)&&(freq<1000)){bigStep = 100; littleStep = 1;} if ((freq>=1000)&&(freq<10000)){bigStep = 1000; littleStep = 10;} if ((freq>=10000)&&(freq<100000)){bigStep = 10000; littleStep = 100;} if ((freq>=100000)&&(freq<1000000)){bigStep = 100000; littleStep = 1000;} if ((freq>=1000000)&&(freq<10000000)){bigStep = 1000000; littleStep = 10000;} if ((freq>=10000000)&&(freq<40000000)){bigStep = 10000000; littleStep = 100000;} lcd_key = read_LCD_buttons(); // Считывание клавиш switch (lcd_key) // Далее обработка нажатий клавиш { case btnRIGHT: {freq += littleStep; break;} case btnLEFT: {freq -= littleStep; break;} case btnUP: {freq += bigStep; break;} case btnDOWN: {if (freq == bigStep){freq -= (bigStep/10);} else {freq -= bigStep;} break;} case btnSELECT: {break;} case btnNONE: {break;} } if (freq<1) freq=1; // Ограничение значений частоты if (freq>40000000) freq=40000000; sendFrequency(freq); // Вызов функции отправки частоты delay (200); // Пауза 200 мс } Наткнулся на братском сайте. Требуется модуль генератора)
У меня есть сильные сомнения относительно 40 МГц, ибо - digitalWrite где только можно. Вы замеряли реальную частоту генерации?
требуется модуль генератор. с данной темой я поспешил, ибо невнимателен. Искал пример кода на 7кГц, наткнулся на этот и на радостях даже не проверил.
А как возможно сделать генератор 40Мгц, когда сама Arduino - 16МГц (Uno) ? Для 40МГц, в случае генерации сигнала "меандра", необходим период равный 0,025 мкс (!). У простой Arduino вроде нету такой задержки, минимум 1 (?) /* Я бы на 555 таймере сделал, вроде находил схемы с регулировкой частоты, как раз в таком диапазоне... */
Вот, нашел. Удалось получить 8МГц на пине, что является вполне ожидаемым пределом для 16МГцной системы.
Да, это 25 мкс, а надо 0,025 мкс ( на тышу домножить и получим 25нс ), но выше уже поправили Именно это я и имел ввиду Быть может на Arduino с ARM на борту это реально, но не для UNO-подобных