Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 5 из 6 ПерваяПервая ... 23456 ПоследняяПоследняя
Показано с 41 по 50 из 51

Тема: AD9850 - помеха-щелчок на выходе в момент запоминания частоты

  1. #41
    Добавлено через 18 минут(ы):

    Цитата Сообщение от DX888 Посмотреть сообщение
    Так, набросал примерную схему реализации запоминания частоты
    ДДС, то что Вы штриховой линией показали, не нужно питать от резерва. Она много потребляет, да и для записи ЕЕПРОМ она никаких функций не несет.

    Цитата Сообщение от DX888 Посмотреть сообщение
    Вопрос 4. Можно-ли использовать ногу А1 ардуино для этих целей? Я в программировании разбираюсь очень плохо, но, чутьём и логикой думаю так:
    - в начале скетча как-то пишем, что на А1 по умолчанию должен быть логический 0 (Low), то есть чтобы сама ардуино не подавала на него напряжение.
    - в конце скетча пишем, если там 1, то ничего не делаем. Если 0 (пропало напряжение) - записываем последнюю частоту в память. Всё верно?
    Смотрите по схеме Ардуино и даташит на контроллер. Что такое А1. Если эта ножка подключена к выводу контроллера, который является входом АЦП, тогда этот вход можно использовать. ЕЭто может быть ADC0-ADC7. То есть 0-канал или 7. Его настраиваете на вход. В программе измеряете на нем напряжение (посмотрите, наверняка у Вас в скетче есть уже такие функции, которые проверяют какая нажата кнопка, если кнопки работают от АЦП). Только там может быть задействован другой канал АЦП (АЦП у нас один, но мы выбираем к какому входу его подключить). То есть, точно также как Вы обращаетесь к функции опроса кнопок, Вы обращаетесь к функции проверки питания. Например обзовите эту функцию "Power". В основной функции, которая loop впишите строку обращения к функции "Power", прочитаете значение измеренное со входа АЦП. При 5 вольтах оно должно быть 1024. Задайте себе порог, например 200. То есть если значение, что Вы прочитали из АЦП меньше, чем 200, пишем частоту в ЕЕПРОМ, даем значение какой-нибудь переменной (например Z =1) и "крутимся" в цикле до тех пор, пока Z=1. В самом начале программы, надо этой переменной задать значение Z=0, иначе программа попадет на нее, и если она будет равна 1, зациклится.
    Но это так, типа алгоритма, подробности Вы вполне можете извлечь из скетча. прежде всего, разберитесь как у Вас организован опрос кнопок. По подобию и поступайте. Но это, если кнопки у Вас работают от АЦП, если по-другому, вся моя писанина, ни к чему.
    Последний раз редактировалось Владимир_К; 09.01.2017 в 11:39.


  2. #42
    Всё отлично, спасибо всем, помогли со скетчем. Спаял схему, всё работает, частота после отключения питания запоминается.

    Вот скетч:

    Скрытый текст

    /*
    Main code by Richard Visokey AD7C - www.ad7c.com
    Revision 2.0 - November 6th, 2013
    */

    // Include the library code
    #include <LiquidCrystal.h>
    #include <rotary.h>
    #include <EEPROM.h>

    //Setup some items
    #define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
    #define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
    #define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
    #define RESET 11 // Pin 11 - connect to reset pin (RST)
    #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
    Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
    LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
    int_fast32_t rx=3650000; // Base (starting) frequency of VFO. This only loads once. To force load again see ForceFreq variable below.
    int_fast32_t rx2=1; // variable to hold the updated frequency
    int_fast32_t increment = 10; // starting VFO update increment in HZ.
    int_fast32_t iffreq = 0; // Intermedite Frequency - Amount to subtract (-) from base frequency. ********************************************
    int buttonstate = 0;
    int buttonstate2 = 0;
    int GoIF = 1;
    String hertz = "10 Hz";
    int hertzPosition = 5;
    byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //Placeholders
    String freq; // string to hold the frequency


    int ForceFreq = 0; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!



    void setup() {
    pinMode(A0,INPUT); // Connect to a button that goes to GND on push
    pinMode(A1,INPUT); // IF sense **********************************************
    digitalWrite(A0,HIGH);
    digitalWrite(A1,LOW);
    lcd.begin(16, 2);
    PCICR |= (1 << PCIE2);
    PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
    sei();
    pinMode(FQ_UD, OUTPUT);
    pinMode(W_CLK, OUTPUT);
    pinMode(DATA, OUTPUT);
    pinMode(RESET, OUTPUT);
    pulseHigh(RESET);
    pulseHigh(W_CLK);
    pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
    lcd.setCursor(hertzPosition,1);
    lcd.print(hertz);

    // Load the stored frequency
    if (ForceFreq == 0) {
    freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
    rx = freq.toInt();
    }
    }

    void loop() {
    // Update the display and frequency if the new Freq NEQ the old Freq
    if (rx != rx2){
    showFreq();
    sendFrequency(rx);
    rx2 = rx;
    }

    // Rotate through the rate of tuning as you hold down the button
    buttonstate = digitalRead(A0);
    if(buttonstate == LOW) {
    setincrement();
    };

    // Writing current frequency to EEPROM triggered by A1
    buttonstate = digitalRead(A1);
    if (buttonstate != buttonstate2 && buttonstate == LOW){
    storeMEM();
    };
    buttonstate2 = buttonstate;
    };

    // Interrupt routine to catch the rotary encoder
    ISR(PCINT2_vect) {
    unsigned char result = r.process();
    if (result) {
    if (result == DIR_CW){rx=rx+increment;}
    else {rx=rx-increment;};
    if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
    if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
    }
    }

    // frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
    void sendFrequency(double frequency) {
    if (GoIF == 1){frequency=frequency-iffreq;}; //If pin = low, subtract the IF frequency.
    int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850. You can make 'slight' tuning variations here by adjusting the clock frequency.
    for (int b=0; b<4; b++, freq>>=8) {
    tfr_byte(freq & 0xFF);
    }
    tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
    pulseHigh(FQ_UD); // Done! Should see output
    }
    // transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
    void tfr_byte(byte data)
    {
    for (int i=0; i<8; i++, data>>=1) {
    digitalWrite(DATA, data & 0x01);
    pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
    }
    }

    void setincrement(){
    if(increment == 10){increment = 100; hertz = "100 Hz"; hertzPosition=5;}
    else if (increment == 100){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
    else if (increment == 1000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
    else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
    lcd.setCursor(0,1);
    lcd.print(" ");
    lcd.setCursor(hertzPosition,1);
    lcd.print(hertz);
    delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
    };

    void showFreq(){
    millions = int(rx/1000000);
    hundredthousands = ((rx/100000)%10);
    tenthousands = ((rx/10000)%10);
    thousands = ((rx/1000)%10);
    hundreds = ((rx/100)%10);
    tens = ((rx/10)%10);
    ones = ((rx/1)%10);
    lcd.setCursor(0,0);
    lcd.print(" ");
    if (millions > 9){lcd.setCursor(1,0);}
    else{lcd.setCursor(2,0);}
    lcd.print(millions);
    lcd.print(".");
    lcd.print(hundredthousands);
    lcd.print(tenthousands);
    lcd.print(thousands);
    lcd.print(".");
    lcd.print(hundreds);
    lcd.print(tens);
    lcd.print(ones);
    lcd.print(" Mhz ");
    };

    void storeMEM(){
    //Write each frequency section to a EPROM slot. Yes, it's cheating but it works!
    EEPROM.write(0,millions);
    EEPROM.write(1,hundredthousands);
    EEPROM.write(2,tenthousands);
    EEPROM.write(3,thousands);
    EEPROM.write(4,hundreds);
    EEPROM.write(5,tens);
    EEPROM.write(6,ones);
    };



    В схеме единственное изменение - ёмкость накопительного конденсатора увеличил до 2200 мкф, на 1000 мкф не хватало ему, чтобы частота успевала записываться. А вообще, ставьте 3300 х 10В от компьютерных бп или материнок, чтобы с запасом было)). Только esr проверьте, чтобы не убитый был. Вот конечная схема. Может кому когда пригодится:

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

