Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 92 из 128 ПерваяПервая ... 428289909192939495102 ... ПоследняяПоследняя
Показано с 911 по 920 из 1275

Тема: Синтезатор за полчаса

  1. #911
    Аватар для IG_58
    Регистрация
    27.10.2012
    Адрес
    Германия
    Сообщений
    12,968
    Записей в дневнике
    18
    Alexander 1971, гадать на кофейной гуще трудно, приведите схему включения и скетч, чтобы было что проанализировать.
    Игорь


  2. #912
    #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)
    {
    Выдаёт заниженные частоты, как исправить

    Нажмите на изображение для увеличения. 

Название:	sint_mod_si5351a.jpg 
Просмотров:	670 
Размер:	134.9 Кб 
ID:	371867 А это схема . На выходе на 1 мгц меньше

  3. #913
    Аватар для EU1SW
    Регистрация
    01.07.2009
    Адрес
    Originally Minsk, but QRM ) near Minsk/2
    Сообщений
    3,846
    Записей в дневнике
    1
    Позывной
    EU1SW
    не то что бы мне было лень скроллить, но уважаемый люди убирают исходники в теги
    Код:
    ...
    73! ***a few homemade DDC|DUC rigs, Malamute DDC, Storch-X DDC 7"

  4. Спасибо от cerber38, IG_58

  5. #914
    Аватар для IG_58
    Регистрация
    27.10.2012
    Адрес
    Германия
    Сообщений
    12,968
    Записей в дневнике
    18
    САНЬКА, Вы только спрашивать умеете, ответы не читаете?

    #1727
    Игорь

  6. #915

    Регистрация
    15.02.2014
    Адрес
    Алексеевка (город на Тихой Сосне).
    Сообщений
    2,624
    Записей в дневнике
    1
    Позывной
    RC3ZQ (ex RA3ZQN)
    САНЬКА,
    На модуле сишки кварц или генератор на какую частоту?

  7. #916
    Извиняйте если чего не так. Кварц на 25 мгц.

  8. #917

    Регистрация
    01.10.2017
    Адрес
    Красноярский край
    Сообщений
    106
    Всем доброго времени суток!!!!
    Подскажите как в скетче убрать с первой строки запятую и два нуля, оставив только целое число ? Пост 770 этого форума Нажмите на изображение для увеличения. 

Название:	2.jpg 
Просмотров:	101 
Размер:	151.3 Кб 
ID:	378520

  9. #918

    Регистрация
    12.09.2006
    Адрес
    Болгария, Силистра, KN34PC
    Сообщений
    1,414
    Позывной
    LZ2WSG
    Нет хардуер, чтобы попробовать. Могут быть неточности (напр. при перемещении начального курсора на количество символов для печати).

    Строки 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);

  10. #919

    Регистрация
    01.10.2017
    Адрес
    Красноярский край
    Сообщений
    106
    Нет что то пошло не так. В первой строке вместо 150000 kHz теперь пишет 150000000


  11. #920

    Регистрация
    12.09.2006
    Адрес
    Болгария, Силистра, KN34PC
    Сообщений
    1,414
    Позывной
    LZ2WSG
    Не знаю идею об необходимости изменении. При необходимости добавьте математическую операцию.
    напр:
    Код:
    lcd.print(lrx / 1000);

Страница 92 из 128 ПерваяПервая ... 428289909192939495102 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Сдох синтезатор
    от RM9WY в разделе FT-817
    Ответов: 1
    Последнее сообщение: 17.03.2015, 17:10
  2. Синтезатор
    от Сереня в разделе Для начинающих
    Ответов: 8
    Последнее сообщение: 31.07.2014, 14:53
  3. Узел крепления для спайдера за полчаса
    от ГУН в разделе Антенная механика
    Ответов: 18
    Последнее сообщение: 07.10.2012, 18:16
  4. Синтезатор ПЧ
    от geron2008 в разделе Технический кабинет
    Ответов: 15
    Последнее сообщение: 28.03.2011, 12:37
  5. Синтезатор
    от RA0CHE в разделе Конструкции на микроконтроллерах для радиолюбителей
    Ответов: 4
    Последнее сообщение: 22.04.2008, 06:03

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •