Как защитится от дребезга кнопки? Имеется скетч...
- Войдите на сайт для отправки комментариев
Сб, 25/07/2020 - 21:50
Как защитится от дребезга кнопки? (если это дребезг) Имеется скетч...
Кнопка стабильно не работает на этом скетче. При нажатии должен изменится направление, изменяется но не стабильно...
Можно ли стабилизировать?
Скетч взят вот отсюда: https://dronebotworkshop.com/big-stepper-motors/
/* Stepper Motor Test stepper-test01.ino Uses DM860H or similar Stepper Driver Unit Has speed control & reverse switch DroneBot Workshop 2019 https://dronebotworkshop.com */ // Defin pins int reverseSwitch = 2; // Push button for reverse int driverPUL = 7; // PUL- pin int driverDIR = 6; // DIR- pin int spd = A0; // Potentiometer // Variables int pd = 500; // Pulse Delay period boolean setdir = LOW; // Set Direction // Interrupt Handler void revmotor (){ setdir = !setdir; } void setup() { pinMode (driverPUL, OUTPUT); pinMode (driverDIR, OUTPUT); attachInterrupt(digitalPinToInterrupt(reverseSwitch), revmotor, FALLING); } void loop() { pd = map((analogRead(spd)),0,1023,2000,50); digitalWrite(driverDIR,setdir); digitalWrite(driverPUL,HIGH); delayMicroseconds(pd); digitalWrite(driverPUL,LOW); delayMicroseconds(pd); }
Потому что не надо брать непонятно какие скетчи, надо самому писать.
Этот код стабильно работать не может по определению. Мало того что дребезг, еще и пин кнопки наверняка в воздухе болтается.
Как улучшить? Во первых подтянуть кнопку - программно или аппаратно. И во-вторых убрать изменение вращения из прерывания. В прерывании оставить флаг, а сам реверс включать в лупе, причем не чаще раз в полсекунды, для примера
Уважаемые! Кнопка подтянута аппаратно, а вот как подтянуть программно? Всё остальное меня устраивает.
Кнопка подтянута аппаратно, а вот как подтянуть программно?
Берёшь подтяжку от штанов и между 34 и 36 строками её наматываешь.
Честно говоря, не совсем понятно, зачем здесь кнопка подключена через прерывания, но то дело хозяйское. А дребезг подавляется путем задержки реакции на изменение состояния кнопки. Т. е. состояние изменилось, запомнили его и через 50-80 милисекунд снова проверили - если состояние кнопки совпадает с изменившимся, значит имеем нажатие/отпускание кнопки, нет - игнорируем.
Про подтяжку вопрос был не про кнопку, а про подтяжку пина МК, к которому кнопка подключена. На нем при разомкнутой кнопке должен быть стабильный уровень, в вашем случае должен быть высокий уровень. Для этого вы должны либо соединить пин с VCC через резистор, либо установить пину соответствующий режим.
Уважаемые! Кнопка подтянута аппаратно, а вот как подтянуть программно? Всё остальное меня устраивает.
А если остальное вас устраивает - не понятно, зачем вы писали на форум
Да же и не представлял что есть такая функция:
digitalPinToInterrupt().
Ручками как то удобнее и нагляднее
есть мнение, что переменные setdir и previousMillis нужно объявлять как volatile
есть мнение, что переменные setdir и previousMillis нужно объявлять как volatile
можно и объявить, но previousMillis зачем?
Затем, что обрабатывается в прерывании
Затем, что обрабатывается в прерывании
на пальцах покажите )))
как понимаю я -на входе в прерывание значение переменной миллис зафиксировано и не изменяется, в прерывании после обработки функции сохраняем значение и более она нигде измениться не может.
Какая целевая функция делать её волатильной?
del
Похоже, был не прав ))