SH7144

プログラミング初心者です。
SH7144でエンコーダのパルス信号をそのまま出力する方法が分かりません。
エンコーダ入力=出力だとエンコーダのエッジ検出が追いつきません。
位相計数モードでカウントはできるのですが、出力波形をエンコーダのA相エッジカウント数(設定)で"1"を出力したいです。
IRQでやるべきか、位相計数モードでうまくできるのかもわかりません。

仕様としては、エンコーダから来る信号のA相エッジ数を検出し回数をカウント。あるカウント数になったら出力する。または出力を変える。
分かる方教えてください。

  • MTU.CNTの波形をどのようにして確認しているのか、教えて下さい。できればプログラムソースもしくはアウトラインも知りたいです。確認方法に問題がないかを確認するためです。

  • 波形はオシロスコープでモニタしてます。

    ソースですが。エンコーダの部分だけだと下記のようになります。

    PD9ピンをオシロスコープで見ています。

  • TCNTの最下位ビットの変化を波形として見たいというプログラムでしょうか。

    提示された部分だけだと、PD9はLのままだと思います。

    PD9を更新しているところが他にありませんか?

  • このソースに関しては、TCNTの最下位ビットをモニタするためのプログラムになってます。

    実際に近いソースは下記になります。

    TCNTの波形を利用し内部パルスを作り、桁上がりを利用して逓倍(変数)しています。

    PD9は最初に"1"にしています。

  • うーん。何だか違和感があります。

    後に提示されたソースでは、

    グローバル変数として、

    PD.DR.BIT.B9= 1;

    に初期化した後(私は普段このような使い方はしません)、

    main関数で

    PD.DR.BIT.B9 = EN_cnt;

    をした時に、EN_cnt(値0)になったままのように見えます。

    TCNTをモニタするとしたら、定期的にTCNTを読み取って、PD9に設定する処理が必要なはずなのですが、そのような処理が見当たらないのが、違和感の元です。

  • ループするwhile(1)が抜けていました。

    //

    int EN_cnt; /* 4逓倍入力値 */

    int ENC_count; /* 回転カウント値 */

    double ENC_countx;

    double DSET ; //パルス逓倍数値 デジタル入力

    int DSETD;

    int DIG1;

    PD.DR.BIT.B8=  1; //

    PD.DR.BIT.B9=  1; //

    PD.DR.BIT.B14= 1; //

    PD.DR.BIT.B15= 1; //

    void initENC(void)

    {

    PFC.PACRL1.BIT.PA8MD=1; /*A相(PA8,TCLKC)の定義*/

    PFC.PACRL1.BIT.PA9MD=1; /*B相(PA9,TCLKD)の定義*/

    PFC.PDIORH.WORD = 0xFFFF; /* PD0-15は出力ポート */

    MST.CR2.BIT._MTU=0; /*モジュールスタンバイの解除 */

    MTU2.TMDR.BIT.MD=4; /* 位相計数モード1 4逓倍*/

    //MTU2.TMDR.BIT.MD=7; /* 位相計数モード4 2逓倍*/

    MTU2.TCNT=0; /* カウントクリア 位相計数モード*/

    MTU.TSTR.BIT.CST2=1; /*カウント動作スタート */

    }

    void main(void)

    {

    initENC();

    extern int EN_cnt;

    extern int ENC_count;

    while(1)

    {

    PD.DR.BIT.B8 = PA.DR.BIT.B8; //

    PD.DR.BIT.B9 = EN_cnt; //

    PD.DR.BIT.B15 = ENC_count; // LED ON/OFF

    EN_cnt = MTU2.TCNT; //エンコーダカウント読込 4逓倍カウント

    ENC_count = (EN_cnt/2); //エンコーダの入力 4逓倍カウント÷2

    ENC_countx = ENC_count; //

    /* パルス逓倍 */

    DSETD = ((ENC_countx)/2)*1000*(DSET*2);

    DIG1 = ((DSETD/(10000))%10 & 0x0f);

    PD.DR.BIT.B14 = DIG1; //逓倍パルス

    }

    }

  • やっと理解できました。

    観測される挙動ですが、TCNTが0xFFFFになる一定時間まではPD9が変化するが、それ以降はPD9がHのままという事は考えられませんか?TCNTがオーバーフローしたら、ふつうは0に戻るような気がしますが、マニュアルを見るとTCNTのクリア要因(TCRのCCLR2-0)の初期状態が、TCNTのクリア禁止となっており、そのあたりが気になります。

  • 観測している波形はずっとパルス出力されています。

    "H"のままということはありません。

    エンコーダからの入力が停止したら、"H"になりますが。

    クリアの設定したほうが良いのでしょうか?

  • そうすると、何が問題なのか、わからなくなってきました。

    「MTU.CNTの波形が飽和(サチる?)ので」

    とはどういう状態を言っているのでしょうか?

    以前から気にされている、周波数の上限や分解能との関連が、見えないのですが...

  • MTU.CNTの波形を観測しモーターに接続したエンコーダを回転させ、徐々にモータースピード(=エンコーダのパルススピード)を高速にしていくと、MTU.CNTの最下位波形がある程度の速度まではエンコーダのパルスに追従するのですが、ある程度の速度で飽和?してしまい、MTU.CNTの最下位波形パルス周期が大きくなります。

    なぜこのような現象が起きているのか分かれば教えてください。