R8C/2LでPWM


概要

タイマRCとタイマRDにPWMモードがあり、タイマRCで3本、 タイマRDは1チャンネルあたり3本の2チャンネル出力可能。 加えて、タイマRBのプログラマブル波形出力モードもPWM出力が可能なので、 合計10本のPWM出力が可能。

タイマRB: プログラマブル波形発生モード

2つのリロードレジスタの値を、カウンタに交互にリロードし、アンダーフローするたびに出力を反転させるモード。リロードレジスタ(8bit)の値の偏りによって、PWM出来る。
関係するレジスタの設定するビット
利用例
void setpwm_trb(int r){
    if(r == 0){
        p1_3 = 0;
        tocnt_trbioc = 1;
    }else if(r == 255){
        p1_3 = 1;
        tocnt_trbioc = 1;
    }else{
        trbsc = 254 - r;
        trbpr = r - 1;
        tocnt_trbioc = 0;
    }
}

int main(){
    volatile int t, i;
    prc2 = 1;
    pd0 = 0b00101111;
    pd1 = 0b11111111;
    pd2 = 0b11111111;
    pd3 = 0b00111000;
    pd4 = 0b00100000;

    trbioc = 0b00000000;
    trbmr = 0b00001001;
    trbpre = 4 - 1;
    trbsc = 0xfd;
    trbpr = 0x00;
    trbcr = 0b00000001;

    while(1){
        for(i = 0; i < 256; i++){
            setpwm_trb(i);
            for(t = 0; t < 8000; t++);
        }
    }
}
    

この例では、クロック源f1を1/4に分周して、 trbscとtrbprの和が254になるよう保つことで メインクロック(f1)の1024(=256*4)分の1の周波数のPWMを出力する。 dutyを100%や0%にしたいときには trbiocのtocntビットを立ててGPIO出力を利用する。

タイマC: PWMモード

TRCカウンタをカウントアップしながら TRCGRAのコンペア一致とTRCGRB-TRCGRDのコンペア一致で それぞれTRCIOB-TRCIOD端子の出力を変化させることのできるモード。
TRCGRAのコンペア一致と同時にカウンタをリセットすることも可能。
これは言い換えれば、TRCGRAに周期、TRCGRB-TRCGRDにHighの幅を指定することで 最大3本のPWM出力が可能であるといえる。(出力は個別に無効化できる)
関係するレジスタの設定するビット
利用例
int main(){
    volatile int t, i;
    prc2 = 1;
    pd0 = 0b00101111;
    pd1 = 0b11111111;
    pd2 = 0b11111111;
    pd3 = 0b00111000;
    pd4 = 0b00100000;

    trccr1 = 0b10001110;
    trcmr = 0b10001111;
    trcier = 0b00000000;
    trcoer = 0b00000001;
    trcgra = 1000 - 1;
    trcgrb = 0;
    trcgrc = 0;
    trcgrd = 0;
    tstart_trcmr = 1;

    while(1){
        for(i = 0; i < 1000; i++){
            trcgrb = i;
            trcgrc = (i + 333) % 1000;
            trcgrd = (i + 666) % 1000;
            for(t = 0; t < 2000; t++);
        }
    }
}
    

この例では、TRCIOB-TRCIODの各端子から それぞれ少しずつdutyの違うPWM出力をする。 周期はシステムクロックの1/1000になる。