RX630で2つモータの角度制御を行うために位相計数モード1を使っています。片方のモータはTPU2を使用して、TCLKCとTCLKDに入力したA相B相では無事にカウントが読めて制御がかかっています。同じ設定でTPU1を使用して、TCLKAとTCLKBにA相B相で角度制御しようとしたところ、カウントが読めません。以下に初期設定のコードを添付いたします。よろしくお願いいたします。
#include "iodefine.h"
void enc_init(void){
// レジスタプロテクション機能解除
SYSTEM.PRCR.WORD = 0xA503;
// 16ビットタイマパルスユニット0(ユニット0) ストップ状態解除
MSTP(TPU1) = 0;
MSTP(TPU2) = 0;
// レジスタライトプロテクション設定
SYSTEM.PRCR.WORD = 0xA500;
/* IOポート設定 */
// ポートモード選択
PORT1.PMR.BIT.B4 = 0x01; // 周辺機能として使用
PORT1.PMR.BIT.B5 = 0x01; // 周辺機器として使用
PORT1.PMR.BIT.B6 = 0x01; // 周辺機能として使用
PORT1.PMR.BIT.B7 = 0x01; // 周辺機器として使用
// ポート方向選択
PORT1.PDR.BIT.B4 = 0x00; // 入力 (TCLKA)J2.4
PORT1.PDR.BIT.B5 = 0x00; // 入力 (TCLKB)J2.5
PORT1.PDR.BIT.B6 = 0x00; // 入力 (TCLKC)J2.6
PORT1.PDR.BIT.B7 = 0x00; // 入力 (TCLKD)J2.7
/* マルチファンクションピンコントローラ設定 */
// 書き込みプロテクト解除
MPC.PWPR.BIT.B0WI = 0x00;
MPC.PWPR.BIT.PFSWE = 0x01;
// 端子機能制御選択
MPC.P14PFS.BIT.PSEL = 0x04; // 周辺機能を選択する(TCLKA)J2.4
MPC.P15PFS.BIT.PSEL = 0x04; // 周辺機能を選択する(TCLKB)J2.5
MPC.P16PFS.BIT.PSEL = 0x04; // 周辺機能を選択する(TCLKC)J2.6
MPC.P17PFS.BIT.PSEL = 0x04; // 周辺機能を選択する(TCLKD)J2.7
// 書き込みプロテクト設定
MPC.PWPR.BIT.B0WI = 0x01;
MPC.PWPR.BIT.PFSWE = 0x00;
/* TPUの位相計数設定 */
// 位相計数モードの選択
TPU1.TMDR.BIT.MD = 0x04; // 位相計数MODE 1(4逓倍)
TPU2.TMDR.BIT.MD = 0x04; // 位相計数MODE 1(4逓倍)
// カウント動作開始
TPUA.TSTR.BIT.CST1 = 0x01;
TPUA.TSTR.BIT.CST2 = 0x01;
}
上記コードをコピペして実行してみましたが、
TPU1.TCNTTPU2.TCNT
は動きました。TCNTが全く動かないのか、期待する値にならないのかどちらでしょう?
お使いのボードに、USBコネクタは付いていないでしょうか。P14/USB0_DPUPEが悪さをしているという可能性はないでしょうか。もしくは、CANコネクタが付いていて、P15/CRX1にCANのトランシーバが接続されているということはないでしょうか。(そもそも、入力端子に思ったような波形(エンコーダ出力)が入っていないという事もあり得るかと思います。)
tfさん 返信ありがとうございます。
デバッカーでみると0と1を交互に表示したり、65535と0を交互に表示します。使用しているボードは北斗電子のHSBRX630PでUSBコネクタはついています。P15は評価用スイッチに接続しているようなのですが、この場合他のTCLKAとTCLKBを使うしかないのでしょうか。入力端子ににはエンコーダ出力の波形がA相B相ともに確認できております。
>デバッカーでみると0と1を交互に表示したり、65535と0を交互に表示します。
これを見ると、「位相計数モードの設定は合っているが、片方の相入力が無い」と考えられます。
CANのトランシーバはP15にはつながっていない。P15はプルアップなので、エンコーダ出力が勝つでしょう。P14は、USBのプルアップ制御につながっていそう。1.5kΩで、USB D+につながっているとすると、こちらもエンコーダ出力が勝ちそうな気がします。
デバッガで、適当なタイミングで止めて、PORT1.PIDR.B4, PORT1.PIDR.B5を観測。レジスタのリフレッシュボタンを何回か押し、0x0, 0x1の両方の値が観測出来るでしょうか。どちらかの端子が、0x0のみ、または0x1のみに固まっていないでしょうか。(怪しいのは、PORT1.PIDR.B4の方)
入力端子をオシロ等で観測して、期待の波形になっていれば、期待通り動きそうですが。
↑添付のコードを貼り付けただけ。P14とP16を接続、P15とP17を接続して、入力に適当なパルスを入れた場合。