управление модулем si5351
- Войдите на сайт для отправки комментариев
Сб, 14/03/2020 - 17:28
Всем привет.Поскольку с некоторых пор немного ограничен тяжёлым трудом, и являясь радиолюбителем,решил я отремонтировать свой приёмник с двойным преобразованием,обрадовавшись тому что нашёл в инете скетч "синтезатора частоты на si5351".Заказал на АЛИ необходимые платы и сижу тут кулибничаю но пока не очень.Залил скетч,но у меня работает только CLK0,но мне нужны и другие выходы.Попробовал по своему как я вычитал и как понял ,но пока никак.Может кто подскажет как заставить работать CLK1 и CLK2?Вот данный скетч:
Тут конечно есть и мои "грехи",т.е. где то что то комментировал /* Вся эта программа изначально написана NT7S и SQ9NJE. Оригинальный код, немного подправленный мною, под мои нужды. Ознакомится с оригиналом можно здесь http://nt7s.com/ http://sq9nje.pl/ http://ak2b.blogspot.com/ */ #include <rotary.h> #//include <si5351.h> #include <RWE_si5351.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define F_MIN 1000000L // Нижний предел частоты #define F_MAX 30000000L // Верхний предел частоты #define OLED_RESET 4 #define ENCODER_A 3 // Encoder pin A #define ENCODER_B 2 // Encoder pin B #define ENCODER_BTN 5 //#define LCD_RS 5. //#define LCD_E 6 //#define LCD_D4 7 //#define LCD_D5 8 //#define LCD_D6 9 //#define LCD_D7 10 // переменные нужные для кнопок PRE/ATT int regim=1; // для кнопки int flag=0; // для кнопки LiquidCrystal_I2C lcd(0x27,16,2);//Создается экземпляр класса из библиотеки Si5351 si5351; Rotary r = Rotary(ENCODER_A, ENCODER_B); // Для кварцевых резонаторов со значением 8867 МГц. //volatile uint32_t LSB = 900000000ULL;//886300000ULL; //частота ОГ(гетеродина) для "нижней" боковой. Настр. на ниж. скат КФ. //volatile uint32_t USB = 900000000ULL;//886700000ULL; //частота ОГ(гетеродина) для "верхней" боковой. Настр. на вверхн. скат КФ. volatile uint32_t bfo = 900000000ULL;//886700000ULL; //стартовать с "верхней" ... //Эти USB/LSB частоты добавляется или вычитается из частоты VFO в "void loop()" //В этом примере если начальная частота будет 14.20000 плюс 9.001500 то на выходе clk0 = 23.2015Mhz volatile uint32_t vfo = 700000000ULL / SI5351_FREQ_MULT; //стартовая частота при запуске синтезатора. volatile uint32_t radix = 100; // Шаг перестройки по умолчанию при старте = 100 кГц boolean changed_f = 0; String tbfo = ""; //------------------ Установка дополнительных функций здесь --------------------------- //Удалить коммент (//) для применения нужного варианта. Задействовать только одно. //#define IF_Offset // Показание на ЖКИ плюс(минус) на значение ПЧ #define Direct_conversion // чатота на выходе как на ЖКИ. Прямой выход. Генератор. //#define FreqX4 // частота на выходе, умноженная на четыре ... //#define FreqX2 // частота на выходе, умноженная на два ... //--------------------------------------------------------------------------------------- /**************************************/ /* Interrupt service routine for */ /* encoder frequency change */ /**************************************/ ISR(PCINT2_vect) { unsigned char result = r.process(); if (result == DIR_CW) set_frequency(1); else if (result == DIR_CCW) set_frequency(-1); } /**************************************/ /* Change the frequency */ /* dir = 1 Increment */ /* dir = -1 Decrement */ /**************************************/ void set_frequency(short dir) { if (dir == 1) vfo += radix; if (dir == -1) vfo -= radix; if(vfo > F_MAX) vfo = F_MAX; if(vfo < F_MIN) vfo = F_MIN; changed_f = 1; } /**************************************/ /* Read the button with debouncing */ /**************************************/ boolean get_button() { if (!digitalRead(ENCODER_BTN)) { delay(20); if (!digitalRead(ENCODER_BTN)) { while (!digitalRead(ENCODER_BTN)); return 1; } } return 0; } /**************************************/ /* Displays the frequency */ /**************************************/ void display_frequency() { uint16_t f, g; lcd.setCursor(3, 0); f = vfo / 1000000; //variable is now vfo instead of 'frequency' if (f < 10) lcd.print(' '); lcd.print(f); lcd.print('.'); f = (vfo % 1000000) / 1000; if (f < 100) lcd.print('0'); if (f < 10) lcd.print('0'); lcd.print(f); lcd.print('.'); f = vfo % 1000; if (f < 100) lcd.print('0'); if (f < 10) lcd.print('0'); lcd.print(f); lcd.print("Hz "); lcd.setCursor(0, 1); lcd.print(tbfo); //Serial.println(vfo + bfo); //Serial.println(tbfo); } /**************************************/ /* Отображаем шаг изменения частоты */ /**************************************/ void display_radix() { lcd.setCursor(9, 1); switch (radix) { case 1: lcd.print(" 1"); break; case 10: lcd.print(" 10"); break; case 100: lcd.print(" 100"); break; case 1000: lcd.print(" 1k"); break; case 10000: lcd.print(" 10k"); break; case 100000: //lcd.setCursor(10, 1); lcd.print(" 100k"); break; case 1000000: //lcd.setCursor(9, 1); lcd.print(" 1MHz"); //1MHz increments break; } lcd.print("Hz"); } void setup() { // начальное сообщение lcd.init(); lcd.backlight(); lcd.setCursor(2, 0); lcd.print("HELLO RA4ART"); delay (1000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("SINTEZ on Si5351"); // текст на экране - " HELLO !!! " lcd.setCursor(2, 1); lcd.print("Gotov k rabote"); delay(1000); // Время на прочтение начального сообщения 1 сек lcd.clear(); Serial.begin(19200); Wire.begin(); si5351.set_correction(57500); //**mine. There is a calibration sketch in File/Examples/si5351Arduino //where you can determine the correction by using the serial monitor. //ввести калибровочное знечение в строчке si5351.set_correction(хххххххх). //Нужно вычислить запустив "si5351calibration" в папке с примерами библиотеки si5351. //initialize the Si5351 //si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0); //If you're using a 27Mhz crystal, put in 27000000 instead of 0 // 0 is the default crystal frequency of 25Mhz. si5351.set_pll(SI5351_PLL_FIXED, SI5351_PLLA); // Set CLK0 to output the starting "vfo" frequency as set above by vfo = ? #ifdef IF_Offset si5351.set_freq((vfo * SI5351_FREQ_MULT) + bfo, SI5351_PLL_FIXED, SI5351_CLK0); volatile uint32_t vfoT = (vfo * SI5351_FREQ_MULT) + bfo; tbfo = "USB"; //Set CLK2 to output bfo frequency //si5351.set_clock_source(SI5351_CLK2, SI5351_CLK_SRC_MS0); //si5351.output_enable(SI5351_CLK2, 1); //si5351.set_freq( bfo, 0, SI5351_CLK2); //si5351.set_freq( bfo, 0, SI5351_CLK1); //si5351.drive_strength(SI5351_CLK0,SI5351_DRIVE_2MA); //you can set this to 2MA, 4MA, 6MA or 8MA si5351.drive_strength(SI5351_CLK1,SI5351_DRIVE_2MA); //be careful though - measure into 50ohms si5351.drive_strength(SI5351_CLK2,SI5351_DRIVE_2MA); // #endif // si5351.set_freq((bfo * SI5351_FREQ_MULT),SI5351_PLL_FIXED , SI5351_CLK1);// #ifdef Direct_conversion si5351.set_freq((vfo * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0); #endif #ifdef FreqX4 si5351.set_freq((vfo * SI5351_FREQ_MULT) * 4, SI5351_PLL_FIXED, SI5351_CLK0); #endif #ifdef FreqX2 si5351.set_freq((vfo * SI5351_FREQ_MULT) * 2, SI5351_PLL_FIXED, SI5351_CLK0); #endif pinMode(ENCODER_BTN, INPUT_PULLUP); PCICR |= (1 << PCIE2); // Enable pin change interrupt for the encoder PCMSK2 |= (1 << PCINT18) | (1 << PCINT19); sei(); display_frequency(); // Update the display display_radix(); // Порты, пины для управл. напр. УВЧ и АТТ pinMode(6,OUTPUT); // для кнопки УВЧ = A2 pinMode(7,OUTPUT); // для кнопки АТТ = A1 // Порты, пины управл. напр. для дешифр. CD4028 pinMode(8,OUTPUT); // b0 для A pinMode(9,OUTPUT); // b1 для B pinMode(10,OUTPUT); // b2 для D pinMode(11,OUTPUT); // b3 для C } void loop() { // Update the display if the frequency has been changed if (changed_f) { display_frequency(); #ifdef IF_Offset si5351.set_freq((vfo * SI5351_FREQ_MULT) + bfo, SI5351_PLL_FIXED, SI5351_CLK0); // Вы также можете вычесть BFO, чтобы удовлетворить ваши потребности //si5351.set_freq((vfo * SI5351_FREQ_MULT) - bfo , SI5351_PLL_FIXED, SI5351_CLK0); if (vfo >= 10000000ULL & tbfo != "USB") { bfo = USB; tbfo = "USB"; si5351.set_freq( bfo, 1, SI5351_CLK2);//( bfo, 0, SI5351_CLK2) Serial.println("We've switched from LSB to USB"); } else if (vfo < 10000000ULL & tbfo != "LSB") { bfo = LSB; tbfo = "LSB"; si5351.set_freq( bfo, 0, SI5351_CLK2);//( bfo, 0, SI5351_CLK2) Serial.println("We've switched from USB to LSB"); } #endif #ifdef Direct_conversion si5351.set_freq((vfo * SI5351_FREQ_MULT), SI5351_PLL_FIXED, SI5351_CLK0); tbfo = ""; #endif #ifdef FreqX4 si5351.set_freq((vfo * SI5351_FREQ_MULT) * 4, SI5351_PLL_FIXED, SI5351_CLK0); tbfo = ""; #endif #ifdef FreqX2 si5351.set_freq((vfo * SI5351_FREQ_MULT) * 2, SI5351_PLL_FIXED, SI5351_CLK0); tbfo = ""; #endif changed_f = 0; } // Кнопки УВЧ и АТТ --------------------------------- { if(digitalRead(4)==HIGH&&flag==0)//если кнопка нажата // и перемення flag равна 0 , то ... { regim++; flag=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% if(regim>4)//ограничим количество режимов { regim=1;//так как мы используем только одну кнопку, // то переключать режимы будем циклично } } if(digitalRead(4)==LOW && flag==1)//если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { flag=0;//обнуляем переменную "knopka" } if(regim==1)//первый режим - очистка экрана { digitalWrite(6,LOW);// на пине нулевой уровень digitalWrite(7,LOW); lcd.setCursor(5, 1); lcd.print(" "); // "пустое место" //здесь может быть любое ваше действие } if(regim==2)//второй режим - вкл. УВЧ { digitalWrite(6,LOW);//включает PRE digitalWrite(7,HIGH); lcd.setCursor(5, 1); // место на экране для PRE lcd.print("PRE"); //здесь может быть любое ваше действие } if(regim==3)//третий режим - очистка экрана { digitalWrite(6,LOW);// digitalWrite(7,LOW); lcd.setCursor(5, 1); // место текста на экране lcd.print(" "); // "пустое место" //здесь может быть любое ваше действие } if(regim==4)//третий режим - вкл. АТТ { digitalWrite(6,HIGH);//включает АТТ digitalWrite(7,LOW); lcd.setCursor(5, 1); // место на экране для АТТ lcd.print("ATT"); } // -------------------------------- // для кнопки РТТ ----------------- // --------------------------------- // Для управления CD4028 //---A0-A1-A2-A3 ---pin, porn Arduino Pro Mini //---b0-b1-b2-b3----band //---00-00-00-00----160m //---11-00-00-00-----80m //---00-11-00-00-----40m //---11-11-00-00-----30m //---00-00-11-00-----20m //---11-00-11-00-----17m //---00-11-11-00-----15m //---11-11-11-00-----12m //---00-00-00-11-----10m // Band 160 if (vfo >= 1000000ULL && vfo <= 3000000ULL) { digitalWrite(8,LOW); // на пине нулевой уровень digitalWrite(9,LOW); // на пине нулевой уровень digitalWrite(10,LOW); // на пине нулевой уровень digitalWrite(11,LOW); // на пине нулевой уровень } // Band 80 if (vfo >= 3000001ULL && vfo <= 5000000ULL) { digitalWrite(8,HIGH); // на пине высокий уровень digitalWrite(9,LOW); // на пине нулевой уровень digitalWrite(10,LOW); // на пине нулевой уровень digitalWrite(11,LOW); // на пине нулевой уровень } // Band 40 if (vfo >= 5000001ULL && vfo <= 8000000ULL) { digitalWrite(8,LOW); // на пине нулевой уровень digitalWrite(9,HIGH); // на пине высокий уровень digitalWrite(10,LOW); // на пине нулевой уровень digitalWrite(11,LOW); // на пине нулевой уровень } // Band 30 if (vfo >= 8000001ULL && vfo <= 120000000ULL) { digitalWrite(8,HIGH); // на пине высокий уровень digitalWrite(9,HIGH); // на пине высокий уровень digitalWrite(10,LOW); // на пине нулевой уровень digitalWrite(11,LOW); // на пине нулевой уровень } // Band 20 if (vfo >= 12000001ULL && vfo <= 15000000ULL) { digitalWrite(8,LOW); // на пине нулевой уровень digitalWrite(9,LOW); // на пине нулевой уровень digitalWrite(10,HIGH); // на пине высокий уровень digitalWrite(11,LOW); // на пине нулевой уровень } // Band 17 if (vfo >= 15000001ULL && vfo <= 19000000ULL) { digitalWrite(8,HIGH); // на пине высокий уровень digitalWrite(9,LOW); // на пине нулевой уровень digitalWrite(10,HIGH); // на пине высокий уровень digitalWrite(11,LOW); // на пине нулевой уровень } // Band 15 if (vfo >= 19000001ULL && vfo <= 23000000ULL) { digitalWrite(8,LOW); // на пине нулевой уровень digitalWrite(9,HIGH); // на пине высокий уровень digitalWrite(10,HIGH); // на пине высокий уровень digitalWrite(11,LOW); // на пине нулевой уровень } // Band 12 if (vfo >= 23000001ULL && vfo <= 26000000ULL) { digitalWrite(8,HIGH); // на пине высокий уровень digitalWrite(9,HIGH); // на пине высокий уровень digitalWrite(10,HIGH); // на пине высокий уровень digitalWrite(11,LOW); // на пине нулевой уровень } // Band 10 if (vfo >= 26000001ULL && vfo <= 30000000ULL) { digitalWrite(8,LOW); // на пине нулевой уровень digitalWrite(9,LOW); // на пине нулевой уровень digitalWrite(10,LOW); // на пине нулевой уровень digitalWrite(11,HIGH); // на пине высокий уровень } // HAM BAND ----- Границы диапазонов --------- // 160-метровый (1,81 - 2 МГц) if (vfo >= 1000000ULL && vfo <= 3000000ULL)//if (vfo >= 1810000ULL && vfo <= 2000000ULL) { lcd.setCursor(0, 1); lcd.print("160m"); } else // 80-метровый (3,5 - 3,8 МГц) if (vfo >= 3000001ULL && vfo <= 5000000ULL)//if (vfo >= 3500000ULL && vfo <= 3800000ULL) { lcd.setCursor(0, 1); lcd.print("80m "); } else // 40-метровый (7 - 7,2 МГц) if (vfo >= 5000001ULL && vfo <= 8000000ULL)//if (vfo >= 7000000ULL && vfo <= 7200000ULL) { lcd.setCursor(0, 1); lcd.print("40m "); } else // 30-метровый (только телеграф 10,1 - 10,15 МГц) if (vfo >= 8000001ULL && vfo <= 12000000ULL)//if (vfo >= 10100000ULL && vfo <= 10150000ULL) { lcd.setCursor(0, 1); lcd.print("30m "); } else // 20-метровый (14 - 14,35 МГц) if (vfo >= 12000001ULL && vfo <= 15000000ULL)//if (vfo >= 14000000ULL && vfo <= 14350000ULL) { lcd.setCursor(0, 1); lcd.print("20m "); } else // 17-метровый (18,068 - 18,168 МГц) if (vfo >= 15000001ULL && vfo <= 19000000ULL)//if (vfo >= 18068000ULL && vfo <= 18168000ULL) { lcd.setCursor(0, 1); lcd.print("17m "); } else // 15-метровый (21 - 21,45 МГц) if (vfo >= 19000001ULL && vfo <= 23000000ULL)//if (vfo >= 21000000ULL && vfo <= 21450000ULL) { lcd.setCursor(0, 1); lcd.print("15m "); } else // 12-метровый (24,89 - 25,14 МГц) if (vfo >= 23000001ULL && vfo <= 26000000ULL)//if (vfo >= 24890000ULL && vfo <= 25140000ULL) { lcd.setCursor(0, 1); lcd.print("12m "); } else // 10-метровый (28 - 29,7 МГц) if (vfo >= 26000001ULL && vfo <= 30000000ULL)//if (vfo >= 28000000ULL && vfo <= 29700000ULL) { lcd.setCursor(0, 1); lcd.print("10m "); } /*else // Если за границей любительских - очистка экрана { lcd.setCursor(0, 1); lcd.print(" "); }*/ //----------------------------------- // Button press changes the frequency change step for 1 Hz steps if (get_button()) { switch (radix) { case 1: radix = 10; break; case 10: radix = 100; break; case 100: radix = 1000; break; case 1000: radix = 10000; break; case 10000: radix = 100000; break; case 100000: radix = 1000000; break; case 1000000: radix = 1; break; } display_radix(); } } }
В данном виде на LCD выведена частота без учёта bfo,а хотелось бы иметь ещё и bfo1
Ну так надо пытать, я думаю, аффтора сего скетча
дело в том,что пока автор писал,я наверное спал(шучу),тема давняя,он наверное про это и забыл.Авторы в начале указаны,но редактор -радиолюбитель из Нижнего Новгорода.Если никто не сможет подсказать,то придётся поискать его данные и написать.
http://rfanat.ru/s25/dds_sio5351_pro-min.html
На Вашем месте я бы почитал описание библиотеки si5351.h и примеры ее использования.
Всем спасибо кто ответил и кто не пожелал ответить.Всё ОК!!!!.Как говорится в одном фильме,"...эта сковородка заработала".Много было ошибок,и многое меня не устраивало.Теперь не только разобрался,но и внёс своё,т.е. работает от 1000кГц до 126 мГц с разделением диапазонов на АМ, КВ-любительские и ФМ приём,переключать можно на 2-ое преобразование и с одним преобразованием.Теперь осталось печатку сворганить и посадить на плату приёмника.
Тема закрыта!!!!!!!!!!!!!!!!!!
а скетч?
Скетч был в первом сообщении, ТС не обещал результат выкладывать. Хотя я бы тоже взглянул. Но это уже скорее просьба, чем помощь...
Скетч был в первом сообщении, ТС не обещал результат выкладывать. Хотя я бы тоже взглянул. Но это уже скорее просьба, чем помощь...
это правило хорошего тона, сказал А, скажи и Б
Всем доброе время суток! Дело в том ,что все молчали, выложить скетч мне не жалко,но боюсь что получу много пощёчин типа это не так это не то.Я его делал под себя.Да ещё в плане несколько кнопок управления подключить,но по мере возможностей я это постараюсь сделать.Планы были таковые:сделать приёмник на большой диапазон.Он т.е. синтезатор уже работает от 1 до 129мГц с 1-ым ПЧ-6мГц 2-ым ПЧ-500кГц(за основу пока взял структуру UW3DI больше ничего в голову не пришло)Просто я их уже делал,а так же дала и с одним преобразованием,но не понравилось то что зеркалка проникает какие бы я на входе не делал контура,и поэтому решил с двойным преобразование.В любой момент можно их отключить.На CLK0 у меня ГПД, на CLK1 диапазонный и на CLK2 -опорник.А так же внесены диапазоны FM и выше на сколько смог.Прошу сильно не пинать.Выкладываю скетч сюда в тексте,но кого заинтересует могу прислать и сам скетч на мыло.ra4art@mail.ru
Все редактирования(ремирования) делал для себя.
Обнаружил кое что и решил вернуть обратно и попробую исправить
По зеркалке - надо правильно выбрать частоту ФОС, к примеру как у K2 или ДЛ-76 тот же, по всем диапазонам не скажу но 7ка у ДЛ-76 была изумительна...
Правда, если хотим сплошным диапазоном от 1 до 30, то тогда преобразование вверх решает проблему, но увеличивает шумы )))
Да тут речь не о преобразовании вверх или вниз,речь о двойном преобразовании.Может не прав,но мне кажется этот вариант лучше (исходя из практики того что я делал).Хотя здесь вообщем то тема не про приём.
Да тут речь не о преобразовании вверх или вниз,речь о двойном преобразовании.Может не прав,но мне кажется этот вариант лучше (исходя из практики того что я делал).Хотя здесь вообщем то тема не про приём.
двойное будет всегда проигрывать! шумы преобразования однако )))
Всем доброго дня! Помогите пожалуйста советом как сделать VFO для трансивера ПП на Arduino mega и TFT LCD 3.5"ILI9486/9488 ? Не гнобите пож коллеги. Вы же тоже вначале испытывали трудности. С уважением EU1KI.
ты сначала вообще запусти свой дисплей на Меге, штоп он хоть чота показывал. А потом будешь прикручивать куда угодно.
Tak вот я не пойму, как это сделать. Механически я подключил, экран светится. B Ардуино мега залил софт с родного сайта. А вот дальше не понятно
Всем доброго дня! Помогите пожалуйста советом как сделать VFO для трансивера ПП на Arduino mega и TFT LCD 3.5"ILI9486/9488 ? Не гнобите пож коллеги. Вы же тоже вначале испытывали трудности. С уважением EU1KI.
Я про мега не знаю,но думаю нужно просто сравнить УНО с МЕГА по портам и т.д.,а вообще напишите мне на мыло,попробую чем смогу.Я же тоже начинающий....
А почему для начала не использовать простой 2-х строчник а потом уже дальше.
Так пока в наличии только такой дисплей
Я ТФТ не занимался,но нужно посмотреть в примерах ардуино,там что такое есть.
2-х строчники по моему продаются чуть ли не в хозтоварах.Я например переделал с графического на 2-х строчник,т.к. нет пока в наличии (ещё в пути)графического.Здесь на многие мои планы не хватает места на экране,но главное что синтез уже работает.Сейчас занимаюсь сервисом