サーボの駆動 / シリアルポートからパルス幅を設定する

f:id:ti-nspire:20190911151809p:plain:h270

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