MOSFET модуль на IRF520 и ШИМ
- Войдите на сайт для отправки комментариев
Пт, 28/05/2021 - 13:58
Добрый день
Задача: управлять светодиодными RGB модулями с помощью 3-х MOSFET модулей на IRF520.
Посмотрел урок Гайвера. Повторил (как я думаю) как было на видео.
Если работать с одним модулем - работает великолепно.
Timer2.setFrequency(125000UL); Timer2.enableISR(); .... void RGBlightOn () { static volatile byte counterRGB = 0; if (counterRGB == 0) { if (RGBvalues > 0) digitalWrite (9, HIGH); } if (counterRGB == RGBvalues) digitalWrite (9, LOW); counterRGB++; } ISR (TIMER2_A) { RGBlightOn (); }
Но как только я делаю это для трёх модулей, то при заливке кода на Ардуино Нано, она перестает запускаться.
void RGBlightOn () { static volatile byte counterRGB = 0; if (counterRGB == 0) { if (RGBvalues1 > 0) digitalWrite (9, HIGH); if (RGBvalues2 > 0) digitalWrite (10, HIGH); if (RGBvalues3 > 0) digitalWrite (11, HIGH); } if (counterRGB == RGBvalues1) digitalWrite (9, LOW); if (counterRGB == RGBvalues2) digitalWrite (10, LOW); if (counterRGB == RGBvalues3) digitalWrite (11, LOW); counterRGB++; }
Если я закомментирую две из трёх строк, то Нано снова загружается и работает.
void RGBlightOn () { static volatile byte counterRGB = 0; if (counterRGB == 0) { if (RGBvalues1 > 0) digitalWrite (9, HIGH); if (RGBvalues2 > 0) digitalWrite (10, HIGH); if (RGBvalues3 > 0) digitalWrite (11, HIGH); } if (counterRGB == RGBvalues1) digitalWrite (9, LOW); // if (counterRGB == RGBvalues2) digitalWrite (10, LOW); // if (counterRGB == RGBvalues3) digitalWrite (11, LOW); counterRGB++; }
Объясните почему так?
Это так не делается, совсем. Для этого есть analogWrite. Не учись по гайверу - он сам ничего толком не умеет.
а можно ссылку на пример как это надо делать? Я вчера несколько часов убил что бы найти то что мне надо. И по крупинкам сделал то что сделал.
https://www.arduino.cc/reference/en/language/functions/analog-io/analogw...
Посмотрел урок Гайвера. Повторил (как я думаю) как было на видео.
Объясните почему так?
Вот здесь объяснят - http://community.alexgyver.ru/
Не, что такое analogWrite я знаю. Я не пойму как это здесь применить?
Я вчера на один модуль пробовал подавать значение с аналогового вывода от 0 до 1024. До определённого значения на аналоговом выводе (не помню сейчас точно сколько в вольтах (я мультиметром смотрел)) МОСФЕТ закрыт и как только напряжение больше этого значения, он полностью открывается до необходимых мне 12 Вольт. Плавно делать на аналоговом выводе используя этот МОСФЕТ модуль я не пойму как, без использования всё той же ШИМ.
Т.е. вы имеете ввиду что ШИМ делать не на цифровых выводах и на аналоговых? А какая разница?
Прочитай что это такое, а не тыкай наугад какую-то чушь. ШИМ делается на ШИМ-выхода.
объясни сперва:
1. Что ты делаешь? Что должно быть в итоге и как оно должно работать?
2. Из каких таких "модулей"? (ссылки на LED модуль и мосфет модуль)
3. Как и что соединил? Лучше нарисуй.
Пока не апеллируй к Гайверовским поделкам. Напиши своими словами, ок?
================
Ну и самое главное забыл: код приводи тот, который можно компилировать и запускать. Не всю свою простыню, а кусок, который иллюстрирует вопрос.
Попробуйте назначить другие пины.
Уважаемый ТС! Попытайтесь описать Вашу задачу на Вашем языке. Потом на Вашем языке, но используя аль-хорезм. Потом перевести на си++.
В итоге должна получится рабочая программа
ШИМ работает не на всех выводах и "analogWrite" имеет диапазон в 255 градаций ( а не в 1024, не путай с "analogRead")
Итак:
1. Что ты делаешь? Что должно быть в итоге и как оно должно работать?
Я хочу управлять 20-ю RGB-модулями. К примеру: с 8:00 до 9:00 - красный свет, с 9:00 до 12:00 - синий свет. К ПРИМЕРУ. Но суть такая.
2. Из каких таких "модулей"? (ссылки на LED модуль и мосфет модуль)
https://aliexpress.ru/item/32475588064.html?spm=a2g0s.9042311.0.0.27424c4d7OcumI&sku_id=56442423562
https://aliexpress.ru/item/32970634682.html?spm=a2g0s.9042311.0.0.274233edRTlrk1
3. Как и что соединил? Лучше нарисуй.
Нарисовал
Пока не апеллируй к Гайверовским поделкам. Напиши своимВи словами, ок?
Как я уже писал, работает только одна строка из трёх (10, 11 и 12). Вернее после заливки скетча Нано начинает выполнять его
Причем строки 6, 7, 8 можно и не комментировать. С ними всегда работает. А вот 10, 11, 12 только когда комментирую две из трёх - тогда начинает работать.
Ну и самое главное забыл: код приводи тот, который можно компилировать и запускать. Не всю свою простыню, а кусок, который иллюстрирует вопрос.
Я постарался привести в самом начале именно тот "кусок" простыни, который отвечает за работуRGB модулей.
Я бы понял бы если бы он совсем не работал. Но ведь я подключил все 20 модулей последовательно к трём МОСФЕТ модулям и управлял поворотным энкодером одним цветом (попался зелёный). Очень плавно меняет свет.
Я постарался привести в самом начале именно тот "кусок" простыни, который отвечает за работуRGB модулей.
Rankle, русский язык плохо понимаешь, да?
Тебе сказано :
код приводи тот, который можно компилировать и запускать.
твои куски можно компилировать? - НЕТ!
Если ты не в состоянии сам удалить лишнее из кода так, чтобы он остался работающим скетчем -то лучше ничего не сокращай, выкладывай целиком.
b707, я попробовал сегодня удалить лишнее, оставить нужное. К моему удивлению работает. В общем скетче - нет, а отдельно - да.
Второе. Я попробовал поставить вместо переменных постоянные числа. Я удивился второй раз - начало загружаться и работать. Естественно параметры RGB не регулируются, но при переходе значения в "0" МОФЕТы выключаются.
вместо:
это:
В связи с этим у меня два вопроса:
- скажите, есть ли (как бы это правильно сказать, назвать т.п.) какой-нибудь отладчик кода, что бы можно было "пошагово" выполнять скетч и смотреть на значения переменных, на то, в каком месте выполняется программа (может быть на цикле зависла, может быть та или иная функция не выполняется вообще исходя из конкретных условий в данный момент или ещё что либо и т.д. и т.п.), вообще как то контролировать и понимать что где с чем может конфликтовать ?
- b707, вы мне в прошлой моей теме уже помогли. Спасибо большое. Но я не хотел бы выкладывать здесь скетч целиком по нескольким причинам. Там нет ничего уникального (просто конструктор из кубиков-"кусочков кода" из интернета). Если вы готовы подсказать в каком месте скетча мои руки были кривые могу выслать скетч вам на e-mail (мой: rankle@yandex.ru).
Я постарался привести в самом начале именно тот "кусок" простыни, который отвечает за работуRGB модулей.
Rankle, русский язык плохо понимаешь, да?
Тебе сказано :
код приводи тот, который можно компилировать и запускать.
твои куски можно компилировать? - НЕТ!
Если ты не в состоянии сам удалить лишнее из кода так, чтобы он остался работающим скетчем -то лучше ничего не сокращай, выкладывай целиком.
b707, вот всё вырезанное:
вам реально нравится этот мазахизм?! пост 10 вообще читали?! примеры другие искали?
Rankle, я вам на гайверофоруме уже ответил. Ваша функция RGBlightOn() слишком длинная, чтобы ардуина могла запускать ее с заданной частотой. В книжке Симона Монка (ссылка есть в Песочнице) проводится простенький тест быстродейстия Атмеги328 - цикл
дает на выходе сигнал частотой всего 79 КГц. А у вас функция почти втрое длиннее и вы хотите, чтобы она вызывалась с частотой 125 КГц?
Поэтому-то у вас и начинает что-то работать, когда вы комментируете часть строчек или заменяете переменные на константы...
b707, ещё раз, спасибо большое за помощь. Не писал раньше, потому что сижу и наслаждаюсь работой RGB-модулей. Обязательно загляну в книгу Симона Монка, но пока (понимаю что так не делается, но мне очень хотелось посмотреть на результат поэтому и ткнул на глядя) заработало на 90000UL.
заработало на 90000UL.
Думаю и это много, у вас МК почти все время проводит в вашем таймере - это значит что почти ничего другое в программу уже не добавить, да и на системные вызовы времени не остается. например миллис почти наверняка будет тормозить
В целом то, что вы делаете - называется "программный ШИМ". Но для оптимальной скорости его надо делать на регистрах, а не на функциях digitalWrite() - вы проигрываете в скорости во много раз
У меня это предпоследняя задача. Последняя - включить реле в определенное время (самое простое оставил на потом). И всё. Больше добавлять ничего не буду. Это проект управления акватеррариумом. А вот на аквариум возьму посерьезнее что то чем Нано.
на аквариум возьму посерьезнее что то чем Нано.
На аквариум?
Вот как раз про аквариум картинко было. Посмотрите и подумайте хорошо:
Я это и имел ввиду :)))
Хочу сделать себе похожий с функциями, нужными мне:
То что я сейчас сделал на Нано - это мой первый в жизни проект на Ардуино. Понятно что ошибок много. Но мне это нравится. И хочу "двигаться" дальше.