MOSFET модуль на IRF520 и ШИМ

Rankle
Offline
Зарегистрирован: 31.10.2020

Добрый день

Задача: управлять светодиодными 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++; 
} 

 

Объясните почему так?

rkit
Offline
Зарегистрирован: 23.11.2016

Это так не делается, совсем. Для этого есть analogWrite. Не учись по гайверу - он сам ничего толком не умеет.

Rankle
Offline
Зарегистрирован: 31.10.2020

а можно ссылку на пример как это надо делать? Я вчера несколько часов убил что бы найти то что мне надо.  И по крупинкам сделал то что сделал.

 

sadman41
Offline
Зарегистрирован: 19.10.2016
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Rankle пишет:

Посмотрел урок Гайвера. Повторил (как я думаю) как было на видео.

Объясните почему так?

Вот здесь объяснят - http://community.alexgyver.ru/

Rankle
Offline
Зарегистрирован: 31.10.2020

Не, что такое analogWrite я знаю. Я не пойму как это здесь применить?

Я вчера на один модуль пробовал подавать значение с аналогового вывода от 0 до 1024. До определённого значения на аналоговом выводе (не помню сейчас точно сколько в вольтах (я мультиметром смотрел)) МОСФЕТ закрыт и как только напряжение больше этого значения, он полностью открывается до необходимых мне 12 Вольт. Плавно делать на аналоговом выводе используя этот МОСФЕТ модуль я не пойму как, без использования всё той же ШИМ.

Т.е. вы имеете ввиду что ШИМ делать не на цифровых выводах и на аналоговых? А какая разница?

rkit
Offline
Зарегистрирован: 23.11.2016

Прочитай что это такое, а не тыкай наугад какую-то чушь. ШИМ делается на ШИМ-выхода.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

объясни сперва:

1. Что ты делаешь? Что должно быть в итоге и как оно должно работать?

2. Из каких таких "модулей"? (ссылки на LED модуль и мосфет модуль)

3. Как и что соединил? Лучше нарисуй.

Пока не апеллируй к Гайверовским поделкам. Напиши своими словами, ок?

================

Ну и самое главное забыл: код приводи тот, который можно компилировать и запускать. Не всю свою простыню, а кусок, который иллюстрирует вопрос.

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Попробуйте назначить другие пины.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Уважаемый ТС! Попытайтесь описать Вашу задачу на Вашем языке. Потом на Вашем языке, но используя аль-хорезм. Потом перевести на си++. 

В итоге должна получится рабочая программа

Plasteroid
Plasteroid аватар
Offline
Зарегистрирован: 15.07.2020

ШИМ работает не на всех выводах и "analogWrite" имеет диапазон в 255 градаций ( а не в 1024, не путай с "analogRead")

Rankle
Offline
Зарегистрирован: 31.10.2020

 

Итак:

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). Вернее после заливки скетча Нано начинает выполнять его

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++;
}

Причем строки 6, 7, 8 можно и не комментировать. С ними всегда работает. А вот 10, 11, 12 только когда комментирую две из трёх - тогда начинает работать.

Ну и самое главное забыл: код приводи тот, который можно компилировать и запускать. Не всю свою простыню, а кусок, который иллюстрирует вопрос.

Я постарался привести в самом начале именно тот "кусок" простыни, который отвечает за работуRGB модулей.

Я бы понял бы если бы он совсем не работал. Но ведь я подключил все 20 модулей последовательно к трём МОСФЕТ модулям и управлял поворотным энкодером одним цветом (попался зелёный). Очень плавно меняет свет. 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Rankle пишет:

Я постарался привести в самом начале именно тот "кусок" простыни, который отвечает за работуRGB модулей.

Rankle, русский язык плохо понимаешь, да?

Тебе сказано :

код приводи тот, который можно компилировать и запускать.

твои куски можно компилировать? - НЕТ!

Если ты не в состоянии сам удалить лишнее из кода так, чтобы он остался работающим скетчем -то лучше ничего не сокращай, выкладывай целиком.

Rankle
Offline
Зарегистрирован: 31.10.2020

b707, я попробовал сегодня удалить лишнее, оставить нужное. К моему удивлению работает. В общем скетче - нет, а отдельно - да.

Второе. Я попробовал поставить вместо переменных постоянные числа. Я удивился второй раз - начало загружаться и работать. Естественно параметры RGB не регулируются, но при переходе значения в "0" МОФЕТы выключаются.

вместо:

  if (counterRGB == (RGBvalues[LightModePointer][0])*2 ) digitalWrite (9, LOW);  //ЗЕЛЁНЫЙ
  if (counterRGB == (RGBvalues[LightModePointer][1])*2 ) digitalWrite (10, LOW);
  if (counterRGB == (RGBvalues[LightModePointer][2])*2 ) digitalWrite (11, LOW);

 

это:

  if (counterRGB == 10) {digitalWrite (9, LOW);}  //ЗЕЛЁНЫЙ
  if (counterRGB == 20)  {digitalWrite (10, LOW);}
  if (counterRGB == 30) {digitalWrite (11, LOW);}

 

В связи с этим у меня два вопроса:

- скажите, есть ли (как бы это правильно сказать, назвать т.п.) какой-нибудь отладчик кода, что бы можно было "пошагово" выполнять скетч и смотреть на значения переменных, на то, в каком месте выполняется программа (может быть на цикле зависла, может быть та или иная функция не выполняется вообще исходя из конкретных условий в данный момент или ещё что либо и т.д. и т.п.), вообще как то контролировать и понимать что где с чем может конфликтовать ?

- b707, вы мне в прошлой моей теме  уже помогли. Спасибо большое. Но я не хотел бы выкладывать здесь скетч целиком по нескольким причинам. Там нет ничего уникального (просто конструктор из кубиков-"кусочков кода" из интернета). Если вы готовы подсказать в каком месте скетча мои руки были кривые могу выслать скетч вам на e-mail (мой: rankle@yandex.ru).

Rankle
Offline
Зарегистрирован: 31.10.2020

b707 пишет:

Rankle пишет:

Я постарался привести в самом начале именно тот "кусок" простыни, который отвечает за работуRGB модулей.

Rankle, русский язык плохо понимаешь, да?

Тебе сказано :

код приводи тот, который можно компилировать и запускать.

твои куски можно компилировать? - НЕТ!

Если ты не в состоянии сам удалить лишнее из кода так, чтобы он остался работающим скетчем -то лучше ничего не сокращай, выкладывай целиком.

b707, вот всё вырезанное:

#include <GyverTimers.h>

volatile uint8_t LightModePointer = 0;       
volatile uint8_t RGBvalues [7][3] =    
{ {0, 0, 100}, {100, 15, 20}, {15, 20, 25}, {20, 25, 30}, {25, 30, 35}, {30, 35, 40}, {35, 40, 45} };

void setup() {

  Timer2.setFrequency(125000UL);
  Timer2.enableISR();  

  pinMode(9,OUTPUT);   // установить режим вывода для светодиодной летны
  pinMode(10,OUTPUT);   // установить режим вывода для светодиодной летны
  pinMode(11,OUTPUT);   // установить режим вывода для светодиодной летны
}

void loop() {

}
void RGBlightOn ()
{
  static volatile byte counterRGB = 0;
  if (counterRGB == 0)
  {
    if ((RGBvalues[LightModePointer][0])*2 > 0) digitalWrite (9, HIGH);
    if ((RGBvalues[LightModePointer][1])*2 > 0) digitalWrite (10, HIGH);
    if ((RGBvalues[LightModePointer][2])*2 > 0) digitalWrite (11, HIGH);   
    counterRGB = 0;
  }
  
  if (counterRGB == (RGBvalues[LightModePointer][0])*2) {digitalWrite (9, LOW);}  //ЗЕЛЁНЫЙ
  if (counterRGB == (RGBvalues[LightModePointer][1])*2) {digitalWrite (10, LOW);}
  if (counterRGB == (RGBvalues[LightModePointer][2])*2) {digitalWrite (11, LOW);}

  counterRGB++;
}

ISR (TIMER2_A)
{
  RGBlightOn ();
}

 

 

Гриша
Offline
Зарегистрирован: 27.04.2014

вам  реально нравится этот мазахизм?! пост 10 вообще читали?! примеры другие искали? 

b707
Offline
Зарегистрирован: 26.05.2017

Rankle, я вам на гайверофоруме уже ответил. Ваша функция RGBlightOn() слишком длинная, чтобы ардуина могла запускать ее с заданной частотой. В книжке Симона Монка (ссылка есть в Песочнице) проводится простенький тест быстродейстия Атмеги328 - цикл

void loop() {
digitalWrite(pin, LOW);
digitalWrite(pin, HIGH);
}

дает на выходе сигнал частотой всего 79 КГц. А у вас функция почти втрое длиннее и вы хотите, чтобы она вызывалась с частотой 125 КГц?

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

Rankle
Offline
Зарегистрирован: 31.10.2020

b707, ещё раз, спасибо большое за помощь. Не писал раньше, потому что сижу и наслаждаюсь работой RGB-модулей. Обязательно загляну в книгу Симона Монка, но пока (понимаю что так не делается, но мне очень хотелось посмотреть на результат поэтому и ткнул на глядя) заработало на 90000UL.

b707
Offline
Зарегистрирован: 26.05.2017

Rankle пишет:

заработало на 90000UL.

Думаю и это много, у вас МК почти все время проводит в вашем таймере - это значит что почти ничего другое в программу уже не добавить, да и на системные вызовы времени не остается. например миллис почти наверняка будет тормозить

В целом то, что вы делаете - называется "программный ШИМ". Но для оптимальной скорости его надо делать на регистрах, а не на функциях digitalWrite() - вы проигрываете в скорости во много раз

Rankle
Offline
Зарегистрирован: 31.10.2020

У меня это предпоследняя задача. Последняя - включить реле в определенное время (самое простое оставил на потом). И всё. Больше добавлять ничего не буду. Это проект управления акватеррариумом. А вот на аквариум возьму посерьезнее что то чем Нано.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Rankle пишет:

на аквариум возьму посерьезнее что то чем Нано.

На аквариум? 

Вот как раз про аквариум картинко было. Посмотрите и подумайте хорошо:

Rankle
Offline
Зарегистрирован: 31.10.2020

Я это и имел ввиду :)))

Хочу сделать себе похожий с функциями, нужными мне:

То что я сейчас сделал на Нано - это мой первый в жизни проект на Ардуино. Понятно что ошибок много. Но мне это нравится. И хочу "двигаться" дальше.