Название:	запоминание частоты2.jpg 
Просмотров:	426 
Размер:	37.5 Кб 
ID:	252508


    Запоминание частоты реализовано на вывод А1 ардуино. Стабилитрон на всякий случай оставил, для спокойствия души

    На этом всё, вопрос темы решён. Всем большое спасибо за участие, помощь и советы.

  3. Спасибо от RN4R

  4. #43
    Цитата Сообщение от DX888 Посмотреть сообщение
    Всё отлично, спасибо всем, помогли со скетчем.
    Не совсем нравятся Ваши дополнения в скетче, но раз работает... Например "buttonstate" я бы присвоил другое имя, скажем "buttonstate_1", все же это разные переменные. Или "power", так понятнее...
    Да и потом, после выполнения записи в ЕЕПРОМ, программа ведь "крутится" дальше? Я в Ардуино, "только светодиодом поморгать", но мне кажется, что именно так...и до тех пор, пока разрядится конденсатор.
    Кроме того.. Разве в ЕЕПРОМ нельзя записать переменную целиком, зачем ее преобразовывать? Также при чтении, вытаскиваем по одной цифре, "склеиваем" в строку, это тоже лишнее. Правда, это уже к теме отношения не имеет..
    Последний раз редактировалось Владимир_К; 09.01.2017 в 13:04.

  5. #44
    Цитата Сообщение от R2DHG Посмотреть сообщение
    я бы вернул EEPROM.put - вроде выше постом было, так спокойнее
    Да, из старой версии взяли)). Заменил, всё норм.

    Скрытый текст

    /*
    Main code by Richard Visokey AD7C - www.ad7c.com
    Revision 2.0 - November 6th, 2013
    */

    // Include the library code
    #include <LiquidCrystal.h>
    #include <rotary.h>
    #include <EEPROM.h>

    //Setup some items
    #define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
    #define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
    #define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
    #define RESET 11 // Pin 11 - connect to reset pin (RST)
    #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
    Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
    LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
    int_fast32_t rx=3650000; // Base (starting) frequency of VFO. This only loads once. To force load again see ForceFreq variable below.
    int_fast32_t rx2=1; // variable to hold the updated frequency
    int_fast32_t increment = 10; // starting VFO update increment in HZ.
    int_fast32_t iffreq = 0; // Intermedite Frequency - Amount to subtract (-) from base frequency. ********************************************
    int buttonstate = 0;
    int buttonstate2 = 0;
    int GoIF = 1;
    String hertz = "10 Hz";
    int hertzPosition = 5;
    byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //Placeholders
    String freq; // string to hold the frequency


    int ForceFreq = 0; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!



    void setup() {
    pinMode(A0,INPUT); // Connect to a button that goes to GND on push
    pinMode(A1,INPUT); // IF sense **********************************************
    digitalWrite(A0,HIGH);
    digitalWrite(A1,LOW);
    lcd.begin(16, 2);
    PCICR |= (1 << PCIE2);
    PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
    sei();
    pinMode(FQ_UD, OUTPUT);
    pinMode(W_CLK, OUTPUT);
    pinMode(DATA, OUTPUT);
    pinMode(RESET, OUTPUT);
    pulseHigh(RESET);
    pulseHigh(W_CLK);
    pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
    lcd.setCursor(hertzPosition,1);
    lcd.print(hertz);

    // Load the stored frequency
    if (ForceFreq == 0) {
    freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
    rx = freq.toInt();
    }
    }

    void loop() {
    // Update the display and frequency if the new Freq NEQ the old Freq
    if (rx != rx2){
    showFreq();
    sendFrequency(rx);
    rx2 = rx;
    }

    // Rotate through the rate of tuning as you hold down the button
    buttonstate = digitalRead(A0);
    if(buttonstate == LOW) {
    setincrement();
    };

    // Writing current frequency to EEPROM triggered by A1
    buttonstate = digitalRead(A1);
    if (buttonstate != buttonstate2 && buttonstate == LOW){
    storeMEM();
    };
    buttonstate2 = buttonstate;
    };

    // Interrupt routine to catch the rotary encoder
    ISR(PCINT2_vect) {
    unsigned char result = r.process();
    if (result) {
    if (result == DIR_CW){rx=rx+increment;}
    else {rx=rx-increment;};
    if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
    if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
    }
    }

    // frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
    void sendFrequency(double frequency) {
    if (GoIF == 1){frequency=frequency-iffreq;}; //If pin = low, subtract the IF frequency.
    int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850. You can make 'slight' tuning variations here by adjusting the clock frequency.
    for (int b=0; b<4; b++, freq>>=8) {
    tfr_byte(freq & 0xFF);
    }
    tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
    pulseHigh(FQ_UD); // Done! Should see output
    }
    // transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
    void tfr_byte(byte data)
    {
    for (int i=0; i<8; i++, data>>=1) {
    digitalWrite(DATA, data & 0x01);
    pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
    }
    }

    void setincrement(){
    if(increment == 10){increment = 100; hertz = "100 Hz"; hertzPosition=5;}
    else if (increment == 100){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
    else if (increment == 1000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
    else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
    lcd.setCursor(0,1);
    lcd.print(" ");
    lcd.setCursor(hertzPosition,1);
    lcd.print(hertz);
    delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
    };

    void showFreq(){
    millions = int(rx/1000000);
    hundredthousands = ((rx/100000)%10);
    tenthousands = ((rx/10000)%10);
    thousands = ((rx/1000)%10);
    hundreds = ((rx/100)%10);
    tens = ((rx/10)%10);
    ones = ((rx/1)%10);
    lcd.setCursor(0,0);
    lcd.print(" ");
    if (millions > 9){lcd.setCursor(1,0);}
    else{lcd.setCursor(2,0);}
    lcd.print(millions);
    lcd.print(".");
    lcd.print(hundredthousands);
    lcd.print(tenthousands);
    lcd.print(thousands);
    lcd.print(".");
    lcd.print(hundreds);
    lcd.print(tens);
    lcd.print(ones);
    lcd.print(" Mhz ");
    };

    void storeMEM(){
    //Write each frequency section to a EPROM slot. Yes, it's cheating but it works!
    EEPROM.put(0,millions);
    EEPROM.put(1,hundredthousands);
    EEPROM.put(2,tenthousands);
    EEPROM.put(3,thousands);
    EEPROM.put(4,hundreds);
    EEPROM.put(5,tens);
    EEPROM.put(6,ones);
    };



    Цитата Сообщение от Владимир_К Посмотреть сообщение
    Да и потом, после выполнения записи в ЕЕПРОМ, программа ведь "крутится" дальше?
    как понять - "крутится дальше"? p.s. тут еще подсказывают, что ничего не крутится, т.к. частота записывается только 1 раз, при изменении состояния А1 с 1 на 0. То есть пропало напряжение на делителе - частота записалась и всё, больше не записывается.
    Последний раз редактировалось DX888; 09.01.2017 в 13:11.

  6. #45
    Аватар для IG_58
    Регистрация
    27.10.2012
    Адрес
    Германия
    Сообщений
    13,014
    Записей в дневнике
    18
    Да, программа будет какое-то небольшое время крутиться дальше, пока напряжение питания не упадет до критического уровня, но с EEPROM.put записи в EEPROM не будет, если данные не изменились с моментa последней записи.
    Игорь

  7. #46
    В общем синтезатор работает хорошо, частоту запоминает исправно, правда в готовом виде пришлось ёмкость накопительного кондёра увеличить до 4700мкФ, при 3300мкФ не хватало энергии.

    Сейчас интересует другой вопрос. Тему создавать новую не стал. Вот работающий скетч:

    Скрытый текст

    /*
    Main code by Richard Visokey AD7C - www.ad7c.com
    Revision 2.0 - November 6th, 2013
    */

    // Include the library code
    #include <LiquidCrystal.h>
    #include <rotary.h>
    #include <EEPROM.h>

    //Setup some items
    #define W_CLK 8 // Pin 8 - connect to AD9850 module word load clock pin (CLK)
    #define FQ_UD 9 // Pin 9 - connect to freq update pin (FQ)
    #define DATA 10 // Pin 10 - connect to serial data load pin (DATA)
    #define RESET 11 // Pin 11 - connect to reset pin (RST)
    #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); }
    Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses. Must be interrupt pins.
    LiquidCrystal lcd(12, 13, 7, 6, 5, 4); // I used an odd pin combination because I need pin 2 and 3 for the interrupts.
    int_fast32_t rx=3650000; // Base (starting) frequency of VFO. This only loads once. To force load again see ForceFreq variable below.
    int_fast32_t rx2=1; // variable to hold the updated frequency
    int_fast32_t increment = 10; // starting VFO update increment in HZ.
    int_fast32_t iffreq = 0; // Intermedite Frequency - Amount to subtract (-) from base frequency. ********************************************
    int buttonstate = 0;
    int buttonstate2 = 0;
    int GoIF = 1;
    String hertz = "10 Hz";
    int hertzPosition = 5;
    byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ; //Placeholders
    String freq; // string to hold the frequency


    int ForceFreq = 0; // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory. YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!



    void setup() {
    pinMode(A0,INPUT); // Connect to a button that goes to GND on push
    pinMode(A1,INPUT); // IF sense **********************************************
    digitalWrite(A0,HIGH);
    digitalWrite(A1,LOW);
    lcd.begin(16, 2);
    PCICR |= (1 << PCIE2);
    PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
    sei();
    pinMode(FQ_UD, OUTPUT);
    pinMode(W_CLK, OUTPUT);
    pinMode(DATA, OUTPUT);
    pinMode(RESET, OUTPUT);
    pulseHigh(RESET);
    pulseHigh(W_CLK);
    pulseHigh(FQ_UD); // this pulse enables serial mode on the AD9850 - Datasheet page 12.
    lcd.setCursor(hertzPosition,1);
    lcd.print(hertz);

    // Load the stored frequency
    if (ForceFreq == 0) {
    freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
    rx = freq.toInt();
    }
    }

    void loop() {
    // Update the display and frequency if the new Freq NEQ the old Freq
    if (rx != rx2){
    showFreq();
    sendFrequency(rx);
    rx2 = rx;
    }

    // Rotate through the rate of tuning as you hold down the button
    buttonstate = digitalRead(A0);
    if(buttonstate == LOW) {
    setincrement();
    };

    // Writing current frequency to EEPROM triggered by A1
    buttonstate = digitalRead(A1);
    if (buttonstate != buttonstate2 && buttonstate == LOW){
    storeMEM();
    };
    buttonstate2 = buttonstate;
    };

    // Interrupt routine to catch the rotary encoder
    ISR(PCINT2_vect) {
    unsigned char result = r.process();
    if (result) {
    if (result == DIR_CW){rx=rx+increment;}
    else {rx=rx-increment;};
    if (rx >=30000000){rx=rx2;}; // UPPER VFO LIMIT
    if (rx <=1000000){rx=rx2;}; // LOWER VFO LIMIT
    }
    }

    // frequency calc from datasheet page 8 = <sys clock> * <frequency tuning word>/2^32
    void sendFrequency(double frequency) {
    if (GoIF == 1){frequency=frequency-iffreq;}; //If pin = low, subtract the IF frequency.
    int32_t freq = frequency * 4294967295/125000000; // note 125 MHz clock on 9850. You can make 'slight' tuning variations here by adjusting the clock frequency.
    for (int b=0; b<4; b++, freq>>=8) {
    tfr_byte(freq & 0xFF);
    }
    tfr_byte(0x000); // Final control byte, all 0 for 9850 chip
    pulseHigh(FQ_UD); // Done! Should see output
    }
    // transfers a byte, a bit at a time, LSB first to the 9850 via serial DATA line
    void tfr_byte(byte data)
    {
    for (int i=0; i<8; i++, data>>=1) {
    digitalWrite(DATA, data & 0x01);
    pulseHigh(W_CLK); //after each bit sent, CLK is pulsed high
    }
    }

    void setincrement(){
    if(increment == 10){increment = 100; hertz = "100 Hz"; hertzPosition=5;}
    else if (increment == 100){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
    else if (increment == 1000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;}
    else{increment = 10; hertz = "10 Hz"; hertzPosition=5;};
    lcd.setCursor(0,1);
    lcd.print(" ");
    lcd.setCursor(hertzPosition,1);
    lcd.print(hertz);
    delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
    };

    void showFreq(){
    millions = int(rx/1000000);
    hundredthousands = ((rx/100000)%10);
    tenthousands = ((rx/10000)%10);
    thousands = ((rx/1000)%10);
    hundreds = ((rx/100)%10);
    tens = ((rx/10)%10);
    ones = ((rx/1)%10);
    lcd.setCursor(0,0);
    lcd.print(" ");
    if (millions > 9){lcd.setCursor(1,0);}
    else{lcd.setCursor(2,0);}
    lcd.print(millions);
    lcd.print(".");
    lcd.print(hundredthousands);
    lcd.print(tenthousands);
    lcd.print(thousands);
    lcd.print(".");
    lcd.print(hundreds);
    lcd.print(tens);
    lcd.print(ones);
    lcd.print(" Mhz ");
    };

    void storeMEM(){
    //Write each frequency section to a EPROM slot. Yes, it's cheating but it works!
    EEPROM.put(0,millions);
    EEPROM.put(1,hundredthousands);
    EEPROM.put(2,tenthousands);
    EEPROM.put(3,thousands);
    EEPROM.put(4,hundreds);
    EEPROM.put(5,tens);
    EEPROM.put(6,ones);
    };



    Что нужно изменить в коде, чтобы на том же выходе вместо синуса появился меандр?

    p.s. Уточнение. На плате DDS AD9850 есть 2 выхода синуса и 2 выхода меандра. Проверил осцилом - меандра на выходе нет. То есть надо как-то включить меандр на этих выводах, но как?..
    Последний раз редактировалось DX888; 25.05.2017 в 16:27.

  8. #47
    p.s.2. Почитал, что чтобы появился менадр, надо покрутить подстроечный резистор на плате. Покрутил, сигнал на выходах появился, но это не меандр, это фигня какая-то. От вращения резистора меняется форма.

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

Название:	сигнал2.jpg 
Просмотров:	387 
Размер:	183.7 Кб 
ID:	263390Нажмите на изображение для увеличения. 

Название:	сигнал1.jpg 
Просмотров:	395 
Размер:	187.2 Кб 
ID:	263391

    Должен же быть программный способ создать именно меандр на выходах?...

    Если что, DDS модуль у меня такой https://ru.aliexpress.com/item/AD985...6-1f3789e22a47

  9. #48

    Регистрация
    28.04.2005
    Адрес
    Московская обл., г. Мытищи
    Сообщений
    3,923
    Позывной
    ex RW3DKC
    На компаратор подают, а подстроечник как раз регулирует уровень сранения. Это вы на какой частоте смотрели ?

  10. #49
    Смотрели на двух выводах платы, с которых должен выходить меандр. Сигнал на ногах одинаковый, просто сдвинут по фазе

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

Название:	выводы.jpg 
Просмотров:	421 
Размер:	167.4 Кб 
ID:	263394

    Добавлено через 55 минут(ы):

    Цитата Сообщение от R2DHG Посмотреть сообщение
    Это вы на какой частоте смотрели ?
    прошу прощения, не увидел слово "частоты", подумал, что про выводы)), на частоте 3.5МГц, но и ниже и выше (1-10МГц) - на выходе вот такая кракозябра, а не меандр
    Последний раз редактировалось DX888; 25.05.2017 в 19:29.


  11. #50

    Регистрация
    28.04.2005
    Адрес
    Московская обл., г. Мытищи
    Сообщений
    3,923
    Позывной
    ex RW3DKC
    Да уж... так себе сигнал. У меня на AD9851 вроде получше на таких частотах, но тоже не особо. Поделить триггером разве что. Если внешний формирователь добавить как тут http://yl2gl.ucoz.net/_fr/0/7807766.jpg получается неплохой прямоугольник на КВ частотах, правда я использовал тоже с AD995x такой.

Страница 5 из 6 ПерваяПервая ... 23456 ПоследняяПоследняя

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

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

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

Похожие темы

  1. Скомпилированная таблица частот на текущий момент
    от UA9ARM в разделе Правовой практикум радиолюбителя
    Ответов: 56
    Последнее сообщение: 06.11.2015, 18:43
  2. Ответов: 7
    Последнее сообщение: 27.12.2011, 15:29
  3. КВ синтезатор частоты с дискретным переключением частоты
    от user_199 в разделе Трансиверы, приемники КВ/УКВ
    Ответов: 8
    Последнее сообщение: 05.06.2011, 20:32
  4. Ответов: 61
    Последнее сообщение: 26.11.2009, 10:37

Ваши права

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