int StopperLeft=6;
int StopperRight=7;
int ENBL = 3;
int DIR = 4;
int PUL = 5;
.....
void motor (long col , int side)
{
if(lock==false){
lock=true;
digitalWrite(ENBL, HIGH);
if(side==1)
digitalWrite(DIR, HIGH);
else if(side==2)
digitalWrite(DIR, LOW);
analogWrite(PUL, 127);
for(int x=0;x<col*s;x++)
{
// delay(215);
if(side==1){
if (digitalRead(StopperLeft) == HIGH) {
break;
}
}
else if (side==2){
if (digitalRead(StopperRight) == HIGH) {
break;
}
}
}
analogWrite(PUL, 0);
lock=false;
// digitalWrite(4, LOW);
}
}
Как видно, я сперва включаю драйвер (ENBL) затем указываю направление (DIR) и делаю 50% работы PWM на PUL, и мотор работает до того момента, пока я не сделаю 0%. Вроде всё хорошо и работает, но мне что - то подсказывает, что есть более грамотный способ. Если он существует, пожалуйста подскажите, заранее благодарю и надеюсь на адекватный ответ! Спасибо за прочтение сие поста, Иван.
Можно использовать аппаратный генератор PWM вместо analogWrite():
Код
// Инициализация
// такая для пина 11
DDRB=(1<<PB3); // Arduino Pin D11
TCCR2A=(1<<COM2A1) | (1<<WGM21) | (1<<WGM20); // Fast PWM for OC2A
TCCR2B=(1<<CS21); // 8kHz
// либо для пина 3
DDRD=(1<<PD3); // Arduino Pin D3
TCCR2A=(1<<COM2B1) | (1<<WGM21) | (1<<WGM20); // Fast PWM for OC2B
TCCR2B=(1<<CS21); // 8kHz
// Выбор скважности как у analogWrite() для пин 11
OCR2A=0; // Power = 0%
OCR2A=127; // Power = 50%
OCR2A=255; // Power = 100%
// либо для пина 3
OCR2B=0; // Power = 0%
OCR2B=127; // Power = 50%
OCR2B=255; // Power = 100%
Так сможешь сэкономить немного процессорного времени. Остальное управление ENBL и DIR можно использовать как у тебя.