1chのAD計測を連続で行い、AD結果を内蔵メモリに順次保存する方法について

SynergyS7G2にて1chのAD計測を連続で行い、AD結果を内蔵メモリに順次保存する
プログラムを検討しておりますが、SynergySSP設定、APIなどの操作などが分かりません。
下記、ご教授お願いいたします。
ADCの速度については、最速の2.5Mbpsを検討中。

HALドライバ設定内容
 呼び出しから下記設置済みです。
 設定不足があればご教授願います。

 g_adc0 ADC Driver 設定
  プロパティ   値
     Mode           SiggleScan
  Channel0       Use in Nomal/GroupA
    その他設定変更なし


hal_entry.cの記述
------------------
    g_adc0.p_api->open(g_adc0.p_ctrl, g_adc0.p_cfg);

    for(i=0 ; i<1000 ; i++){
    g_adc0.p_api->scanStart(g_adc0.p_ctrl);
    g_adc0.p_api->read(g_adc0.p_ctrl, ADC_REG_CHANNEL_0, &adc_data);
    adc_datamem[i] = adc_data;
    }
------------------
  
現状の不明点
・ADCのスキャン速度設定方法が不明
・ADC結果をメモリに1000データコピーしたいが、速度面からもDMAC,DTC,ELC を
 使う必要がある。最適な方式でコピーの方法を知りたい。
・1000回計測後に完了を知らせる方法を知りたい。

