RL78/G12 タイマ・アレイ・ユニット(PWM 出力)

これの C source ってないのでしょうか。

Parents
  • r01an2589.zip

    チョコです。

    G12では、アセンブラ記述しかないようですね。

    G13のPWMのサンプルコードを少しモディファイすれば流用できます。

    なお、G12では、20pinと24pinではTO01がP14になるので、そこは注意してください。30pinならそのまま使えるはずです。ただし、クロック周波数が異なるので、きちんと時間を合わせるなら、チューニングが必要です。

    なお、CS+で、コード生成を使えば、GUIベースでPWMの設定は簡単にできます。

    そこで、RL78/G13のサンプルコードの「RL78/G13 タイマ・アレイ・ユニット(PWM出力) CC-RL」をターゲットをRL78/G12(20pinのR5F1026A)に変更してみました。

    G13からG12にCPUを変更すると、I/Oヘッダ・ファイル(iodefine.h)を生成し直し、コード生成をやり直す必要があります。

    さらに、クロック周波数が24MHzと異なるので、r_cg_timer_user.cの中の「_1900_TAU_TDR01_VALUE」の部分を「_12C0_TAU_TDR01_VALUE」に変更します。

    これで使えるはずです。

    CS+でここまでやった結果をzipファイルで添付しておきます。

    G12はコードフラッシュのサイズが小さいので、無償評価版のCS+の制限内で使えます。

  • 有難うございます。
  • rl78_g12_tau_pwm_B.zip

    チョコです。

    オリジナルのソフトが気に入らないので、少しモディファイしてみました。

    主に、r_cg_timer_user.cをいじってみました。一番大きいのは、PWMのアクティブ期間の増分を変な定数(コード生成が定義したTDR01への設定値)ではなくしました。

    (32MHzのG13から24MHzのG12に変更するときに余分な手間がかかったので、そこを何とかしたかったので)

    具体的には、PWM信号のデューティ比(%)で指定するように変更しました。このために"uint16_t r_set_duty( uint8_t );"と言う関数を定義し、引数としてPWMのデューティ比(%)を渡すと、スレーブのTDRに設定する値が戻されるようにしました。こちらの方がPWMとしては使いやすいかと思います。

    この関数では、マスタ・チャネルの設定値(TDR00の設定値)を読み出して、+1して周期を求め、それにデューティを掛けて、100で割ることでスレーブチャネルのTDRへの設定値を求めています。計算は整数演算だけで、浮動小数点演算は使ってません。

    また、以下のように変数や定数を定義して、分かりやすくしました。ついでに、定数DEBUGを定義しておくと、配列data_listにTDR01の値の変化を10回分ログしておけます。

    必要なければ、「#define DEBUG」をコメントアウトしてください。

    この設定で、r_set_dutyにブレークポイントを設定して10回実行すると、以下のような結果が得られました。

    ということで、少し使えそうな格好にして遊んでみました。

    プロジェクトをzipファイルで添付しているので、興味のある人は眺めてみてください。

Reply
  • rl78_g12_tau_pwm_B.zip

    チョコです。

    オリジナルのソフトが気に入らないので、少しモディファイしてみました。

    主に、r_cg_timer_user.cをいじってみました。一番大きいのは、PWMのアクティブ期間の増分を変な定数(コード生成が定義したTDR01への設定値)ではなくしました。

    (32MHzのG13から24MHzのG12に変更するときに余分な手間がかかったので、そこを何とかしたかったので)

    具体的には、PWM信号のデューティ比(%)で指定するように変更しました。このために"uint16_t r_set_duty( uint8_t );"と言う関数を定義し、引数としてPWMのデューティ比(%)を渡すと、スレーブのTDRに設定する値が戻されるようにしました。こちらの方がPWMとしては使いやすいかと思います。

    この関数では、マスタ・チャネルの設定値(TDR00の設定値)を読み出して、+1して周期を求め、それにデューティを掛けて、100で割ることでスレーブチャネルのTDRへの設定値を求めています。計算は整数演算だけで、浮動小数点演算は使ってません。

    また、以下のように変数や定数を定義して、分かりやすくしました。ついでに、定数DEBUGを定義しておくと、配列data_listにTDR01の値の変化を10回分ログしておけます。

    必要なければ、「#define DEBUG」をコメントアウトしてください。

    この設定で、r_set_dutyにブレークポイントを設定して10回実行すると、以下のような結果が得られました。

    ということで、少し使えそうな格好にして遊んでみました。

    プロジェクトをzipファイルで添付しているので、興味のある人は眺めてみてください。

Children
  • rl78_g12_tau_pwm_C.zip

     

    チョコです。

    前回が、あまりに面白くないプログラムだったので、少し手を加えて、PWM信号で正弦波を出力するようにしてみました。

    正弦波のデータは1周期を20サンプリングしたものをconstのデータでもっておき、テーブル参照で読んでくるだけです。

    前回作成したr_set_dutyを使えば、簡単にPWM信号が出せます。

    今回はPWM信号の周期を500μsにして、20カウントで正弦波の1周期です。(したがって10ms、100Hzになります。)

    マスタ・チャネル(TM00)のTDR00の設定値が11999(12000カウント)なので、まだ、周波数的には余裕はありそうです。

    スレーブ・チャネルの設定値の変化のログを示しておきます。

     

    また、参考用にプロジェクトのzipファイルを添付しておきます。

    今回はシミュレータで波形を確認できるようにしておきました。

     

    以上