В настоящее время я пытаюсь использовать режим 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;
}