DCモーター / Hブリッジで正転、反転を切り換える / Locked Anti-phaseモードで速度を制御する

pp.316-317
Hブリッジの左右に逆相のpwmを印加する。デューティだけで回転方向も回転速度も制御する。
f:id:ti-nspire:20191114124304p:plain:h250

#include <avr/io.h>
#include <util/delay.h>
#include "mylib.h"

void initTimer0(){
    TCCR0A |= (1 << COM0B1);               // コンペアマッチ時にOC0B (PD5)をクリア、ボトム時にOC0B (PD5)をセット。
    TCCR0A |= (1 << COM0A1);               // コンペアマッチ時にOC0A (PD6)をクリア、ボトム時にOC0A (PD6)をセット。
    TCCR0A |= (1 << WGM01) | (1 << WGM00); // Fast PWMモード。
    setPrescaler0(256);                    // Timer0の分周比。0, 1, 8, 64, 256, or 1024
}

void setSpeed(int8_t speed){ // forward max:127, stop:0, backward max:-128
    OCR0B = speed + 128;
    OCR0A = 127 - speed;
}

int main(){
  
    initTimer0();
    DDRD |= (1 << PD5) | (1 << PD6);

    int8_t    direction = 1;
    const int DELAY     = 2000;
    while(1){
        setSpeed(direction * 6)  ; _delay_ms(DELAY); // ゆっくり回す。
        setSpeed(direction * 15) ; _delay_ms(DELAY); // 少し速く回す。
        setSpeed(direction * 100); _delay_ms(DELAY); // さらに速く回す。
        setSpeed(0)              ; _delay_ms(DELAY); // 停止。

        direction = -direction; // 回転方向を逆にして繰り返す。
    }
    
    return 0;
}

――――――――――――――――――――――――――――――
上の例ではpwmを2本使ったが、Locked Anti-phaseモードはHブリッジの左右に逆相のpwmを印加すればいいだけなので、本当はpwmを1本しか使わない。下図のようにnot回路を1個追加すればよい。ただしこの回路構成だとマイコンの起動時に短時間だけ最速で回転してしまう。専用のICを使えば多分そのような心配はない。
f:id:ti-nspire:20191115112123p:plain:h300