Вращение сервомотора с использованием прерываний в Arduino - PullRequest
0 голосов
/ 19 февраля 2020

В настоящее время я пытаюсь использовать режим Timer1 и PWM для создания ШИМ-сигнала для управления серводвигателем. Период составляет 20 мс, и есть три различных значения ширины импульса, каждый из которых управляет положением двигателя. Например, при минимальном импульсе 1 мс двигатель находится на 0 градусов. На 1,5 мс, двигатель на 90 градусов. При максимальном импульсе 2 мс двигатель находится на 180 градусов. Моя реализация ниже. Пожалуйста помоги.


enum{onems, pointonems, twoms}; 

byte state = onems;

 volatile boolean interrupt; 
//***********************************************************************************
void setup()
{  

  pinMode(9,OUTPUT);  // to drive servo on pin 9
  Serial.begin(9600);
  Serial.println(F("PWM_servo_compact"));
  TCCR1A=0b00100010;     //fast PWM mode 14
  TCCR1B=0b00011010;     //fast PWM mode 14, /8 clock scale
   OCR1A=0; 
  ICR1=39999;         //period = 20 ms
  cli(); 
  TIMSK1 = (1 << OCIE1A);
  sei(); 
  Serial.println("I'm ready to run a servo, attach one to pin 9");
}
//***********************************************************************************
void loop()
{ 

  switch(state){
    case onems:

      //Serial.println("a"); 
       interrupt=false; 
       TCCR1B=0b00011001;     //fast PWM mode 14, /1 clock scale
       OCR1A=15999; 
          TCNT1 = 0; //clear 
         if(interrupt==true) state=pointonems;

      break;

    case pointonems:
        //Serial.println("a"); 

          TCCR1B=0b00011001;     //fast PWM mode 14, /1 clock scale
          OCR1A = 23999; 
          TCNT1 = 0; //clear 
          interrupt=false; 

         if(interrupt==true) state = twoms;

      break;
      case twoms:
     Serial.println("a"); 

          TCCR1B=0b00011001;     //fast PWM mode 14, /1 clock scale
          OCR1A = 31999;  
          TCNT1 = 0; //clear 
          interrupt=false; 

          // Stop the timer
          TCCR1B &= 0b00000000;
         if(interrupt==true) state = onems;

      break;

    default:
      break;
  }
  delay(1);

} // Arduino loop()

ISR(PCINT0_vect) {
  interrupt=true; 
}
...