генератор импульсов 0 - 40МГц

Тема в разделе "Технологии радиолюбителя", создана пользователем REm, 28 июл 2016.

  1. REm

    REm Гик

    Код (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 мс
    }
    Наткнулся на братском сайте.
    Требуется модуль генератора)
     
    Последнее редактирование: 28 июл 2016
  2. DIYMan

    DIYMan Guest

    У меня есть сильные сомнения относительно 40 МГц, ибо - digitalWrite где только можно. Вы замеряли реальную частоту генерации?
     
  3. REm

    REm Гик

    требуется модуль генератор.
    с данной темой я поспешил, ибо невнимателен. Искал пример кода на 7кГц, наткнулся на этот и на радостях даже не проверил.
     
  4. CryNET

    CryNET Гик

    А как возможно сделать генератор 40Мгц, когда сама Arduino - 16МГц (Uno) ? :)
    Для 40МГц, в случае генерации сигнала "меандра", необходим период равный 0,025 мкс (!). У простой Arduino вроде нету такой задержки, минимум 1 (?)

    /* Я бы на 555 таймере сделал, вроде находил схемы с регулировкой частоты, как раз в таком диапазоне... */
     
  5. REm

    REm Гик

    требуется модуль-генератор
     
  6. ostrov

    ostrov Гуру

    delayMicroseconds(25);

    Но 40МГц все равно не потянет даже если переключать портами без задержки.
     
  7. ANV

    ANV Гуру

    25нс, на не микро
    И это период. Для скважности 2 надо менять состояние ножки раз в 12.5нс
     
  8. ostrov

    ostrov Гуру

    Где то тут я публиковал результаты максимально быстрого "блинка", надо поискать.
     
  9. ostrov

    ostrov Гуру

    Вот, нашел. Удалось получить 8МГц на пине, что является вполне ожидаемым пределом для 16МГцной системы.
     
  10. CryNET

    CryNET Гик

    Да, это 25 мкс, а надо 0,025 мкс ( на тышу домножить и получим 25нс ), но выше уже поправили

    Именно это я и имел ввиду ;)

    Быть может на Arduino с ARM на борту это реально, но не для UNO-подобных :)