よろしくお願いいたします。

  • はじめまして、はしさん。Hosです。

    はしさんのやりたいことは、ADC Periodic Frameworkを使用することで実現ができるのではないかと思います。
    ただし、そこまで高速にADCをかけたことがないので、どこまで高速化できるかはいまいちわかりません。すいません。
    (2.5MHzだとADCの変換時間が確保できないのでは?という懸念です)

    私が使用している環境は、ちょっと古く、
     e2studio 6.2.1
     SSP 1.5.0 rc1
    となります。

    設定はSynergy Configurationから行っていきます。
    まずはThreadsタブでHAL/CommonではADC Periodic Frameworkは使用できませんので、New Threadから新しいスレッドを作成します。
    New Stack>Framework>Analog>ADC Periodic Frameworkを選択します。

    主にコンフィグレーションするのは以下の3つのStackになります。
    ・ADC Periodic Framework:バッファサイズ、コールバックの設定
    ・ADC Driver:ADCの設定
    ・Timer Driver:周期設定
    ・Transfer Driver:ほぼ固定値

    各Stackの詳しい設定はこちらに記載があります。
    www.renesas.com/.../r11an0115eu0102-synergy-adc-periodic-fw-mod-guide.pdf

    はしさんの不明点のスキャン速度の設定方法が、スキャンの周期であるのでしたらTimer Driverで設定します。
    また、1000回計測後に完了を知らせる方法ですが、ADC Periodic Frameworkのコールバックを使用します。
    ただし、このコールバックの構造体は以下のような定義になっており規定回数でコールされるというよりも、
    今回のコールバックではどこまでバッファが更新されたかを知らせてくれるものでした。
    コールバックされる条件についてより詳細に知りたい場合は、SSPのソースコードを探っていくか、Renesasに問い合わせるかとなるかと思います。
    (恐らく、一定回数ADCからデータ取得でコールバックされるとは思いますので、上手く設定できれば1000回に合わせられそう)

    /** ADC callback arguments definitions  */
    typedef struct st_sf_adc_periodic_callback_args
    {
        sf_adc_periodic_event_t event;              ///< Periodic ADC callback event
        uint32_t                buffer_index;       ///< Index to the buffer where the new data is stored.
        void const            * p_context;          ///< Placeholder for user data
        adc_data_size_t       * p_data_buffer;      ///< Pointer to the buffer that will store the samples
        uint32_t                num_new_samples;    ///< Number of new samples in the data buffer
    } sf_adc_periodic_callback_args_t;


    また、これらの設定とは別途PinsタブでADCを使用する設定が必要となります。

    > ・ADC結果をメモリに1000データコピーしたいが、速度面からもDMAC,DTC,ELC を
    >  使う必要がある。最適な方式でコピーの方法を知りたい。
    こちらについては、DTC等を使用するのであれば別途Transfer Driverを設定することになるかと思いますが、
    最適な方式はケースバイケースと思いますので回答は控えさせてください。


  • ご回答いただきありがとうございます。
    こちらのレベルが低く非常に申し訳ありませんがご回答内容についてご教授お願いします。

    こちらは、以前 port入力→(結果を)port出力する方法を問い合わせさせていただき、
    やっと分かった程度の理解力しかございません。
    ---------
    g_ioport.p_api->pinRead(IOPORT_PORT_00_PIN_05,&level_P005);
    g_ioport.p_api->pinWrite(IOPORT_PORT_06_PIN_00, level_P005);
    ---------
    Synergyのセミナーには複数参加させていただきましたが、
    今回ADのようなSynergy Configuration設定方法、
    ソース掃き出し後のコーディングについては、非常に敷居が高く思います。
    一度理解ができればあとは簡単かと思いますが、
    今回ご回答にあるアプリケーションノートを読んでも到底理解できないため、
    1つずつご教授お願いいたします。


    1.今回HALドライバを使わず New Theread:New Stack>Framework>Analog>ADC Periodic Framework
     を紹介していただいております。HALドライバでADC設定があるにもかかわらずこちらを指定されている
     理由は何になりますでしょうか?
     この設定は、RTOSを使うということでしょうか、OSレスでしょうか?


    2.ADC Periodic Frameworkの設定を詳しく教えてください。

      ・ADC Periodic Framework:バッファサイズはAD1回スキャン分、
                           仕様提示した1000回スキャン分?
                   :コールバックの設定はどういったものでしょうか?
      ・ADC Driver:ADCの設定 :”Channel0 Use in Nomal/GroupA”のみ設定します。
      ・Timer Driver:周期設定 : gptタイマ設定 PeriodValue がADスキャン周期でしょうか?
      ・Transfer Driver:ほぼ固定値: 設定不要?
      

    3.1,2の設定を行い、ソース掃き出し後、AD処理開始の命令はどのようにしますか?
      アプリケーションノート
      g_sf_adc_periodic.p_api->open(g_sf_adc_periodic.p_ctrl,g_sf_adc_periodic.p_cfg);
      g_sf_adc_periodic.p_api->start(g_sf_adc_periodic.p_ctrl);
      とopen、startがありますが、そのままで動作しますか?

    4.AD結果は取得方法はどうするのでしょうか?


    いろいろ聞いてすみません。
    やりたいことは AD(1ch)取得を1000回繰り返し、内蔵メモリに順次保存するのみの処理です。
    簡単な処理に思えますが、SSPの設定、SSP掃き出し後の方など、アプリケーションノートを読んでも
    到底理解ができません。 ご回答よろしくお願いいたします。
  • 回答が遅くなり申し訳ありません。Hosです。

    > 1.今回HALドライバを使わず New Theread:New Stack>Framework>Analog>ADC Periodic Framework
    > を紹介していただいております。HALドライバでADC設定があるにもかかわらずこちらを指定されている
    > 理由は何になりますでしょうか?
    > この設定は、RTOSを使うということでしょうか、OSレスでしょうか?
    SSPにはTHREADXというOSがそもそも乗っており、OSレスではありません。
    New Threadを使用しているのは、こちらの環境ではADC Periodic Frameworkを使用する際にHAL/Commonでは選択できなかったためです。

    > 2.ADC Periodic Frameworkの設定を詳しく教えてください。
    >
    >   ・ADC Periodic Framework:バッファサイズはAD1回スキャン分、
    >                        仕様提示した1000回スキャン分?
    >                :コールバックの設定はどういったものでしょうか?
    >   ・ADC Driver:ADCの設定 :”Channel0 Use in Nomal/GroupA”のみ設定します。
    >   ・Timer Driver:周期設定 : gptタイマ設定 PeriodValue がADスキャン周期でしょうか?
    >   ・Transfer Driver:ほぼ固定値: 設定不要?
    コールバックは、ADC Periodic FrameworkのCallback欄で設定します。
    該当する名前の関数が、データ取得完了時にコールバックされる仕組みとなります。
    デフォルトの関数名はg_adc_framework_user_callbackです。

    コールバック関数の宣言は、SSP側で自動生成するため実際に関数を作成して中身をつくることになります。
    関数の定義は以下なります。
    void g_adc_framework_user_callback(sf_adc_periodic_callback_args_t * p_args)

    > 3.1,2の設定を行い、ソース掃き出し後、AD処理開始の命令はどのようにしますか?
    >   アプリケーションノート
    >   g_sf_adc_periodic.p_api->open(g_sf_adc_periodic.p_ctrl,g_sf_adc_periodic.p_cfg);
    >   g_sf_adc_periodic.p_api->start(g_sf_adc_periodic.p_ctrl);
    >   とopen、startがありますが、そのままで動作しますか?
    ADC Periodic Frameworkを経由して操作します。
    デフォルトだとg_sf_adc_periodic0です。

    プロパティからAuto InitializationをEnableにしているとシステム側で自動で初期化(※)してくれます。
    ですのでADCでデータを取得したいタイミングからg_sf_adc_periodic0.p_api->startすればOKです。
    そのあとはコールバックで結果が通知されてきます。

    ※g_sf_adc_periodic0.p_api->open

    > 4.AD結果は取得方法はどうするのでしょうか?
    コールバック関数の引数からデータを取得します。
    格納しているデータバッファ(SSP側で用意したバッファ)→p_args->p_data_buffer
    コールバックの構造体に新規データがいくつあるのか?→p_args->num_new_samples
    バッファのどこから新規データがはじまるのか?→p_args->buffer_index
    といった情報がありますので、そこからデータを取得します。