Двухтональный генератор на ардуино
- Войдите на сайт для отправки комментариев
Пнд, 07/01/2019 - 00:26
Имеется схема на базе жёской логики, паять рассыпуху как-то не комильфо, попробую заменить на ардуинку.
Пока без программирования таймеров, средствами языка в рамках концепции IDE.
Код простой (немного лишнего, в дальнейшем убрать):
/*
* Двухтональный генератор на базе ардуино нано
*/
unsigned long freq_1800;
unsigned long freq_2250;
int worked_1 = 0;
int worked_2 = 0;
void setup() {
Serial.begin(115200);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(7,HIGH);
freq_2250 = micros();
digitalWrite(8,HIGH);
freq_1800 = micros();
digitalWrite(13,HIGH);
}
void loop() {
if(micros() - freq_2250 >= 444){
digitalWrite(7,!digitalRead(7));
freq_2250 = micros();
worked_2++;
if(worked_2 == 2250){
Serial.println("2250 -worked");
worked_2 = 0;
}
}
if(micros() - freq_1800 >= 555){
digitalWrite(8,!digitalRead(8));
freq_1800 = micros();
worked_1++;
if(worked_1 == 1800){
Serial.println("1800 -worked");
worked_1 = 0;
digitalWrite(13,!digitalRead(13));
}
}
// Конец тела цикла
}
Cхема исходного устройства:
Операционник используется с единичным усилением, попробую заменить на LM358

