Как защитится от дребезга кнопки? Имеется скетч...

Ales
Offline
Зарегистрирован: 05.04.2020

Как защитится от дребезга кнопки? (если это дребезг) Имеется скетч... 

Кнопка стабильно не работает на этом скетче. При нажатии должен изменится направление, изменяется но не стабильно...

Можно ли стабилизировать?

Скетч взят вот отсюда: 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);
 
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Потому что не надо брать непонятно какие скетчи, надо самому писать.
Этот код стабильно работать не может по определению. Мало того что дребезг, еще и пин кнопки наверняка в воздухе болтается.
Как улучшить? Во первых подтянуть кнопку - программно или аппаратно. И во-вторых убрать изменение вращения из прерывания. В прерывании оставить флаг, а сам реверс включать в лупе, причем не чаще раз в полсекунды, для примера

Ales
Offline
Зарегистрирован: 05.04.2020

Уважаемые! Кнопка подтянута аппаратно, а вот как подтянуть программно? Всё остальное меня устраивает. 

 

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Ales пишет:

Кнопка подтянута аппаратно, а вот как подтянуть программно?

Берёшь подтяжку от штанов и между 34 и 36 строками её наматываешь.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Честно говоря, не совсем понятно, зачем здесь кнопка подключена через прерывания, но то дело хозяйское. А дребезг подавляется путем задержки реакции на изменение состояния кнопки. Т. е. состояние изменилось, запомнили его и через 50-80 милисекунд снова проверили - если состояние кнопки совпадает с изменившимся, значит имеем нажатие/отпускание кнопки, нет - игнорируем.
Про подтяжку вопрос был не про кнопку, а про подтяжку пина МК, к которому кнопка подключена. На нем при разомкнутой кнопке должен быть стабильный уровень, в вашем случае должен быть высокий уровень. Для этого вы должны либо соединить пин с VCC через резистор, либо установить пину соответствующий режим.

b707
Offline
Зарегистрирован: 26.05.2017

Ales пишет:

Уважаемые! Кнопка подтянута аппаратно, а вот как подтянуть программно? Всё остальное меня устраивает. 

 

 

Кнопка подтягивается к плюсу или аппаратно, или програмно. Если кнопка подтянута аппаратно, то програмно ее подтягивать уже не нужно. Только вы точно понимаете, что это значит?
А если остальное вас устраивает - не понятно, зачем вы писали на форум

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Да же и не представлял что есть такая функция:
digitalPinToInterrupt().
Ручками как то удобнее и нагляднее

Izvekoff
Offline
Зарегистрирован: 02.03.2020

/*
  Stepper Motor Test
  stepper-test01.ino
  Uses DM860H or similar Stepper Driver Unit
  Has speed control & reverse switch
  
  DroneBot Workshop 2019
  <a href="https://dronebotworkshop.com" title="https://dronebotworkshop.com" rel="nofollow">https://dronebotworkshop.com</a>
*/

// 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
unsigned long previousMillis = 0;
uint16_t t_drebezg = 80;

// Interrupt Handler

void revmotor (){
if(millis()-previousMillis > t_drebezg){
   setdir = !setdir;
   previousMillis = millis();
 }
}


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);
 
}

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

есть мнение, что переменные setdir и previousMillis нужно объявлять как volatile

Izvekoff
Offline
Зарегистрирован: 02.03.2020

v258 пишет:

есть мнение, что переменные setdir и previousMillis нужно объявлять как volatile

можно и объявить, но previousMillis зачем?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Затем, что обрабатывается в прерывании

Izvekoff
Offline
Зарегистрирован: 02.03.2020

v258 пишет:

Затем, что обрабатывается в прерывании

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

Какая целевая функция делать её волатильной?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

del
Похоже, был не прав ))