Противофазный генератор с ругулирумемой частотой

Ислам Урус
Offline
Зарегистрирован: 08.07.2016
int ms = 5;                  // начальное значение 5 мс

void setup() 
{
pinMode(A0, INPUT);          // аналоговый вход А0
pinMode(2, OUTPUT);          // выход пин 2
pinMode(3, OUTPUT);          // выход пин 3

} 

void loop() 
{ 
int ms = analogRead(0);       
ms = map(ms, 0, 1023, 0, 50);  // переносим значение с аналогового входа 0 до 1023) в 8 бит (0..255 )
digitalWrite(2, HIGH);         // светодиод под номером 2 вкл
digitalWrite(3, LOW);          // светодиод под номером 3 откл
delay(ms);                     // задержка
digitalWrite(2, LOW);          // светодиод под номером 2 откл
digitalWrite(3, HIGH);         // светодиод под номером 3 вкл
delay(ms);                     // задержка
} 




 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я так понимаю, что другие характерстики как то:

- диапазон рабочих частот,

- стабильность частоты,

- регулировка скважности,

- стабильность скважности,

и пр. Вас не интересуют?

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Здравствуйте, у меня возникла проблема со скетчем, если вращать ручку потенциометра в сторону увеличения при приближении к крайнему значению один светодиод тухнет, а у другого светодиода увеличивается свечение. И еще начальное значение int sm = 5; не слушается т.е. при изменении значения, частота не меняется. Может кто знает в чем проблема?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

2. Начну со второго вопроса: программа написана именно так, что от начального значения ничего не зависит, т.к. это значение переопределяется перед первым использованием.

1. А вот по первому вопросу - это именно то, о чем я писал - непостоянство скважности. Она плавает из-за того, что к длительности одного полупериода добавляетя время как аналогового чтения (а это медленная операция), так и время входа в цикл. Собственно, это недостаток, изначально присущий использованному Вами подходу.

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Конечно интересует, я новичок, можно сказать я чайник по программированию. Меня интересует диапазон рабочих частот от 0 до 50 Гц и стабильность частоты,  для частотного преобразователя АД. Вы разбираетесь в этом?

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Здесь кто-то писал что можно в программу добавить кнопку для сохранения значения потенциометра в память ардуино, может это поможет мне?

nik182
Offline
Зарегистрирован: 04.05.2015

50 герц это 20мс. За это время прыгнуть надо дважды, т.е. минимальное значение ms должно быть 10 мс. 1 герц это 1000мс, т.е. значение ms должно быть равно 500мс. map(ms, 0, 1023, 0, 50); долженбыть map(ms, 0, 1023, 500, 10) для частоты от 1 до 50 Гц. Если хотите частоту ещё ниже то соответственно вместо 500 надо ещё больше число ставить, только помнить, что всё время пока работает delay программв будет недоступна для регулирования.

 

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Уже что-то получается, и светодиод не тухнет и частота не плавает. Спасибо всем!!

Ислам Урус
Offline
Зарегистрирован: 08.07.2016

Другой таймер есть вместо delay? В моем случае не допустиво остановка программы

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Собственно, Вы произнесли правильное слово "таймер".

В Ардуино, минимум, три аппаратных таймеров. Один из них обеспечивает правильной функционарование millis() и micros(), ну и заодно два канала ШИМ. А два другие - свободны (если не считать, что их можно использовать для ШИМ - по два канала на каждый таймер). Вот их лучше всего и использовать для генерации различных частот.

Но если Вас устраивает такая не слишком стабильная частота и при этом не хочется разбираться с таймерами (я с ними начал разбираться примерно через год после первых шагов с Ардуино), но надо обеспечить работу процессора над другими задачами, можно использовать millis() так, как это изложено в "blink without delay". Заодно избавитесь от несимметричности, обусловленной временем измерения напряжения на потенциометре.

 

Теперь по поводу сохранения. Как Вам нужно сохранять - только на время непрерывной работы программы или так, чтобы старое значение вспоминалось даже после отключения питания? В первом случае достаточно простой переменной (собственно, она у Вас есть, нужно только отключать ее обновление). Во втором - копать в сторону EEPROM.