こんにちは,小坂です。 以下のような初期化関数と2つのデューティ設定関数(実際はマクロ)で2系統のPWM信号を作っています。参考になれば幸いです。 http://www2.tokyo-ct.ac.jp/~j/staff/kosaka/for_students/H8_3664/samples/samples.html ここに使用例もあります。(5.タイマーWユニットを用いて2系統PWM出力生成) /*TimerWを利用したPWM出力を2系統出力する*/ /*GRAを周期レジスタ,GRBとGRCを比較対象レジスタとして用いる*/ /*出力は端子FTIOBとFTIOCにでてくる*/ /*周期カウンタは2MHzでカウント(φ/8)*/ /*TimerWPWMの初期化*/ void initTimerWPWM(unsigned short int period) { TW.TMRW.BYTE=3; /*B,CはPWMモード バッファは使わない*/ TW.TCRW.BIT.CCLR=1; /*Aとの一致でTCNTクリア*/ TW.TCRW.BIT.CKS=3; /*クロックはφ/8*/ TW.TCRW.BIT.TOB=1; /*FTIOBは1で開始*/ TW.TCRW.BIT.TOC=1; /*FTIOCは1で開始*/ TW.TIOR0.BIT.IOB=1; /*GRBはアウトプットコンペアレジスタ 一致で0出力*/ TW.TIOR1.BIT.IOC=1; /*GRCはアウトプットコンペアレジスタ 一致で0出力*/ TW.GRA=period; /*周期の設定*/ TW.GRB=0; TW.GRC=0; TW.TMRW.BIT.CTS=1; /*タイマースタート*/ } /* void setPWMValueB(unsigned short int value) { TW.GRB=value; } */ #define setPWMValueB(value) TW.GRB=value /* void setPWMValueC(unsigned short int value) { TW.GRC=value; } */ #define setPWMValueC(value) TW.GRC=value At 18:48 03/02/18 +0900, you wrote: >---具体的には--- >クロックの分周を1/8として、1カウント500nsとしています。 >GRAの値を32000カウントにすると波形の周期は16msになります。(正しいです) >しかし、GRCの値を16000カウントにすると >周期は15.997msになってしまいます。(実際は8msです) >また、そのGRCの値を半分の8000カウントにすると >周期は15.704msと変化はするけど理解できない値になります。(実際は4msです) > >下にプログラムを付けさせてもらいます。 >ご検討のうえ、どう対処すればいいかご回答いただければ幸いです。 **************************************************** 〒193 0997 八王子市椚田町1220-2 東京工業高等専門学校 情報工学科 小坂敏文 phone0426-68-5199 Fax68-5098