Проблема такого подхода к написанию диммера в вопросе - адальше что? Вы ж захотите им управлять. Кнопочки нажимать, к компу подключать. Вот с этого места и начнуться нерешаемые проблемы - любое действие будет приводить к катострофическому изменению углов регулирования. В теме про диммер на attiny85 всё разжовано. Возьмите три таких и будет вам счастье. Они по 3 фазам отлично будут в параллель работать и даже управляться с одной вашей ардуины.
Осцилограф для этого имеется и опыт коекакой загвоздка только в таймере. Я вам больше скажу этот проект в будущем будет поддерживать момент на валу и тормозить рекупирацией. А про три ардуино тоже думал но как то это не красиво.
На ардуине не получится.Надо на stm32 переходить. Там даже таймер есть специально по это заточенный. Один на 6 выходов со всеми необходимыми задержками и запретами.
Если этот код был почти рабочим тогда попробуйте так. Правда я не совсем понял кода надо Вык. Даный код должен работать следующим образом, Вык. по прерыванию а Вк. - после прерывания с задержкой выставленноя резистором
Получается что Выключать будем по прерыванию а включено будет между прерываниями. А надо включать по прерыванию а выключать через примерно 100 милисикунд. За код благодарю в понедельник испытаю если что допилю .
Что то вы немного напутали так будет идти импульс сразу по прерыванию без задержки. Задержка будет при отключении . Думаю лучше вынести включение и отключение из прерывания и делать это в лупе а в прерывания только флаг подымать.?
Хотелосьбы уточнить, вот Вы пишете (Нужно так : прерывание, определяем по какому входу ждем и даем импульс длиной 100 микросекунд.) Слово ждем подразумевает даные с резистора? А импульс 100 микросекунд или 100 милисекунд, как Вы указали в посте #117
Да ждем это данные с резистора. Можно просто включать а потом выключать но тогда импульс будет слишком длинным. В идиале так : по прерыванию ждем (данные с резистора) потом включаем, ждем 100 микросекунд (фиксированное значение ) и включаем.
Ого все на таймерах. Признаюсь приятно удивлен, что вы
Вот так просто потратили свое время. Побольше бы таких на форуме, а то только умничать только могут. В понедельник проверю.
Ого все на таймерах. Признаюсь приятно удивлен, что вы Вот так просто потратили свое время. Побольше бы таких на форуме, а то только умничать только могут. В понедельник проверю.
Потому что глупо носить воду в друшляках, зато увлекательно наблюдать за этим процессом.
То есть если с отрицанием значит снят ? Если просто флаг это значит весит.Я понял.Еще прикольно вы типы переменных обозначили как по мне это круче чем писать типа: unsigned long,. А для работы контроллера разница есть ?
А, учитывая, что в С/С++ слабая типизация и нет различия между целым и булевым типами, следует знать, что "ложь" - это 0, а "истина" - это все кроме 0.
Увы, многие, кто начинает программировать, даже не подозревают о существовании такой дисциплины, как булева алгебра. А между тем, она широко применаяется как в программировании, так и в схемотехнике.
Что такое "переменная кнопки"? Что она должна отражать?
Номер пина? Формально - можно, но вряд ли это будет иметь физический смысл.
Состояние нажата/не нажата - не только можно, но именно этим и следует пользоваться. Если кнопка нажата - "истина", а не нажата - "ложь", то, естественно, со знаком отрицания будет наоборот (нажата - "ложь", не наждата - "истина"). Справедливо и обратное утверждение.
Но это самый примитивный случай. Реальная польза от булевой алгебры появится тогда, когда нам нужно проанализировать одновременно несколько условий.
Можно ли программировать обработку числовой информации, не зная, что такое число, умножение, сложение, вычитание, деление?
Вот примерно с тем же успехом можно программировать и логику программы, не зная, что такое "истина", "ложь", конъюнкция, дизъюнкция, отрицание...
Еще хотелбы обратить Ваше внимание на самое узкое место в Вашей прграмме. Это функция
Dimmer = map(analogRead(0), 0, 1023, 6000, 0);
В связи с тем что все вычисления ведутся на (micros()) Функция analogRead(0) очень медленная. Время ее выполнения больше 100 микросекунд а она вызывается при каждом проходе void loop() . Это значит что о точности выполнения программы речи НЕТ.
Решения:
1- Отказаться от функции и управлять напрямую, там время в районе 20 mks (На мой взгля Вам рано)
2- Вынести функцию в void setup() и при каждом изменении сопротивления перезапускать программу.
3- Делать замер не в каждом проходе а например 1 раз в секунду, тогда хоть и будет неточность но 1 раз в сек.
Благодарю за внимание к моему вопросу. Считывать раз в секунду не пойдет, так как это значение при поддержании момента будет меняться постоянно. А вот вынести в сетап не совсем понял ? Сетап же работает один раз при запуске мк. ?
Подключив микропроцессорную плату к осцилографу, и написав цикл digitalWrite(HIGH), и ниже digitalWrite(LOW), на осцилографе обнаружил довольно унылый меандр с частотой 50Гц. Это кошмар. Это крах, подумал я, на фоне требуемых 1Мгц.
Далее, через осцилограф, я изучил еще несколько скоростей выполнения:
AnalogRead() — скорость выполнения 110 мкс.
AnalogWrite() — 2000 мкс
SerialPrintLn() — при скорости 9600 около 250мкс, а при максимальной скорости около 3мкс.
Смотрите чтобы не заморачиваться с битами нужно скачать и установить библиотеку CyberLib, там теже операции с битами только проще для написаня и понимания. АЦП - придется писать ручками!
Зачем в 4 строке -1 ?
Посмотрите на строку 24, подумайте.
А в 10 если LOW ? Прокоментируйте код если не трудно. И что таймер микрос можно запускать по команде ? Читал что он считает пока не переполнится ?
Какой таймер микрос? Где вы этой белиберды начитались?
И давайте вы сами попробуете прокомментировать код. А то потом начнете выклянчивать дописывание всех своих входов.
За попробую но учтите три месяца как занимаюсь ардуино так что не ржать.
Вы наверно имели в виду 22 строку если 0 больше?
Ну поставьте HIGH, если LOW не нравится. В остальной логике, как я понимаю, вы разобрались.
Да благодарю буду тестить отпишусь.
Проблема такого подхода к написанию диммера в вопросе - адальше что? Вы ж захотите им управлять. Кнопочки нажимать, к компу подключать. Вот с этого места и начнуться нерешаемые проблемы - любое действие будет приводить к катострофическому изменению углов регулирования. В теме про диммер на attiny85 всё разжовано. Возьмите три таких и будет вам счастье. Они по 3 фазам отлично будут в параллель работать и даже управляться с одной вашей ардуины.
Осцилограф для этого имеется и опыт коекакой загвоздка только в таймере. Я вам больше скажу этот проект в будущем будет поддерживать момент на валу и тормозить рекупирацией. А про три ардуино тоже думал но как то это не красиво.
На ардуине не получится.Надо на stm32 переходить. Там даже таймер есть специально по это заточенный. Один на 6 выходов со всеми необходимыми задержками и запретами.
В будущем я буду летать в красной майке с буквой "S" вокруг планеты и тормозить ее.
Смотрел что ее можно шить через ардуино идее .
Прикольно наверное будите смотрется.
Самое рабочее было вот так
Если этот код был почти рабочим тогда попробуйте так. Правда я не совсем понял кода надо Вык. Даный код должен работать следующим образом, Вык. по прерыванию а Вк. - после прерывания с задержкой выставленноя резистором
Получается что Выключать будем по прерыванию а включено будет между прерываниями. А надо включать по прерыванию а выключать через примерно 100 милисикунд. За код благодарю в понедельник испытаю если что допилю .
Что то вы немного напутали так будет идти импульс сразу по прерыванию без задержки. Задержка будет при отключении . Думаю лучше вынести включение и отключение из прерывания и делать это в лупе а в прерывания только флаг подымать.?
А как это понять?
Нужны импульсы длиной минимум 100 микросекунд. А то если будут короче то тиристора не успеет открыться.
Да вы правы здесь я вам не правильно написал пардон . Нужно так : прерывание, определяем по какому входу ждем и даем импульс длиной 100 микросекунд.
Хотелосьбы уточнить, вот Вы пишете (Нужно так : прерывание, определяем по какому входу ждем и даем импульс длиной 100 микросекунд.) Слово ждем подразумевает даные с резистора? А импульс 100 микросекунд или 100 милисекунд, как Вы указали в посте #117
Да ждем это данные с резистора. Можно просто включать а потом выключать но тогда импульс будет слишком длинным. В идиале так : по прерыванию ждем (данные с резистора) потом включаем, ждем 100 микросекунд (фиксированное значение ) и включаем.
То есть слишком коротким.
Выключаем в смысле . С телефона пишу.
Ну и последний уточняющий вопрос. Задержка с резистора это милисекунды или микросекунды
Все в микросекундах. По этому нужно не миллис а микрос.
Пробуйте
Ого все на таймерах. Признаюсь приятно удивлен, что вы
Вот так просто потратили свое время. Побольше бы таких на форуме, а то только умничать только могут. В понедельник проверю.
Вот только не пойму где вы в лупе проверяете что флаг поднят ?
В смысле почему не так : if (flag_F1on ==1 && micros() - time_F1 >= Dimmer) { ?
Если немножко глубже вникните в програмирование то увидите что
if (!flag_F1on) Равносильно if (flag_F1on == 0)
То есть если с отрицанием значит снят ? Если просто флаг это значит весит.Я понял.Еще прикольно вы типы переменных обозначили как по мне это круче чем писать типа: unsigned long,. А для работы контроллера разница есть ?
Это не программирование, это - булева алгебра.
А, учитывая, что в С/С++ слабая типизация и нет различия между целым и булевым типами, следует знать, что "ложь" - это 0, а "истина" - это все кроме 0.
Увы, многие, кто начинает программировать, даже не подозревают о существовании такой дисциплины, как булева алгебра. А между тем, она широко применаяется как в программировании, так и в схемотехнике.
То есть если бы это была к примеру кнопка можно было просто написать имя переменной кнопки и это было бы верно. А со знаком отрицания лож.?
Что такое "переменная кнопки"? Что она должна отражать?
Номер пина? Формально - можно, но вряд ли это будет иметь физический смысл.
Состояние нажата/не нажата - не только можно, но именно этим и следует пользоваться. Если кнопка нажата - "истина", а не нажата - "ложь", то, естественно, со знаком отрицания будет наоборот (нажата - "ложь", не наждата - "истина"). Справедливо и обратное утверждение.
Но это самый примитивный случай. Реальная польза от булевой алгебры появится тогда, когда нам нужно проанализировать одновременно несколько условий.
Можно ли программировать обработку числовой информации, не зная, что такое число, умножение, сложение, вычитание, деление?
Вот примерно с тем же успехом можно программировать и логику программы, не зная, что такое "истина", "ложь", конъюнкция, дизъюнкция, отрицание...
Благодарю за пояснение.! Буду вникать.
Благодарю за внимание к моему вопросу. Считывать раз в секунду не пойдет, так как это значение при поддержании момента будет меняться постоянно. А вот вынести в сетап не совсем понял ? Сетап же работает один раз при запуске мк. ?
Тогда вариант №1
Вот очень полезная ссылка изучайте http://arduino.ru/forum/programmirovanie/atsp-cherez-registry#comment-172270
http://narodstream.ru/avr-urok-22-izuchaem-acp-chast-1/
Если честно. Регистры для меня вообще дремучий лес. Но как я уже понял без них только лампочкой мигать. Так что буду грызть .
Вообще данная задумка планировалось либо на двух мк. Один раздает импульсы а второй все остальное. Либо использовать более быструю ардуино DUE .?
Вот еще одно интересное высказывание о скорости
Так что да для Вашей задачи толь битовые операции!!!
Это радует.
А где почитать про орфографию. ?
Смотрите чтобы не заморачиваться с битами нужно скачать и установить библиотеку CyberLib, там теже операции с битами только проще для написаня и понимания. АЦП - придется писать ручками!
Прошу прощения там в библиотеке есть и АЦП.
Сейчас я Вам накидаю скетч с использованием библиотеки по идее все должно работать