2024/06/08
秋月電子で販売されている RX621マイコンボード を使ってみる(その3)ラジコンのサーボをPWMを使って動かす
周期を20msecで、High:0.8msec、Low:19.2msec と High:2.25msec、Low:17.75msec を切り替えて サーボモータを動かす。
(可変範囲はいろいろあるが今回はこの値にする)
PB0とPB1のポートを使って2つのサーボモータを制御する
#include "iodefine.h"
void MTU2_initialize(void)
{
/* MTU9 = PWM Mode 1 */
MSTP(MTU9) = 0; /* Wake up MTU9 */
/* タイマプリスケーラ選択ビット */
/* 内部クロック:PCLK / 16 でカウント */
MTU9.TCR.BIT.TPSC = 2;
/* クロックエッジ選択ビット */
/* 立ち下がりエッジでカウント */
MTU9.TCR.BIT.CKEG = 1;
/* カウンタクリア要因選択ビット */
/* TGRAのコンペアマッチ/インプットキャプチャでTCNTクリア */
MTU9.TCR.BIT.CCLR = 1;
/* モード選択ビット */
/* PWMモード1 */
MTU9.TMDR.BIT.MD = 2;
/* バッファ動作Aビット */
/* TGRAとTGRCレジスタは通常動作 */
MTU9.TMDR.BIT.BFA = 0;
/* バッファ動作Bビット */
/* TGRBとTGRDレジスタは通常動作 */
MTU9.TMDR.BIT.BFB = 0;
/* I/OコントロールAビット */
/* 初期出力はLow出力,コンペアマッチでHigh出力 */
MTU9.TIORH.BIT.IOA = 2;
/* I/OコントロールBビット */
/* 初期出力はLow出力,コンペアマッチでLow出力 */
MTU9.TIORH.BIT.IOB = 1;
/* タイマジェネラルレジスタA */
/* (1/48000000)*16*60000=20msec(50Hz) */
MTU9.TGRA = 60000;
/* タイマジェネラルレジスタB */
/* (1/48000000)*16*4500=1.5msec */
MTU9.TGRB = 4500;
/* I/OコントロールCビット */
/* 初期出力はLow出力,コンペアマッチでHigh出力 */
MTU9.TIORL.BIT.IOC = 2;
MTU9.TIORL.BIT.IOC = 2;
/* I/OコントロールDビット */
/* 初期出力はLow出力,コンペアマッチでLow出力 */
MTU9.TIORL.BIT.IOD = 1;
/* タイマジェネラルレジスタC */
/* (1/48000000)*16*60000=20 msec(50Hz) */
MTU9.TGRC = 60000;
/* タイマジェネラルレジスタD */
/* (1/48000000)*16*4500=1.5 msec */
MTU9.TGRD = 4500;
/* タイマカウンタ(TCNT) */
MTU9.TCNT = 0;
/* MTU9.TCNTはカウント動作 */
MTUB.TSTR.BIT.CST3 = 1;
}
void main(void)
{
long int i;
/* コアクロック96MHz */
SYSTEM.SCKCR.BIT.ICK = 0;
/* 周辺機器クロック PCLK=48MHz */
SYSTEM.SCKCR.BIT.PCK = 1;
MTU2_initialize();
while(1) {
/* タイマジェネラルレジスタB */
/* (1/48000000)*16*2400=0.8msec */
MTU9.TGRB = 2400;
for (i = 0 ; i <= 21000000 ; i++) {
/* タイマジェネラルレジスタD */
MTU9.TGRD = 2400 + (i / 5000);
}
/* タイマジェネラルレジスタB */
/* (1/48000000)*16*6600=2.25msec */
MTU9.TGRB = 6600;
for (i = 0 ; i <= 21000000 ; i++) {
/* タイマジェネラルレジスタD */
MTU9.TGRD = 6600 - (i / 5000);
}
}
}