Да, константы должны быть 222 и 277, для вывода синхронизирующей последовательности можно сделать еще один аналогичный канал с константой частоты 2222
Добавлен код синхронизирующей частоты:
/* * Двухтональный генератор на базе ардуино нано */ #include "lgtx8p.h" unsigned long freq_1; unsigned long freq_18; unsigned long freq_225; unsigned long freq_1800; unsigned long freq_2250; void setup() { pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); freq_2250 = micros(); freq_1800 = micros(); freq_225 = micros(); freq_18 = micros(); freq_1 = micros(); digitalWrite(7,HIGH); digitalWrite(8,HIGH); digitalWrite(9,HIGH); digitalWrite(10,HIGH); digitalWrite(11,HIGH); } void loop() { if(micros() - freq_1 >= 333333){ digitalWrite(7,!digitalRead(7)); freq_1 = micros(); } if(micros() - freq_18 >= 22222){ digitalWrite(8,!digitalRead(8)); freq_18 = micros(); } if(micros() - freq_225 >= 2222){ digitalWrite(9,!digitalRead(9)); freq_225 = micros(); } if(micros() - freq_1800 >= 277){ digitalWrite(10,!digitalRead(10)); freq_1800 = micros(); } if(micros() - freq_2250 >= 222){ digitalWrite(11,!digitalRead(11)); freq_2250 = micros(); } digitalWrite(13, digitalRead(7)); // Конец тела цикла }Как бы проанализировать аналоговую часть в LTSpace?
Нарисовать как-то удалось
Ну снимите АЧХ.
Какие еще идеи могут возникать при виде схемы ФНЧ.
Ну снимите АЧХ.
Какие еще идеи могут возникать при виде схемы ФНЧ.
Еще не паял, хотел проэмулировать, можно ли заменить на LM358
Почему нет, если фильтр на единицы кГц.
Только при чем здесь пайка? Я и предложил снять АЧХ на эмуляторе.
Почему нет, если фильтр на единицы кГц.
Только при чем здесь пайка? Я и предложил снять АЧХ на эмуляторе.
Так я и попросил дать ссылку на инструкцию, как это сделать, интуитивно сам не одолел )))
WDRAKULA этот эмулятор порекомендовал в ПЕСОЧНИЦЕ
Мой опыт работы с этой программой составил минут 20.
Но я так думаю, что, по общему правилу: порядок работы должен совпадать с таковым для снятия АЧХ в железе: подключить ко входу генератор, изменяя его частоту, смотреть амплитуду на выходе.
там же ссылка на статью ВалВола об элементарных способах работы.
там же ссылка на статью ВалВола об элементарных способах работы.
Почитал! Назвать сиё действо элементарным, язык не повернётся. Евгений Петрович был прав, это не для начинающих. Осталось спаять макетку и проверить подойдёт LM358 или нет )))
остановился на этом скетче:
/* * Двухтональный генератор на базе ардуино нано (С) UA6EM */ // функция установки параметров таймера для выбранной частоты (в скобках номер таймера из калькулятора) // (1) Prescaler: 1; MaxValue: 4443; Frequency: 1800.18Hz; Diff: 0.18Hz // (2) Prescaler: 32; MaxValue: 138; Frequency: 1798.56Hz; Diff: 1.44Hz // (1) Prescaler: 1; MaxValue: 3555; Frequency: 2249.72Hz; Diff: 0.28Hz // (2) Prescaler: 32; MaxValue: 110; Frequency: 2252.25Hz; Diff: 2.25Hz // (1) Prescaler: 1; MaxValue: 35555; Frequency: 225.00Hz; Diff: 0.00Hz // (0,1,2) Prescaler: 256; MaxValue: 138; Frequency: 224.82Hz; Diff: 0.18Hz enum Prescalers { PRESCALER_STOP = 0, PRESCALER_1 = 1, PRESCALER_8 = 2, PRESCALER_32 = 3, PRESCALER_64 = 4, PRESCALER_128 = 5, PRESCALER_256 = 6, PRESCALER_1024 = 7 }; void set_Timer1(){ //Freq=2250Hz uint8_t prescaler = PRESCALER_1; uint16_t topValue = 3555; pinMode(10, OUTPUT); TCCR1A = 0x10; // Инвертирование пина 10 по сравнению TCCR1B = 0x08 | prescaler; // Установить СТС режим и делитель частоты OCR1A = topValue; // установить TOP равным topValue } void set_Timer2(){ //Freq=1800Hz uint8_t prescaler2 = PRESCALER_32; uint8_t topValue2 = 138; pinMode(11, OUTPUT); TCCR2A = 0x42; // Инвертирование пина 11 по сравнению TCCR2B = 0x00 | prescaler2; // Установить СТС режим и делитель частоты OCR2A = topValue2; // установить TOP равным topValue } void start_Timer1(){ TCCR1A = 0x10; // Инвертирование пина 10 по сравнению } void start_Timer2(){ TCCR2A = 0x42; // Инвертирование пина 11 по сравнению } void setup() { // Запустим таймеры для частоты 2250 выход Pin 10 для частоты 1800 выход 11 set_Timer1(); start_Timer1(); set_Timer2(); start_Timer2(); } void loop() { }Какой смысл функций start*, если их код уже есть в функциях set* ? Или так хитро с таймерами работать нужно?
кое-что можно упростить конечно )))
PS без этих строк запускается только один таймер, пока не разбирался почему
По логике - нужно перенести их в конец функций set*, попробуй.
Запуск/остановка таймера - это запись предделителя. Сразу не стартует - видимо в самом счетчике уже число больше чем в регистре сравнения. Приходится ждать полный круг. Надо обнулять сами счетчики !
Не нужно ничего переносить. Просто убрать старты за ненужностью. И будет работать.
Не нужно ничего переносить. Просто убрать старты за ненужностью. И будет работать.
второй таймер не работал однако почему-то
А проверить?
А проверить?
тут под руками осциллографа нет сейчас
и для платы Rasberry PI Pico под MicroPython v1.19 код будет ну очень простой:
PS c пинов 22 и 21 сигнал объединить через переменный резистор, синхронизация на 20 пине,
PPS но джиттер под Питоном весьма приличный, сигнал на слух еще оценивал,
частоты посмотрел на осциллографе, подправил ;- )))
from machine import Pin, Timer tone1800 = Pin(21,Pin.OUT) tim1 = Timer() def tick1(timer): global tone1800 #1.8 килогерца tone1800.toggle() tim1.init(freq=1800*2, mode=Timer.PERIODIC, callback=tick1) tone2250 = Pin(22,Pin.OUT) tim2 = Timer() def tick2(timer): global tone2250 #2.25 килогерца tone2250.toggle() tim2.init(freq=2250*2, mode=Timer.PERIODIC, callback=tick2) sync = Pin(20,Pin.OUT) tims = Timer() def tics(timer): global sync #225 герц sync.toggle() tims.init(freq=225*2, mode=Timer.PERIODIC, callback=tics) led = Pin(25,Pin.OUT) tim = Timer() def tick(timer): global led led.toggle() tim.init(freq=2.0, mode=Timer.PERIODIC, callback=tick)че тебе надо то? инвертировать два пина с двумя разными частотами? - нафига это делать через прерывания?
Настрой два PWM таймера на две нужные частоты да и все, у Пики их 16 штук. Джиттера не будет вовсе
че тебе надо то? инвертировать два пина с двумя разными частотами? - нафига это делать через прерывания?
Настрой два PWM таймера на две нужные частоты да и все, у Пики их 16 штук. Джиттера не будет вовсе
это жеж на C++ а я тут потихоньку осваиваю Питон )))
PS в Питоне тоже можно через PWM вот и посмотрю, чуток попозжее
Переделал на PWM - сигнал мне нравится , теперь бы сравнить со скетчем на С++ ;-)))
import time from machine import Pin, PWM, Timer # Создаём объекты PWM sync = PWM(Pin(19)) tone1800 = PWM(Pin(21)) tone2250 = PWM(Pin(22)) # Устанавливаем частоты PWM sync.freq(225) tone1800.freq(1800) tone2250.freq(2250) # Устанавливаем скважность duty = 32768 sync.duty_u16(duty) tone1800.duty_u16(duty) tone2250.duty_u16(duty) # Индикация работы тонального генератора led = Pin(25,Pin.OUT) tim = Timer() def tick(timer): global led led.toggle() tim.init(freq=2.0, mode=Timer.PERIODIC, callback=tick)А девкой всё же крашеС библиотекой всё же проще )))С библиотекой всё же проще )))
абсолютно неважно через библиотеку или сам, если ты понимаешь принцип.
Вот только вопрос - понимаешь ли ты его, когда делаешь через библиотеку?
да что ж там понимать, пин, частота скважность )))
ЗЫ на удивление через библиотеку частоту устанавливает довольно точно
в это не въехал:
// Tell GPIO 0 and 1 they are allocated to the PWM gpio_set_function(0, GPIO_FUNC_PWM); gpio_set_function(1, GPIO_FUNC_PWM); // Find out which PWM slice is connected to GPIO 0 (it's slice 0) uint slice_num = pwm_gpio_to_slice_num(0); // Set period of 4 cycles (0 to 3 inclusive) pwm_set_wrap(slice_num, 30); // Set channel A output high for one cycle before dropping pwm_set_chan_level(slice_num, PWM_CHAN_A, 1); // Set initial B output high for three cycles before dropping pwm_set_chan_level(slice_num, PWM_CHAN_B, 3); // Set the PWM running pwm_set_enabled(slice_num, true); // Note we could also use pwm_set_gpio_level(gpio, x) which looks up the // correct slice and channel for a given GPIO.в это не въехал:
сравни :)
https://arduino.ru/forum/apparatnye-voprosy/raspberry-pi-pico?page=5#com...
в это не въехал:
сравни :)
https://arduino.ru/forum/apparatnye-voprosy/raspberry-pi-pico?page=5#com...
для меня это пока сложно, но так как нашёл библиотеку изучать сей вопрос буду неспешно...
Это ты напрасно недооцениваешь 64 градации ШИМ, для аналогового телевидения 10 градаций яркости было великолепно ))) (ТИТ-0249)
А девкой всё же крашеС библиотекой всё же проще )))Т.е. вот этот небольшой кусок скетча заливаем в ардуинку и получаем двухтоннальный генератор как по схеме с первой страницы?
да, выход на переменный резистор с двумя тумблерами, далее в качестве операционника LM358 (один корпус), всё как по схеме только значительно проще получается, только процессор болтается без дела, нехорошо, надо бы еще чему найти применение, надо подумать, к примеру сплиттер и индикатор CAT системы, тем более что к YAESU библиотека (благодаря DetSimen) написана...
Понятно, ждем дальнейшего развития девайса
Понятно, ждем дальнейшего развития девайса
мысли есть, что добавляем?
На ослике синусоиды "чистые" без лесенок?
Что с гармониками? по бокам не серит?
На ослике синусоиды "чистые" без лесенок?
откуда там синусоиды?
На ослике синусоиды "чистые" без лесенок?
откуда там синусоиды?
Имелось ввиду после операционника
На ослике синусоиды "чистые" без лесенок?
откуда там синусоиды?
Имелось ввиду после операционника
пока только цифру отлаживал... я тут как бы два проектика одновременно допиливаю, сканер 2400 - 2500 на ESP32 или RP2040, и NRF24L01, сейчас выложу крайнюю версию...
Ослика у меня к сожалению нету, могу скинуть картинку только с Hantek DSO2D10 )))
ЗЫ (приму в дар ослика)
Ослика у меня к сожалению нету, могу скинуть картинку только с Hantek DSO2D10 )))
ЗЫ (приму в дар Hantek DSO2D10) :)
Ослика у меня к сожалению нету, могу скинуть картинку только с Hantek DSO2D10 )))
ЗЫ (приму в дар Hantek DSO2D10) :)
да мы тут все его по наводке BOOMа накупили
и для платы Rasberry PI Pico под MicroPython v1.19 код будет ну очень простой:
PS c пинов 22 и 21 сигнал объединить через переменный резистор, синхронизация на 20 пине,
PPS но джиттер под Питоном весьма приличный, сигнал на слух еще оценивал,
частоты посмотрел на осциллографе, подправил ;- )))
from machine import Pin, Timer tone1800 = Pin(21,Pin.OUT) tim1 = Timer() def tick1(timer): global tone1800 #1.8 килогерца tone1800.toggle() tim1.init(freq=1800*2, mode=Timer.PERIODIC, callback=tick1) tone2250 = Pin(22,Pin.OUT) tim2 = Timer() def tick2(timer): global tone2250 #2.25 килогерца tone2250.toggle() tim2.init(freq=2250*2, mode=Timer.PERIODIC, callback=tick2) sync = Pin(20,Pin.OUT) tims = Timer() def tics(timer): global sync #225 герц sync.toggle() tims.init(freq=225*2, mode=Timer.PERIODIC, callback=tics) led = Pin(25,Pin.OUT) tim = Timer() def tick(timer): global led led.toggle() tim.init(freq=2.0, mode=Timer.PERIODIC, callback=tick)Этот скетч работает безукоризненно, а вот со скетчем на С++ есть проблема