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

Алексей86

✩✩✩✩✩✩✩
9 Фев 2021
2
0
Добрый день.
Посмотрел видео от ALEXGYVER про ШИМ. Написал себе в скетч вот такой "кусок" (я удалил всё ненужное и оставил то, что относится к необходимой мне функции работы с RGB модулями):
C++:
#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 ();
}
Вопрос:
объясните, пожалуйста, почему в таком виде (выше) работает, а когда вставляю в свой скетч, то не работает до тех пор пока не закомментирую две строчки (причём не важно какие. Главное что бы их трех осталась только одна). Тогда Нано начинает загружаться и выполняться скетч.
Так - НЕ РАБОТАЕТ:
C++:
#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 ();
}

Так - РАБОТАЕТ.

C++:
#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 ();
}
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
это у вас частота таймера задана 125 КГц?

Вектор прерывания слишком длинный у вас, ардуина не успеет проверить столько условий и выполнить 3 digitalWrite() за 8 мкс
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@Алексей86, возможно при адаптации кода к представлению на сайте что-то исчезло, но даже первый скетч выглядит весьма странно (см. комментарии):
C++:
#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;    //*** вошли в этот блок по проверке 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++;    //*** кто сбрасывает эту переменную в 0? Фактически, сейчас она сбрасывается в 0 при переполнении byte (255++ циклов)
}

ISR (TIMER2_A)
{
  RGBlightOn ();
}
И, самое главное, он не отличается от второго!
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@bort707, у автора приведено три скетча. Первый (якобы работающий) не отличается от второго (якобы не работающего). В третьем, действительно, закомментированы строки 32 и 33.