0 голосов

Всем привет, собрал проект электронная педаль газа на трактор на arduino. Суть в том, что на педали газа потенциометр задающий сопротивление, и к тяге ТНВД двигателя прикреплен так скажем сервопривод (мотор на 24 вольт и потенциометр). Встал вопрос о защите от обрыва потенциометров, как реализовать защиту программно? А то допустим выйдет из строя или отпадет провод потенциометра у сервопривода и программа будет крутить мотор редуктора бесконечно. Для примера собрал макет: вывода на экран LCD 1602 значения потенциометра. Потенциометр подключен как обычно к минусу, к +5V и к аналоговому входу. Диапазон измерения потенциометра получился от 0 до 1018. При обрыве среднего вывода значения очень быстро скачут от 112 где-то до 272 примерно. При обрыве плюса показывает 0, при обрыве минуса показывает 1022.

за основу я взял скетч и драйвер коллекторного двигателя, который описал Алекс Гайвер. Вот теперь думаю какие изменения внести в код чтобы допустим если через две секунды потенциометры не согласовались, то остановить все переключения

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

#define DEADZONE 20 // "мёртвая зона" потенциометра
// пины драйвера, P1 и P4 должны быть на PWM пинах! (3, 5, 6, 9, 10, 11 для NANO и UNO)
#define P1 3
#define P2 4
#define P3 5
#define P4 6
#define pedPin 0      // сюда подключен потенциометр
#define redPin 1
#define ruchkaPin 2
boolean switch_flag;
int pedpotent, duty, redpotent, ruchka;
int left_min, right_min;
uint32_t now;

void setup() {
  // все пины драйвера как выходы, и сразу выключаем
  pinMode(P1, OUTPUT);
  digitalWrite(P1, 0);
  pinMode(P2, OUTPUT);
  digitalWrite(P2, 0);
  pinMode(P3, OUTPUT);
  digitalWrite(P3, 0);
  pinMode(P4, OUTPUT);
  digitalWrite(P4, 0);
  now = millis();
}

void loop() {
  ruchka = analogRead(ruchkaPin);
  pedpotent = analogRead(pedPin); 
  now = millis(); 
  if (ruchka > pedpotent) {
  redpotent = analogRead(redPin);
  left_min = redpotent - DEADZONE;   // расчёт границ мёртвой зоны
  right_min = redpotent + DEADZONE;  // расчёт границ мёртвой зоны
  if (ruchka > left_min && ruchka < right_min) {  // если мы в "мёртвой" зоне
    
    digitalWrite(P1, 0); // вырубить все ключи
    digitalWrite(P2, 0);
    digitalWrite(P3, 0);
    digitalWrite(P4, 0);
    switch_flag = 1;          // разрешить переключение
  } else 
  if (ruchka > right_min && millis() - now < 2000) {
     // если мы вышли из мёртвой зоны справа
 
    if (switch_flag) {        // если разрешено переключение
      switch_flag = 0;        // запретить переключение
      digitalWrite(P2, 0);    // вырубить Р канальный второго плеча
      digitalWrite(P4, 0);    // вырубить N канальный второго плеча
      delayMicroseconds(5);   // задержечка на переключение на всякий случай
      digitalWrite(P3, 1);    // врубить Р канальный первого плеча
      
    }
    // рассчитать скважность для N канального первого плеча
    duty = map(ruchka, right_min, 1023, 150, 255);
    analogWrite(P1, duty);    // ЖАРИТЬ ШИМ!
  }
    else 
  if (ruchka < left_min && millis() - now < 2000) {                 // если мы вышли из мёртвой зоны слева
    
    if (switch_flag) {        // если разрешено переключение
      
      switch_flag = 0;        // запретить переключение
      digitalWrite(P3, 0);    // вырубить Р канальный первого плеча
      digitalWrite(P1, 0);    // вырубить N канальный первого плеча
      delayMicroseconds(5);   // задержечка на переключение на всякий случай
      digitalWrite(P2, 1);    // врубить Р канальный второго плеча
      
    }
    // рассчитать скважность для N канального второго плеча
    duty = map(ruchka, left_min, 0, 150, 255);
    analogWrite(P4, duty);    // ЖАРИТЬ ШИМ!
  }
  }

(2 баллов) 1

2 Ответы

0 голосов

Встал вопрос о защите от обрыва потенциометров

 Аналоговый вывод притянуть к нулевой шине с помощью высокоомного резистора. Например, 100к. Потенциометр, напомню, для АЦП AVR не должен превышать значения в 10к. Тогда при обрыве среднего вывода потенциометра на выводе будет висеть потенциал, близкий к потенциалу нулевой шины и двигатель не уйдёт в разнос.

(2.3 тыс. баллов) 4 21 55
0 голосов

Сделайте вот так:

(433 баллов) 3 6 17
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. Un_ka

    98 балл(ов)

  2. parovoZZ

    82 балл(ов)

  3. Евгений Евтишенков

    42 балл(ов)

  4. sser

    20 балл(ов)

  5. Валентин

    5 балл(ов)

  6. vajar

    4 балл(ов)

Награды месяца
1-е место: Espruino Pixl.js
2-е место: Espruino Puck.js
3-е место: Espruino Pico

...