Тут найдете это и многое другое: https://sites.google.com/site/ja2gqp/
А описание есть в самом блоге: http://ja2gqp.blogspot.com/
Тут найдете это и многое другое: https://sites.google.com/site/ja2gqp/
А описание есть в самом блоге: http://ja2gqp.blogspot.com/
Я запитывал от 7805, после диод, с него на 1117 в 3,3 вольт. http://ja2gqp.blogspot.com/2016/06/si5351-vfo.html?m=1
Спасибо от Wik
Здравствуйте!Не компилируется программа для Ардуино: синтезатор-генератор.( 24-страница).Я так понимаю, надо изменить данные где-то или ввести новые.Но где и какие не могу пока понять-мало опыта.Конкретно мне нужен генератор 9-10 мгц без записи ПЧ. Остальные программы(примеры) для Ардуино записываются и функционируют.
Есть такое с самой новой версией библиотеки. Попробуйте заменить библиотеку, взяв из того архива со скетчем. У меня в среде 1.8.5 компилировалось нормально пока библиотеку не обновил (правда какая версия была до обновления не помню).
Изменились вызовы функций
si5351.init(SI5351_C RYSTAL_LOAD_8PF, 0, 0); //3 параметра вместо 2х
si5351.set_correctio n(cal_factor, SI5351_PLL_INPUT_XO) ; //2 параметра вместо одного
si5351.set_freq(targ et_freq, SI5351_CLK0); //2 параметра вместо 3х
Поправил скетч под новую версию:
Скрытый текст
/*
Вся эта программа изначально написана NT7S и SQ9NJE.
Оригинальный код, немного подправленный мною, под мои нужды.
Ознакомится с оригиналом можно здесь
http://nt7s.com/
http://sq9nje.pl/
http://ak2b.blogspot.com/
*/
#include <Rotary.h>
#include <si5351.h>
#include <Wire.h>
#include <LiquidCrystal.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 11
#define LCD_RS 5
#define LCD_E 6
#define LCD_D4 7
#define LCD_D5 8
#define LCD_D6 9
#define LCD_D7 10
// Здесь настройки пинов для управления 74HC595
//Пин подключен к ST_CP входу 74HC595
//int latchPin = 16;
//Пин подключен к SH_CP входу 74HC595
//int clockPin = 17;
//Пин подключен к DS входу 74HC595
//int dataPin = 15;
// переменные нужные для кнопок PRE/ATT
int regim=1; // для кнопки
int flag=0; // для кнопки
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7); // LCD - pin assignement in
Si5351 si5351;
Rotary r = Rotary(ENCODER_A, ENCODER_B);
// Для кварцевых резонаторов со значением 9 МГц.
volatile uint32_t LSB = 886300000ULL; //частота ОГ(гетеродина) для "нижней" боковой. Настр. на ниж. скат КФ.
volatile uint32_t USB = 886700000ULL; //частота ОГ(гетеродина) для "верхней" боковой. Настр. на вверхн. скат КФ.
volatile uint32_t bfo = 886700000ULL; //стартовать с "верхней" ...
//Эти USB/LSB частоты добавляется или вычитается из частоты VFO в "void loop()"
//В этом примере если начальная частота будет 14.20000 плюс 9.001500 то на выходе clk0 = 23.2015Mhz
volatile uint32_t vfo = 710000000ULL / SI5351_FREQ_MULT; //стартовая частота при запуске синтезатора.
volatile uint32_t radix = 100000; // Шаг перестройки по умолчанию при старте = 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()
{
//pinMode(latchPin, OUTPUT); //для 74hc595
//pinMode(clockPin, OUTPUT); //
//pinMode(dataPin, OUTPUT); //
// начальное сообщение
lcd.print("SINTIZER Si5351"); // текст на экране - " HELLO !!! "
delay(3000); // Время на прочтение начального сообщения 3 сек
Serial.begin(19200);
lcd.begin(16, 2); // Initialize and clear the LCD
lcd.clear();
Wire.begin();
si5351.set_correction(80235000, SI5351_PLL_INPUT_XO); //**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, 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_CLK0);
volatile uint32_t vfoT = (vfo * SI5351_FREQ_MULT) + bfo;
tbfo = "USB";
// Set CLK2 to output bfo frequency
si5351.set_freq( bfo, SI5351_CLK2);
//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
#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(16,OUTPUT); // для кнопки УВЧ = A2
pinMode(15,OUTPUT); // для кнопки АТТ = A1
}
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_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, 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, 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(14)==HIGH&&flag==0)//если кнопка нажата
// и перемення flag равна 0 , то ...
{
regim++;
flag=1;
//это нужно для того что бы с каждым нажатием кнопки
//происходило только одно действие
// плюс защита от "дребезга" 100%
if(regim>4)//ограничим количество режимов
{
regim=1;//так как мы используем только одну кнопку,
// то переключать режимы будем циклично
}
}
if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата
//и переменная flag равна - 1 ,то ...
{
flag=0;//обнуляем переменную "knopka"
}
if(regim==1)//первый режим - очистка экрана
{
digitalWrite(15,LOW);// на пине нулевой уровень
digitalWrite(16,LOW);
lcd.setCursor(5, 1);
lcd.print(" "); // "пустое место"
//здесь может быть любое ваше действие
}
if(regim==2)//второй режим - вкл. УВЧ
{
digitalWrite(16,HIGH);//включает PRE
digitalWrite(15,LOW);
lcd.setCursor(5, 1); // место на экране для PRE
lcd.print("PRE");
//здесь может быть любое ваше действие
}
if(regim==3)//третий режим - очистка экрана
{
digitalWrite(15,LOW);//
digitalWrite(16,LOW);
lcd.setCursor(5, 1); // место текста на экране
lcd.print(" "); // "пустое место"
//здесь может быть любое ваше действие
}
if(regim==4)//третий режим - вкл. АТТ
{
digitalWrite(15,HIGH);//включает АТТ
digitalWrite(16,LOW);
lcd.setCursor(5, 1); // место на экране для АТТ
lcd.print("ATT");
}
// 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();
}
}
}
Последний раз редактировалось R2DHG; 08.11.2018 в 16:52.
Большое спасибо!Только что заменил библиотеку на "Si5351Arduino-master" и всё загрузилось.
Надо только разобраться с выходными частотами и загрузить нужные.Спасибо.
Когда выдает такое сообщение, это значит, что выражение, например в данном случае "SI5351_FREQ_MUL T" нигде не определено, а компьютер, понятно, гадать не будет, что это такое. Открываете файл библиотеки (Si5351.ccp или Si5351.h) любым редактором, включаете опцию поиск и ищете это выражение и, убеждаетесь, что его в вашей библиотеке нет, поэтому компилировать не нужно и пытаться.
Похоже автор библиотеки неплохо так её меняет от версии к версии. У меня немного другие ошибки были - видимо еще какая то другая версия была.
Спасибо от ВЕРН
ВЕРН, версия библиотеки Si5351 вероятно v1.1.2.
Попробуйте так, а и сама библиотека загружаю отдельно.
Все версии etherkit NT7S Library for the Si5351:
https://github.com/etherkit/Si5351Arduino/releases
Последний раз редактировалось veso74; 08.11.2018 в 18:06.
Спасибо от ВЕРН
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)