BB20A284SNF

R8C 28/29 RCタイマでPWM出力

PWM出力制御を行うためにマイコンを探していたのですが、今回は諸仕様の関係からR8C28(R5F21284SNSP)を選定しました。

PDG(Peripheral Driver Generator)は使わない主義(時と場合にもよります)なので、直接レジスタの設定を行います。

R8C28/29マイコンのRCタイマにはPWM1モードとPWM2モードがあります。今回の仕様は

  • PWM開始ウェイトは不要である
  • 2系統の出力を行いたい
  • 周期は同じである

でしたのでPWM1モードを選定しました。

早速レジスタの設定をしていきます。クロックの設定は事前に済んでいます。

#define    pwm_cycle   (2000-1)            // pwm cycle:10kHz -> 2000cnt.
#define    pwm_100     pwm_cycle           // pwm 100%
#define    pwm_0       (pwm_cycle+1)       // pwm 0%
#define    pwm(v)      ((pwm_0-20*v)-1)    // pwm x%
~中略~
void main(void)
{
    // timerC settings
    trcmr = 0x0e;                       // timerC mode register
                                        // trcioc pwm1
                                        // trciod pwm1
                                        // pwm or timer mode (not pwm2)
    trccr1 = 0x80;                      // timerC control register1
                                        // pwmC act.H
                                        // pwmD act.H
                                        // f
                                        // trc clear by trcgra compare match
    trcier = 0;                         // interrupt enable register
                                        // all mask
    trcsr = 0;                          // status register
    trc = 0;                            // trc counter
    trcgra = pwm_cycle;                 // general registerA (pwm cycle:10kHz -> 2000cnt.)
    trcgrb = 0;                         // un-use
    trcgrc = pwm(30);                   // general registerC (duty-off term)
    trcgrd = pwm(30);                   // general registerD (duty-off term)
    trcoer = 0x73;                      // output enable register
                                        // enable trcioc and trciod

    tstart_trcmr = 1;                   // start pwm action
    for(;;)
    {
        ;                               // Idling
    }
}

I/Oの優先順位は周辺機能の方が上ですから、TRCIOC出力/TRCIOD出力はタイマRCの設定でOKと思っていましたが、上記コードではPWMが出力されませんでした。

設定値を何度見直しても間違いがありません。

仕方なしにハードウェアマニュアルを一から見直すと…しっかり記載されていました。端子選択レジスタです。

TRCIOC/TRCIODに関連するのはPINSR3レジスタです。こちらの設定を加えます。

#define    pwm_cycle   (2000-1)            // pwm cycle:10kHz -> 2000cnt.
#define    pwm_100     pwm_cycle           // pwm 100%
#define    pwm_0       (pwm_cycle+1)       // pwm 0%
#define    pwm(v)      ((pwm_0-20*v)-1)    // pwm x%
~中略~
void main(void)
{
    // port function(timer)
    pinsr3 = 0x38;                      // enable trcioc, trciod

    // timerC settings
    trcmr = 0x0e;                       // timerC mode register
                                        // trcioc pwm1
                                        // trciod pwm1
                                        // pwm or timer mode (not pwm2)
    trccr1 = 0x80;                      // timerC control register1
                                        // pwmC act.H
                                        // pwmD act.H
                                        // f
                                        // trc clear by trcgra compare match
    trcier = 0;                         // interrupt enable register
                                        // all mask
    trcsr = 0;                          // status register
    trc = 0;                            // trc counter
    trcgra = pwm_cycle;                 // general registerA (pwm cycle:10kHz -> 2000cnt.)
    trcgrb = 0;                         // un-use
    trcgrc = pwm(30);                   // general registerC (duty-off term)
    trcgrd = pwm(30);                   // general registerD (duty-off term)
    trcoer = 0x73;                      // output enable register
                                        // enable trcioc and trciod

    tstart_trcmr = 1;                   // start pwm action
    for(;;)
    {
        ;                               // Idling
    }
}

ハードウェアマニュアルの注記にもありますが、端子選択レジスタ(今回はPINSR3)の設定は周辺機能の設定よりも前に行いましょう。タイマRCアウトプットマスタ許可レジスタ(TRCOER)の設定が正しく反映されないことがあるかもしれません(マニュアル指示に従いましょう)。

以上の設定でタイマRCのPWM1出力が正しくされるようになりました。

今回はTRCIOC/TRCIODの2系統でしたが、TRCIOBも試用すれば3系統の同時出力が可能です。R8C28は(比較的?)小ピンマイコンなので簡易ドライバの作成や評価ドライバの作成にうってつけです。機会がありましたらお試しください。

R8C28の評価ボードは北斗電子さんで販売されています。
(今回も北斗電子さんのボードを利用しています)

ABOUT ME
Nozomu.Kon
トータルソフトウェアコーディネーターがあなたのお困りを即時に解決!