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の評価ボードは北斗電子さんで販売されています。
(今回も北斗電子さんのボードを利用しています)