Противофазный генератор с ругулирумемой частотой
- Войдите на сайт для отправки комментариев
Втр, 21/02/2017 - 14:53
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); // задержка }
Я так понимаю, что другие характерстики как то:
- диапазон рабочих частот,
- стабильность частоты,
- регулировка скважности,
- стабильность скважности,
и пр. Вас не интересуют?
Здравствуйте, у меня возникла проблема со скетчем, если вращать ручку потенциометра в сторону увеличения при приближении к крайнему значению один светодиод тухнет, а у другого светодиода увеличивается свечение. И еще начальное значение int sm = 5; не слушается т.е. при изменении значения, частота не меняется. Может кто знает в чем проблема?
2. Начну со второго вопроса: программа написана именно так, что от начального значения ничего не зависит, т.к. это значение переопределяется перед первым использованием.
1. А вот по первому вопросу - это именно то, о чем я писал - непостоянство скважности. Она плавает из-за того, что к длительности одного полупериода добавляетя время как аналогового чтения (а это медленная операция), так и время входа в цикл. Собственно, это недостаток, изначально присущий использованному Вами подходу.
Конечно интересует, я новичок, можно сказать я чайник по программированию. Меня интересует диапазон рабочих частот от 0 до 50 Гц и стабильность частоты, для частотного преобразователя АД. Вы разбираетесь в этом?
Здесь кто-то писал что можно в программу добавить кнопку для сохранения значения потенциометра в память ардуино, может это поможет мне?
50 герц это 20мс. За это время прыгнуть надо дважды, т.е. минимальное значение ms должно быть 10 мс. 1 герц это 1000мс, т.е. значение ms должно быть равно 500мс. map(ms, 0, 1023, 0, 50); долженбыть map(ms, 0, 1023, 500, 10) для частоты от 1 до 50 Гц. Если хотите частоту ещё ниже то соответственно вместо 500 надо ещё больше число ставить, только помнить, что всё время пока работает delay программв будет недоступна для регулирования.
Уже что-то получается, и светодиод не тухнет и частота не плавает. Спасибо всем!!
Другой таймер есть вместо delay? В моем случае не допустиво остановка программы
Собственно, Вы произнесли правильное слово "таймер".
В Ардуино, минимум, три аппаратных таймеров. Один из них обеспечивает правильной функционарование millis() и micros(), ну и заодно два канала ШИМ. А два другие - свободны (если не считать, что их можно использовать для ШИМ - по два канала на каждый таймер). Вот их лучше всего и использовать для генерации различных частот.
Но если Вас устраивает такая не слишком стабильная частота и при этом не хочется разбираться с таймерами (я с ними начал разбираться примерно через год после первых шагов с Ардуино), но надо обеспечить работу процессора над другими задачами, можно использовать millis() так, как это изложено в "blink without delay". Заодно избавитесь от несимметричности, обусловленной временем измерения напряжения на потенциометре.
Теперь по поводу сохранения. Как Вам нужно сохранять - только на время непрерывной работы программы или так, чтобы старое значение вспоминалось даже после отключения питания? В первом случае достаточно простой переменной (собственно, она у Вас есть, нужно только отключать ее обновление). Во втором - копать в сторону EEPROM.