Отключаю и снова включаю блок питания. Светодиод почему то начинает странно мигать т.е. сразу загорается и плавно гаснет. Иногда все нормально работает плавно загорается и плавно гаснет. Код (C++): unsigned long TB1; unsigned long loopTB1; unsigned long TC; unsigned long loopTC; unsigned long TB7; unsigned long loopTB7; unsigned long TB8; unsigned long loopTB8; unsigned long TL1; unsigned long loopL1; int SPEED = 0; // скорость кулера int vint=0;// переменная равна 0 int fan = 3; // вывод 3 с символом ~ int INCREASE = 5; // величина увеличение скорости int REDUCTION = 5; // величина уменьшения скорости int flag = 0; // переменная равна 0 int led = 11; // вывод 11 с символом ~ int brightness = 0; // начальная яркость светодиода int fadeAmount = 3; // величина изменения яркости светодиода 1 void setup () { TCCR2B = TCCR2B & B11111000 | B00000001; //установил частоту 31кгц на 11 и 3 пине pinMode(12, OUTPUT); //установил на 12 пин digitalWrite(12,HIGH); //включение бп HIGH=выкл,LOW=вкл pinMode(led, OUTPUT); TB1=millis();//временные переменные loopTB1=TB1; TL1=millis(); loopL1=TL1; TB7=millis(); loopTB7=TB7; TB8=millis(); loopTB8=TB8; TC=millis(); loopTC=TC; } void loop () { long val = 0; TB1=millis(); if (digitalRead(4) == HIGH && flag == 0) // если на 4 входе есть сигнал и переменная равна 0 то... { if(TB1>=(loopTB1+1000))//задержка { loopTB1=TB1; digitalWrite(12, !digitalRead(12)); //меняем значение выхода на противоположное flag = 1; //меняем значение ФЛАГА //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие } } if (digitalRead(4) == LOW && flag == 1) //если на 4 входе нет сигнал и переменная равна 1 то... { if(TB1>=(loopTB1+500))//задержка { loopTB1=TB1; flag = 0; //обнуляем переменную } } if (digitalRead(12)== LOW)//если БП включен { analogWrite(fan, SPEED); if (vint==0) { SPEED = 255;//запуск кулера } TC=millis(); if(TC>=(loopTC+2000)&&vint==0)//задержка { SPEED = 150;//нужная скорость vint=1; } //плавное мигание светодиода TL1=millis(); if(TL1>=(loopL1+30)) { analogWrite(led, brightness); brightness = brightness + fadeAmount; loopL1=TL1; if (brightness == 0 || brightness == 255) { fadeAmount = -fadeAmount ; } } if(SPEED<255&&vint==1)//если скорость меньше max и запуск прошел { TB7=millis(); if (digitalRead(7)==HIGH) //есть сигнал на 7 пине { if(TB7>=(loopTB7+500)) { loopTB7=TB7; SPEED = SPEED + INCREASE;//увеличиваем скорость } } if (digitalRead(7)==LOW)//если нет сигнала ничего не делаем { if(TB7>=(loopTB7+500)) { loopTB7=TB7; } } } if(SPEED>115&&vint==1)//если скорость больше min и запуск прошел { TB8=millis(); if (digitalRead(8)==HIGH) //есть сигнал на 8 пине { if(TB8>=(loopTB8+500)) { loopTB8=TB8; SPEED = SPEED-REDUCTION;//уменьшаем скорость } } if (digitalRead(8)==LOW)//если нет сигнала ничего не делаем { if(TB8>=(loopTB8+500)) { loopTB8=TB8; } } } } else if (digitalRead(12)== HIGH)//иначе если БП отключен { analogWrite(fan, SPEED); analogWrite(led, brightness); SPEED = 0;//кулер не работает brightness = 0;//светодиод не горит vint=0; } }
совершенно верно и кулер и светодиод (метр ленты) подключены через MOSFETы. Ардуино уно запитана от дежурного питания, кулер и светодиод от 12В компьютерного БП.
На затворе мосфета подтяжка к земле присутствует? А то вдруг у вас затвор из эфира нажирается - и иногда открывает переход
Разумеется. Обвязка сделана по правой схеме. Мои домыслы что нарушение работы светодиода связано с моментом выключения БП. Бывает пять раз отключиш включиш все норм работает, а на шестой начинает глючить.
Вот где Вы увидели что MOSFET не дружит с шимом. При том что если я не играюсь включением-отключением БП все стабильно работает. Вентилятор у меня подключен через самодельный мосфет ключ как тут лед лента через такой https://ru.aliexpress.com/item/0-24...rduino-MCU-ARM-Raspberry-pie/32275524365.html
С шимом как всегда не дружат кривые руки, собирающие по схемам из бложиков без понимания того, что там происходит.