Всем привет, собрал проект электронная педаль газа на трактор на 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); // ЖАРИТЬ ШИМ!
}
}