サーボの駆動 / シリアルポートからパルス幅を設定する
#include <avr/io.h> #include <util/delay.h> #include "mylib.h" extern "C"{ #include "USART.h" } #define PULSE_MIN 1200 #define PULSE_MID 1500 #define PULSE_MAX 1800 void initTimer1Servo(){ TCCR1A |= (1 << WGM11); TCCR1B |= (1 << WGM12) | (1 << WGM13); // 16ビット、Fast PWMモード TCCR1B |= (1 << CS11); // 8MHzを8分周してカウント ICR1 = 20000; // TOP値、20000usec TCCR1A |= (1 << COM1A1); // OC1Aピン(PB1)でPWM } void enableServo(){ while(TCNT1 < 3000){;} // 制御パルスの途中で何かが始まらないようにする。 DDRB |= (1 << PB1); // 当該ピンのIOをOUTにしてPWMを出力 } /* void disableServo(){ while(TCNT1 < 3000){;} // 制御パルスの途中で何かが始まらないようにする。 DDRB &= ~(1 << PB1); // 当該ピンのIOをINにしてPWMを停止 } */ int main(){ initTimer1Servo(); initUSART(); OCR1A = PULSE_MID; while(1){ enableServo(); // getNumber16()はシリアルで4桁の数字を受信する函数。USART.hに定義してある。 // contain()は値が指定範囲からはみ出さないようにする函数。mylib.hに定義してある。 OCR1A = contain(getNumber16(), PULSE_MIN, PULSE_MAX); _delay_ms(500); } return 0; }