Спорадически (~1 на 30 случаев) странно ведет себя микроконтроллер

Доброго времени суток!
Есть простая схемка, сразу всё заработало, но иногда (не часто) глючит.


Питание 12В от обычного импульсного БП, мощность 200Вт (с избытком).
Нужно при замыкании переключателя CONTROL SWITCH в зависимости от положения геркона REED SWITCH подать на нагрузку DC MOTOR 12В в прямой или обратной полярности, моторчик покрутится и потом контроллер опять считает значение геркона и моргнёт светодиодом 1 длинный если геркон замкнут или 3 короткие если геркон разомкнут.
Программа простая на С, всё в цикле, никаких без прерываний, и всё работает.

Но вот иногда происходит следующее:

  • мотор не дожимает до конца, прерывает вращение где-то в середине.
  • после этого светодиод тоже никак не моргает, хотя по коду должен моргнуть либо так либо иначе.

После этого опять всё работает.

Вероятно какие-то помехи вводят МК в ступор, но не подвешивают - так иногда подглючивая всё работает уже пару недель.
Как повысить защиту от помех, посоветуйте, и да пребудет с Вами сила, свежий кофе и Чак Норрис! :slight_smile:

Может и помехи, а может и баги в программе. Кто ж его знает? Программу нам никто не показывал.

показываю прогу, принимаю любые советы как улучшить, AVR я использую только для несложных прототипов типа вот этого поэтому глубоких знаний платформы не имею

int pinSensor = 10;
int pinMagnet = 9;
int pinLeft = 7;
int pinRight = 8;
int pinLED = 1;

void setup() {
  pinMode(pinLED,OUTPUT);
  pinMode(pinLeft,OUTPUT);
  pinMode(pinRight,OUTPUT);
  pinMode(pinSensor,INPUT_PULLUP);
  pinMode(pinMagnet,INPUT_PULLUP);

  digitalWrite(pinLED,LOW);
  digitalWrite(pinLeft,LOW);
  digitalWrite(pinRight,LOW);
}

void loop() {
  unsigned long tm1 = millis();
  if ( tm1 > 2000 ) { 
    bool sensor = digitalRead(pinSensor);
    if ( sensor == HIGH ) { 
      bool magnet = digitalRead(pinMagnet);
      digitalWrite(pinSensor,LOW);
      delay(20);
      if ( magnet == HIGH ) { 
        digitalWrite(pinRight,HIGH);
        delay(3000);
        digitalWrite(pinRight,LOW);
        delay(20);
      } else { 
        digitalWrite(pinLeft,HIGH);
        delay(3000);
        digitalWrite(pinLeft,LOW);
        delay(20);
      }
      delay(200);
      bool magnet1 = digitalRead(pinMagnet);
      digitalWrite(pinLED,HIGH);
      if ( magnet1 == LOW ) { 
        delay(500);
        digitalWrite(pinLED,LOW);
        delay(500);
        digitalWrite(pinLED,HIGH);
        delay(500);
        digitalWrite(pinLED,LOW);
        delay(500);
        digitalWrite(pinLED,HIGH);
        delay(500);
      } else { 
        delay(2500);
      }
      digitalWrite(pinLED,LOW);
      delay(2000);
    } 
  } 
}

Эту строку можно выкинуть, через 2 секунды после включения всё, что после, будет исполняться всегда

если у тебя pinSensor настроен на ввод, зачем ты в него пишешь?

короче, эту ахинею надо стереть и написать всё грамотно. Как написано, так и работает

Запись в этот пин осталась от экспериментов, согласен что нужно удалить, но ведь ничего от этой записи и не случится, она мозолит глаз да, делает что-то плохое нет

Выкинул запись в pinSensor, проверку на 2сек оставил, это чтобы не было коллизий на старте включении питания питания. Прошил МК, поставил.
Я не возношу свою прогу в эталон, но и считать её ахинеей отказываюсь - это обычная прога.
Меня интересуют больше рекомендации по схеме - где кондёр или индуктивность поставить.

Как долго эта программа должна работать? Постоянно? Или “включил на час-два и выключил”?

Кто Вам сказал? Ничего, что она отменит Ваш INPUT_PULLUP, превратив его в обычный INPUT? Это, по Вашему, “ничего не случится”?

Как говаривал Кузьмич из “национальной рыбалки”

Имеет смысл поставить конденсатор 0.1мкФ параллельно мотору

И диоды в параллель катушкам реле в обратной полярности

Ок, спасибо, диоды 1N1007 норм или что получше?

Пойдёт

как говаривал КузмичЪ
это хорошо ещё что вы не попросили сфоткать и прислать монтаж платы :laughing:

Если проблема не уйдет - попросим :wink:

Теперь тестируйте

я тута подумал пока паял, а если пусковой ток мотора крадёт всё питание от МК и тот уходит в ресет? и как с этим бороться? может поставить 1000 мкФ или тип того на питание МК?

мотор в норме берёт около 4А, но пусковой ток может быть раза в 3 больше, а там ещё проводка такая что максимум 7-8А вытянет