ADコンバータとDTC転送(ソフトウエアトリガ、スキャン、ワンショット変換)で他の端子のアナログデータを読み込む

アナログAN3-AN9の7CHをスキャンモードでDTC転送で読み込んでいます。

メインループで、タイマー1msec割り込みを利用し、2msec毎にADスタート、DTCスタートしております。

AD変換終了割り込みでCHを切替ていますが、CS+のウオッチで変換データbuffer3~9を見ていると、

たまにbuffer3にbuffer4のデータが読み込まれたり(ほかのCHも同じことがおこっている)

しています。

ADスタートかDTC転送のどこを修正したらよいか困っており、ご教授をお願い致します。

 

ソース

メインループ r_main.c

while (1U)
{

---

if(timer_2msec == 0) /****** 2m sec 周期 *****/
{
timer_2msec = 2; 
NOP();
R_ADC_Start(); //A/Dコンバータスタート
R_DTCD0_Start(); // DTC enabled
}

 

割り込み処理 r_cg_adc_user.c

static void __near r_adc_interrupt(void)
{
/* Start user code. Do not edit comment generated here */

R_ADC_Stop(); //ADCS = 0U


if(ad_ch_fg == 0){
buffer3 = (g_ad_value[0U] & 0xFFC0U) >> 6U;
buffer4 = (g_ad_value[1U] & 0xFFC0U) >> 6U;
buffer5 = (g_ad_value[2U] & 0xFFC0U) >> 6U;
buffer6 = (g_ad_value[3U] & 0xFFC0U) >> 6U;

NOP();
ADS = 0x07; // AN7-AN10に切替
NOP();
NOP();
NOP();
R_ADC_Start(); //ADCS = 1U
R_DTCD0_Start(); //DTCスタート
}
else if(ad_ch_fg == 1){
buffer7 = (g_ad_value[0U] & 0xFFC0U) >> 6U;
buffer8 = (g_ad_value[1U] & 0xFFC0U) >> 6U;
buffer9 = (g_ad_value[2U] & 0xFFC0U) >> 6U;
bufferA = (g_ad_value[3U] & 0xFFC0U) >> 6U;

NOP();
ADS = 0x03; // AN3-AN6に切替
NOP();
NOP();
NOP();
ad_fin_fg = 0;
}

ad_ch_fg ^= 0x01;
NOP();

/* End user code. Do not edit comment generated here */
}

 

Parents
  • まゆみ さん、こんにちは。NoMaYです。

    その後、どうでしょうか?進展はありましたでしょうか?

  • NoMaYさん、こんにちは。
    その後、時間の問題もあり、DTC転送でのスキャンモードは一旦あきらめ、セレクトモードにて
    1ch毎に切り替えてAD変換値を読み込む方法に変更して、進めておりました。
    ただ、10個のアナログ入力値を読みたいため、変換時間が結構かかるなぁと思い、DTC転送でのスキャンモード
    を再確認したところ、

    ADコンバータの変換時間を遅くすると、解消するのではないかということがわかりました。
    もともと、CPUのシステムクロック8MHz、AD変換時間4.75μs(38/fclk)としていましたが
    これを、変換時間19μs(152/fclk)とすると、AD値が異常の時にカウントアップさせていたカウンタが
    カウントしなくなるこを確認しております。
    (CS+のウオッチで確認)
    この変換時間以上に早くすると、AD異常のカウントがカウントされます。


    2ms毎でのAD変換完了済みフラグの確認は、そのまま残した状態で、
    AD変換終了割り込みの最初R_ADC_Stop();は削除したり、その他、少し変更しているところもありますが、
    多分この変換時間の設定が原因だったのではと思っております。

    もう少し確認できたら、最終結果を書き込みします。

    ご確認ありがとうございます。
Reply
  • NoMaYさん、こんにちは。
    その後、時間の問題もあり、DTC転送でのスキャンモードは一旦あきらめ、セレクトモードにて
    1ch毎に切り替えてAD変換値を読み込む方法に変更して、進めておりました。
    ただ、10個のアナログ入力値を読みたいため、変換時間が結構かかるなぁと思い、DTC転送でのスキャンモード
    を再確認したところ、

    ADコンバータの変換時間を遅くすると、解消するのではないかということがわかりました。
    もともと、CPUのシステムクロック8MHz、AD変換時間4.75μs(38/fclk)としていましたが
    これを、変換時間19μs(152/fclk)とすると、AD値が異常の時にカウントアップさせていたカウンタが
    カウントしなくなるこを確認しております。
    (CS+のウオッチで確認)
    この変換時間以上に早くすると、AD異常のカウントがカウントされます。


    2ms毎でのAD変換完了済みフラグの確認は、そのまま残した状態で、
    AD変換終了割り込みの最初R_ADC_Stop();は削除したり、その他、少し変更しているところもありますが、
    多分この変換時間の設定が原因だったのではと思っております。

    もう少し確認できたら、最終結果を書き込みします。

    ご確認ありがとうございます。
Children
  • まゆみ さん、こんにちは。NoMaYです。

    > ADコンバータの変換時間を遅くすると、解消するのではないかということがわかりました。
    > もともと、CPUのシステムクロック8MHz、AD変換時間4.75μs(38/fclk)としていましたが
    > これを、変換時間19μs(152/fclk)とすると、AD値が異常の時にカウントアップさせていたカウンタが
    > カウントしなくなるこを確認しております。

    これは、他のDTC転送にざっくりと 4.75μs/125ns=38バイト ぐらい以上のDTCブロック転送があって(DTCコントロールデータの読み込みや書き戻しの分もあるのでもうちょっと少なくても起きるかも)、その転送中に各A/D変換終了割り込み要求の1つ(or 複数)をDTCが受け付け損ねてしまったのかな、、、あるいは、DTC保留命令で構成された何かのフラグ待ちループが4.75μs以上継続してしまって、同じことが起きてしまったとか、、、

    それでは最終結果の書き込みを待つようにします。