DCモーター / 回転速度をpwmで制御する

pp.289-305

タミヤのソーラーモーター02をほぼ無負荷の状態でNチャンネルMOSFET「2N7000」でドライブしてみる。回転速度はpwmで制御する。

f:id:ti-nspire:20191112071930p:plain:h250

#include <avr/io.h>
#include <util/delay.h>
#include "mylib.h"
extern "C" {
    #include "USART.h"
}

#define DELAY 10

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

int main(){
    initTimer0();
    initUSART();

    OCR0B = 0; // 最初はデューティを0%にしておく(ただし完全に0にはならない)。

    DDRD |= (1 << PD5);              // PD5 (OC0B)からPWMを出力する。そこにN-MOSFETのゲートをつなぐ。
    DDRB |= (1 << PB0) | (1 << PB1); // 加速時、減速時にそれぞれのLEDを点ける。

    uint8_t updateSpeed = OCR0B;
    while(1){

        updateSpeed = getNumber();

        // 現在速度が設定速度より遅い場合は設定速度まで徐々に加速する。
        if(OCR0B < updateSpeed){
            PORTB |= (1 << PB0);
            while(OCR0B < updateSpeed){
                OCR0B++;
                _delay_ms(DELAY);
            }
        }

        // 現在速度が設定速度より遅くない場合は設定速度まで徐々に減速する。
        else{
            PORTB |= (1 << PB1);
            while(OCR0B > updateSpeed){
                OCR0B--;
                _delay_ms(DELAY);
            }
        }

        // 設定速度に一致したらLEDを消す。
        PORTB &= ~((1 << PB0) | (1 << PB1));
    }

    return 0;
}

これでChapter 14 Switchesが終わり。