Alexander 1971, гадать на кофейной гуще трудно, приведите схему включения и скетч, чтобы было что проанализировать.
Alexander 1971, гадать на кофейной гуще трудно, приведите схему включения и скетч, чтобы было что проанализировать.
#include <si5351.h>
#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
// переменные нужные для кнопок 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);
// Для кварцевых резонаторов со значением 8000 МГц.
volatile uint32_t LSB = 799900000ULL; //частота ОГ(гетеродина) для "верхней" боковой. Настр. на ниж. скат КФ.
volatile uint32_t USB = 800200000ULL; //частота ОГ(гетеродина) для "нижней" боковой. Настр. на вверхн. скат КФ.
volatile uint32_t bfo = 800200000ULL; //стартовать с "верхней" ...
//Эти USB/LSB частоты добавляется или вычитается из частоты VFO в "void loop()"
//В этом примере если начальная частота будет 14.20000 плюс 9.001500 то на выходе clk0 = 23.2015Mhz
volatile uint32_t vfo = 350000000ULL / 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(ENCODE R_BTN))
{
delay(20);
if (!digitalRead(ENCODE R_BTN))
{
while (!digitalRead(ENCODE R_BTN));
return 1;
}
}
return 0;
}
/******************** ******************/
/*Отображает частоту */
/******************** ******************/
void display_frequency()
{
uint16_t f, g;
lcd.setCursor(3, 0);
f = vfo / 1000000; //переменная теперь vfo вместо "частоты"
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.print("RA9QAI SI5351"); // текст на экране - " HELLO !!! " //отменил //
delay(7000); // Время на прочтение начального сообщения 3 сек // отменил // и добавил время было 3000
Serial.begin(19200);
lcd.begin(16, 2); // Initialize and clear the LCD
lcd.clear();
Wire.begin();
si5351.set_correctio n(80235000); //**mine. Эскиз калибровки находится в файле/Examples/si5351Arduino//было (80235000)
//где вы можете определить коррекцию с помощью последовательного монитора.
//ввести калибровочное знечение в строчке si5351.set_correctio n(хххххххх).
//Нужно вычислить запустив "si5351calibrati on" в папке с примерами библиотеки si5351.
//initialize the Si5351
si5351.init(SI5351_C RYSTAL_LOAD_8PF, 0); //Если вы используете кристалл с частотой 27 МГц, введите 27000000 вместо 0
//0 - это частота кристалла по умолчанию 25 МГц.
si5351.set_pll(SI535 1_PLL_FIXED, SI5351_PLLA);
//Установите CLK0 для вывода начальной частоты "vfo", как указано выше с помощью 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_freq( bfo, 0, SI5351_CLK2);
//si5351.drive_strengt h(SI5351_CLK0,SI5351 _DRIVE_2MA); //you can set this to 2MA, 4MA, 6MA or 8MA
//si5351.drive_strengt h(SI5351_CLK1,SI5351 _DRIVE_2MA); //be careful though - measure into 50ohms
//si5351.drive_strengt h(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(12, OUTPUT); // для кнопки УВЧ = A2
pinMode(13, OUTPUT); // для кнопки АТТ = A1
// Порты, пины управл. напр. для дешифр. CD4028
pinMode(14, OUTPUT); // b0 для A
pinMode(15, OUTPUT); // b1 для B
pinMode(16, OUTPUT); // b2 для D
pinMode(17, 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, 0, SI5351_CLK2);
Serial.println("We'v e switched from LSB to USB");
}
else if (vfo < 10000000ULL & tbfo != "LSB")
{
bfo = LSB;
tbfo = "LSB";
si5351.set_freq( bfo, 0, SI5351_CLK2);
Serial.println("We'v e 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(12, LOW); // на пине нулевой уровень
digitalWrite(13, LOW);
lcd.setCursor(5, 1);
lcd.print(" "); // "пустое место"
//здесь может быть любое ваше действие
}
if (regim == 2) //второй режим - вкл. УВЧ
{
digitalWrite(12, LOW); //включает PRE
digitalWrite(13, HIGH);
lcd.setCursor(5, 1); // место на экране для PRE
lcd.print("PRE");
//здесь может быть любое ваше действие
}
if (regim == 3) //третий режим - очистка экрана
{
digitalWrite(12, LOW); //
digitalWrite(13, LOW);
lcd.setCursor(5, 1); // место текста на экране
lcd.print(" "); // "пустое место"
//здесь может быть любое ваше действие
}
if (regim == 4) //третий режим - вкл. АТТ
{
digitalWrite(12, HIGH); //включает АТТ
digitalWrite(13, 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(14, LOW); // на пине нулевой уровень
digitalWrite(15, LOW); // на пине нулевой уровень
digitalWrite(16, LOW); // на пине нулевой уровень
digitalWrite(17, LOW); // на пине нулевой уровень
}
// Band 80
if (vfo >= 3000001ULL && vfo <= 5000000ULL)
{
digitalWrite(14, HIGH); // на пине высокий уровень
digitalWrite(15, LOW); // на пине нулевой уровень
digitalWrite(16, LOW); // на пине нулевой уровень
digitalWrite(17, LOW); // на пине нулевой уровень
}
// Band 40
if (vfo >= 5000001ULL && vfo <= 8000000ULL)
{
digitalWrite(14, LOW); // на пине нулевой уровень
digitalWrite(15, HIGH); // на пине высокий уровень
digitalWrite(16, LOW); // на пине нулевой уровень
digitalWrite(17, LOW); // на пине нулевой уровень
}
// Band 30
if (vfo >= 8000001ULL && vfo <= 120000000ULL)
{
Выдаёт заниженные частоты, как исправить
А это схема . На выходе на 1 мгц меньше
не то что бы мне было лень скроллить, но уважаемый люди убирают исходники в тегиКод:...
САНЬКА, Вы только спрашивать умеете, ответы не читаете?
#1727
САНЬКА,
На модуле сишки кварц или генератор на какую частоту?
Извиняйте если чего не так. Кварц на 25 мгц.
Нет хардуер, чтобы попробовать. Могут быть неточности (напр. при перемещении начального курсора на количество символов для печати).
Строки 981..985, заменить содержимое:
Код:void showFrequency(int_fast32_t lrx) { char buffer[15]; utoa_fast_div(lrx, buffer, sizeof(buffer)); lcd.setCursor(3, 0); lcd.print(buffer);Код:void showFrequency(int_fast32_t lrx) { lcd.setCursor(6, 0); lcd.print(" "); lcd.setCursor(6, 0); lcd.print(lrx);
Нет что то пошло не так. В первой строке вместо 150000 kHz теперь пишет 150000000
Не знаю идею об необходимости изменении. При необходимости добавьте математическую операцию.
напр:
Код:lcd.print(lrx / 1000);
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)