RX231のAD変換器、DA変換器 の使い方について

明けましておめでとうございます。
はじめまして、ニックダラスと申します。
初めての投稿で、RXマイコンプログラムは初心者です。失礼がありましたら、お許しください。
昨年11月よりRX231を用いて、RX231のAD変換にて音声信号をRXマイコンに取り込んで、そのデジタル信号を加工し、RX231のDA変換して、音声信号を出力を試みていますが、うまくいきません。
事前に、LED点滅プログラム と FFTデモプログラムの動作確認はできましたが、FFTプログラムを改造して、AD変換し、1024個のデータをリングバッファリングして、そのデータをDA変換するようにしたいのですが、サンプリング周波数の変更、DA変換器の追加、DA変換器割り込み設定等ができません。
ほぼ初心者で申し訳ないですが、ご指南、ご指導願えないでしょうか。ルネサスさんのHP掲載のマニュアル等は一通り、読みました。ほかに参考書等があれば、教えてくださいませ。
ターゲットボード: Target Board for RX231
開発環境:      setup_e2_studio_2022-10
          VSCodeUserSetup-x64-1.74.0
FTTデモプログラム: dsp_demo_rx231_tb
          r01an4431jj0160-rx-apl.pdf
GND         GND   J2-12
アナログ入力    AN0001 J2-43
アナログ出力    IO_DA1 J2-50
その他       ファンクションジェネレーター、オシロスコープ
以上です

Parents
  • ニックダラスさん、こんにちは。NoMaYと申します。

    すみません、念の為にちょっと確認させて欲しいのですけれども、RXスマートコンフィグレータというツールが存在することをご存知でしょうか?

  • NoMaY さん、コメントありがとうございます。RXスマートコンフィグレータのツールがあることはマニュアル等をみて、知っていますが、使い方を知らないでおります。

    デモプロジェクトで提供されたソースコード等をエディタで修正して、新たなプロジェクトを作成するのかなと思って色々と資料を読んでおりましたが、停滞しております。

    まずは、スマートコンフィグレータツールを起動させ、どんなGUIが出てくるのかをみてみます。ツールを使ってみて、また、質問をさせてくださいませ。

  • NoMaY さん、ニックダラスと申します。FITモジュールに関する資料を閲覧し、FITの重要性を理解しました。
    再度ご質問させてくださいませ。

    TargetBoard RX231のデモプロジェクトのLED点滅(an-r20an0466jj0100-rxtb-rx231)とFTTによるデジタル解析・判定(dsp_demo_rx231_tb)をTargetBoard RX231で動作させることができ、
    また、e2studioでどのFITモジュールを使い、AD変換ができるかはほぼわかりましたが、DA変換を動作させるデモプロジェクトが探せなく、留まっております。
    FITモジュールの追加ボタンを押し、DAのFITモジュールを追加すべきでしょうか?

    恐縮ですがやりたいことは、下記です。AD変換からDA変換への折り返しです。是非、どのFITを使用するか、また、設定パラメータはどうするのかのコメントをいただきたく、よろしくお願いします。
    (割り込み処理・表面)
    1ー1. 1chのアナログ信号をTarbetBoard RX231のアナログ入力ピンに入れ、それを48kHzサンプリングして、1フレーム1024個データ(21.3ms)を20.83μsecごとに表面入力バッファに入れる、
    1-2. 表面出力バッファ1024個データを20.83μsecごとにDA変換し、RX231のアナログ出力ピンから出力する。

    (フレーム処理・裏面)
    2ー1. 表面データを割り込みで入出力している間に、裏面の入力1024個のデータをDSP演算処理をし、1フレーム1024個(21.3m毎)の裏面の出力リングバッファに入れる。

    バッファは、入力用 1024個 X 2面 、 出力用 1024個 X 2面 となります。

    以上です。

  • ニックダラスさん、こんにちは。NoMaYです。

    デモプログラムは、以下のFITモジュールリストのウェブページからダウンロードすることが出来るD/Aコンバータ(DAC)モジュールに、RX231のものが含まれていました。(すみません、ソースまでは見ていないです。)

    ごめんなさい、それ以上のことは私では分かりませんので、他の人からのリプライを待って頂けないでしょうか。すみません。

    FITモジュールリスト
    www.renesas.com/jp/ja/software-tool/fit-modules-list
     

Reply
  • ニックダラスさん、こんにちは。NoMaYです。

    デモプログラムは、以下のFITモジュールリストのウェブページからダウンロードすることが出来るD/Aコンバータ(DAC)モジュールに、RX231のものが含まれていました。(すみません、ソースまでは見ていないです。)

    ごめんなさい、それ以上のことは私では分かりませんので、他の人からのリプライを待って頂けないでしょうか。すみません。

    FITモジュールリスト
    www.renesas.com/jp/ja/software-tool/fit-modules-list
     

Children
  • NoMaYさん、ニックダラスと申します。

    ご回答ありがとうございます。DAモジュールを入れて、Config設定を色々と試してみます。

  • NoMaYさん、ニックダラスと申します。

    度々の質問恐縮です。色々試していますが、まだ、突破できないです。

    ADモジュールとDAモジュールを使用し、AD変換データをメモリに転送する、メモリにあるデータをDA変換器に転送することを、DMAを2チャンネル使って行うと思うのですが、そうでしょうか。

    また、DAモジュールにあるAD変換器と同時動作にチェックを入れているのですが、意味が分からないのです。

    何か、コメントいただければ、幸いです。

  • ニックダラスさん、こんにちは。NoMaYです。

    > ADモジュールとDAモジュールを使用し、AD変換データをメモリに転送する、メモリにあるデータをDA変換器に転送することを、DMAを2チャンネル使って行うと思うのですが、そうでしょうか。

    初学者さんということですので、まずはDMAを使わないで出来るかどうか試すのが良いと思います。また、まず最初に以下の2ステップを踏んでおくのが良いと思います。なお、すみません、以下の手順を実際に試したわけでは無いです。そして、この後のステップで、DSP演算を組み込んでみて演算処理が間に合わなかったら、DMAを使うことを考えるのが良いと思うのです。

    あと、ここまでの話では、他に何をしているのか、というのは分かりません。I2C通信をする、といったことがあるとI2C通信割り込みの影響でA/D変換割り込みが間に合わなくなることもあるかも知れません。そのような場合にも、DMAを使うことを考えるのが良いと思うのです。

    ただし、DMAを使うことになった場合、RXスマートコンフィグレータの中でも、FITモジュールではなくて、CGコンポーネント、と呼ばれるカテゴリのものを使う方が、たぶん?、素直なコードになると思います。ただし、CGコンポーネントは、どちらかといえば、上級者向け機能であり、マイコンの機能に関して、より深い理解が必要となることがあります。もっとも、FITモジュールでも、何というか頓知的閃きで、あっさり出来てしまうことも有り得ますけれども。

    ステップ1)

    RXファミリ ADCモジュール Firmware Integration Technology
    www.renesas.com/jp/ja/document/scd/adc-module-using-firmware-integration-technology

    5.6 s12ad_demo_rskrx231

    RSKRX231(FITモジュール “r_s12ad_rx”)向けのRX231 A/Dコンバータ(S12AD)のシンプルなデモです。デモではマルチファンクションタイマパルスユニット2(MTU2a)を使用して、ボリュームに接続されているチャネル0で定期的にA/D変換を行います。A/D変換完了時、デモプログラムでは、コールバック関数の割り込みで変換値を読み出し、グローバル変数 “g_data”にA/D変換結果を格納します。プログラム実行後、ボリュームを調整しA/D入力チャネルの電圧を変化させ、エミュレータ上で”g_data”を確認してください。


    上記デモをカスタマイズして、以下のようなことを試すプログラムに変更する。

    (1-1) A/D変換を起動するタイマの周期を48KHzに変更する
    (1-2) A/D変換コールバック関数内で1024個までA/D変換結果を配列に格納する
    (1-2') 1024個溜まったらフラグを立てる
    (1-3) メインルーチン側でフラグが立つのをポーリングする
    (1-3') ポーリングは以下のようなループにして以下のnop()にブレークポイントを設定する
    (1-4) プログラムを実行してブレークしたら配列に所望のデータが格納されているか確認する

        for(;;)
        {
            フラグを読む
            if(フラグが立った)
            {
                nop(); // ← ブレークポイントを設定する
            }
        }

     
    ステップ2)

    RX ファミリ DACモジュール Firmware Integration Technology
    www.renesas.com/jp/ja/document/scd/rx-family-dac-module-using-firmware-integration-technology

    5.2 dac_demo_rskrx231, dac_demo_rskrx231_gcc

    dac_demo_rskrx231, dac_demo_rskrx231_gccは、RSKRX231、RX231 D/Aコンバータ(R12DAA)対応のDAC FITモジュール(r_dac_rx)のシンプルなデモプロジェクトです。デモではr_dac_rx APIを使用して、DACの起動、設定、書き込みを行います。LOW、MEDIUM、またはHIGHレベルの値がDACチャネル1に書き込まれると、連続的なループに1秒間遷移します。LOWレベルの値が書き込まれるとLED0(緑)が点灯し、MEDIUMレベルの値が書き込まれるとLED1(オレンジ)が、HIGHレベルの値が書き込まれるとLED2(赤)が点灯します。RSKRX231ボード使用時のDAC出力チャネル信号のアクセスおよび設定、また基準電圧に関する詳細については、以下の「DACチャネル0、チャネル1出力信号測定時の注意事項」をご覧ください。


    ステップ1のデモと上記デモを合体させて、以下のようなことを試すプログラムに変更する。

    (2-1) A/D変換コールバック関数内で変換結果をD/A変換APIを呼び出すことでD/A変換してマイコンから出力する
    (2-2) A/D変換入力とD/A変換出力をオシロスコープで比較してチェックする


    > また、DAモジュールにあるAD変換器と同時動作にチェックを入れているのですが、意味が分からないのです。

    RX231マイコンには(他のRXマイコンも?)、A/D変換とD/A変換のタイミングが干渉すると、A/D変換精度が劣化する特性があるようです。そして、その劣化を緩和する機能がマイコンにあるようです。

    RX230グループ、RX231グループ ユーザーズマニュアル ハードウェア編
    R01UH0496JJ0120 Rev.1.20 Pages 1983 2018.09.28
    www.renesas.com/jp/ja/document/mah/rx230-group-rx231-group-users-manual-hardware-rev120#page=1758

    44.3.1 D/A 変換とA/D 変換の干渉対策

    D/A変換が始まると12ビットD/Aコンバータにはラッシュカレントが発生します。12ビットD/Aコンバータと12ビットA/Dコンバータのアナログ電源が共通のため、発生したラッシュカレントが12ビットA/Dコンバータの変換に干渉することがあります。
    DAADSCR.DAADSTビットを“1”にしている場合、12ビットA/DコンバータがA/D変換中にDADRmレジスタ(m=0,1)にデータを書き換えても、すぐに変換されず、12ビットA/DコンバータのA/D変換終了タイミングに同期して変換を開始します。DADRmレジスタへの書き込みからD/A変換回路の入力に反映するまで最大A/D変換1回分待たされます。その間DADRmレジスタ値とアナログ出力値は一致しません。
    本機能が有効なときに、DADRmレジスタの値がD/A変換されたかどうかをソフトウェアで確認する手段はありません。
    DAADSCR.DAADSTビットを“1”にしている場合であっても、12ビットA/DコンバータがADCSR.ADSTビットを“0”にして停止中であればDADRmレジスタにデータを書き換えると、1PCLKB後にD/A変換を開始します。
    図44.3に12ビットD/Aコンバータを12ビットA/Dコンバータに同期変換させる場合のチャネル0のD/A変換の動作例を示します。


  • NoMaYさん、ニックダラスと申します。

    初心者です。分かりやすいご説明をありがとうございます。感謝!!!トライしてみます。

  • ニックダラスさん、こんにちは。NoMaYです。

    あと、注意点として、DSP演算を組み込む段取りになりましたら、以下の赤文字のコンパイルオプションを指定しておくことを忘れないようにしておいて下さい。

    RXファミリ FFTによるデジタル信号解析・判定デモンストレーション
    www.renesas.com/jp/ja/document/apn/rx-family-demonstration-digital-signal-analysis-and-judgement-using-fft#page=11

    Cコンパイラ

    コンパイルオプション
    ・ -lang = c99
    ・ -fpu
    -save_acc


  • ニックダラスさん、こんにちは。NoMaYです。

    私はA/D変換もD/A変換も細かいことは分からないのですけれども、たまたま電気的特性を見ていて気になったことがあります。D/A変換の変換時間のmaxが30μsecとなっていて、48KHzの周期の20.83μsecより長くなっていました。このことは大丈夫なのでしょうか?

    RX230グループ、RX231グループ ユーザーズマニュアル ハードウェア編
    R01UH0496JJ0120 Rev.1.20 Pages 1983 2018.09.28
    www.renesas.com/jp/ja/document/mah/rx230-group-rx231-group-users-manual-hardware-rev120#page=1946

    50.6 D/A 変換特性

    表50.52 D/A変換特性(1)

    表50.53 D/A変換特性(2)

    表50.54 D/A変換特性(3)


  • NoMaYさん、いつもお世話になります。ニックダラスです。

    注意点、ありがとうございます。

  • NoMaYさん、いつもお世話になります。ニックダラスです。

    現状では、48kHzサンプリングはD/A変換の性能からNGですね。ほんと、ご指摘ありがとうございます。

    サンプリング周波数は、8kHz~16kHzで考え直します。先ずは、AD,DAの折り返しの動作確認することが自分には最優先です。

  • NoMaYさん、いつもお世話になります。色々とやってました。ニックダラスです。

    長々とすみません。

    DMAを使うことになりました。また、FITモジュールを使います。理由は、AD変換器からメモリへの転送プログラムが提供されているからです。

    AD変換器からメモリへ転送プログラムが提供されていることから、メモリからDA変換器への転送もDMAを使うことにし、色々と取り組んでいます。
    なお、AD部分がコード生成(CG)ではなく、FITモジュールで設計されているので、DA部分もFITモジュールで下記のように設計し、色々と設定をトライしていますが、動作しない状況です。

    ★デモプログラムで提供されているmain.cに書かれている内容
    static void init_dmac_s12ad(void)
    {
    dmaca_stat_t status;
    /* ---- Set up the DMAC module ---- */
    gs_dmac_cfg_s12ad.transfer_mode = DMACA_TRANSFER_MODE_NORMAL;
    gs_dmac_cfg_s12ad.repeat_block_side = DMACA_REPEAT_BLOCK_DISABLE;
    gs_dmac_cfg_s12ad.data_size = DMACA_DATA_SIZE_WORD; /* S12AD's ADDR register width */
    gs_dmac_cfg_s12ad.act_source = IR_S12AD_S12ADI0; /* S12AD as activation source */
    gs_dmac_cfg_s12ad.request_source = DMACA_TRANSFER_REQUEST_PERIPHERAL;
    gs_dmac_cfg_s12ad.dtie_request = DMACA_TRANSFER_END_INTERRUPT_ENABLE;
    gs_dmac_cfg_s12ad.esie_request = DMACA_TRANSFER_ESCAPE_END_INTERRUPT_DISABLE;
    gs_dmac_cfg_s12ad.rptie_request = DMACA_REPEAT_SIZE_END_INTERRUPT_DISABLE;
    gs_dmac_cfg_s12ad.sarie_request = DMACA_SRC_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE;
    gs_dmac_cfg_s12ad.darie_request = DMACA_DES_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE;
    gs_dmac_cfg_s12ad.src_addr_mode = DMACA_SRC_ADDR_FIXED;
    gs_dmac_cfg_s12ad.des_addr_mode = DMACA_DES_ADDR_INCR;
    gs_dmac_cfg_s12ad.src_addr_repeat_area = DMACA_SRC_ADDR_EXT_REP_AREA_NONE;
    gs_dmac_cfg_s12ad.des_addr_repeat_area = DMACA_DES_ADDR_EXT_REP_AREA_NONE;
    gs_dmac_cfg_s12ad.interrupt_sel = DMACA_CLEAR_INTERRUPT_FLAG_BEGINNING_TRANSFER;
    gs_dmac_cfg_s12ad.p_src_addr = (void *)&S12AD.ADDR1; /* ADDR1 - A/D Data Registers 1 */
    gs_dmac_cfg_s12ad.p_des_addr = gs_buf_info_s12ad[CURRENT].p_buf_start;
    gs_dmac_cfg_s12ad.transfer_count = gs_buf_info_s12ad[CURRENT].samples;

    IEN(S12AD,S12ADI0) = INT_DISABLE; /* Once S12ADI0 interrupt is disabled here,
    R_S12AD_Start enables the interrupt again. */


    ★下記は、デモプログラムを参考に当方でDA変換器からメモリへのDMA設定を書いたものです。
    static void init_dmac_da(void)
    {
    dmaca_stat_t status;
    /* ---- Set up the DMAC module ---- */
    gs_dmac_cfg_da.transfer_mode = DMACA_TRANSFER_MODE_NORMAL;
    gs_dmac_cfg_da.repeat_block_side = DMACA_REPEAT_BLOCK_DISABLE;
    gs_dmac_cfg_da.data_size = DMACA_DATA_SIZE_WORD; /* S12AD's ADDR register width */
    gs_dmac_cfg_da.act_source = IR_S12AD_S12ADI0; /* ???????????????? S12AD as activation source */
    gs_dmac_cfg_da.request_source = DMACA_TRANSFER_REQUEST_PERIPHERAL;
    gs_dmac_cfg_da.dtie_request = DMACA_TRANSFER_END_INTERRUPT_ENABLE;
    gs_dmac_cfg_da.esie_request = DMACA_TRANSFER_ESCAPE_END_INTERRUPT_DISABLE;
    gs_dmac_cfg_da.rptie_request = DMACA_REPEAT_SIZE_END_INTERRUPT_DISABLE;
    gs_dmac_cfg_da.sarie_request = DMACA_SRC_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE;
    gs_dmac_cfg_da.darie_request = DMACA_DES_ADDR_EXT_REP_AREA_OVER_INTERRUPT_DISABLE;
    gs_dmac_cfg_da.src_addr_mode = DMACA_DES_ADDR_INCR;
    gs_dmac_cfg_da.des_addr_mode = DMACA_SRC_ADDR_FIXED;
    gs_dmac_cfg_da.src_addr_repeat_area = DMACA_SRC_ADDR_EXT_REP_AREA_NONE;
    gs_dmac_cfg_da.des_addr_repeat_area = DMACA_DES_ADDR_EXT_REP_AREA_NONE;
    gs_dmac_cfg_da.interrupt_sel = DMACA_CLEAR_INTERRUPT_FLAG_BEGINNING_TRANSFER;
    gs_dmac_cfg_da.p_src_addr = gs_buf_info_da[CURRENT].p_buf_start;
    gs_dmac_cfg_da.p_des_addr = (void *)&DA.DADR1; /* DADR1 - D/A Data Registers 1 */
    gs_dmac_cfg_da.transfer_count = gs_buf_info_s12ad[CURRENT].samples;

    IEN(S12AD,S12ADI0) = INT_DISABLE; /* ?????????? Once S12ADI0 interrupt is disabled here,
    R_S12AD_Start enables the interrupt again. */

    DSP FTTのデモプログラムのAD部分のDMA設定を参考に、DA部分のDMA設定部分を設計してみましたが、RX231 TBの100pinからアナログの出力がありません。
    お忙しいところ、恐縮ですが、アドバイスを頂けないでしょうか。

  • ニックダラスさん、こんにちは。NoMaYです。

    まずは、以下の設定でコードを書いてみてはどうでしょうか。(サンプルプログラムも存在すると信じていますけれども。)

    (1) ソフトウェアトリガ
    (2) データ転送数は1
    (3) 転送元も転送先もメモリ

    動いたら

    (4) 転送先をD/A変換レジスタへ変更

    動いたら

    (5) DMA起動要因を割り込みへ変更

    動いたら

    (6) 転送数を2以上へ変更

    なお、(4)(5)(6)の順番は、動作しない状況/デバッグ状況に応じて、弾力的に変えて試行錯誤してみる。

    また、FITモジュール関連の構造体をスタック上に配置することは避ける。

    [関連リンク]

    FIT moduleを使っていてtroubleに遭遇してしまったところです。
    community-ja.renesas.com/cafe_rene/forums-groups/tools/f/forum21/6382/fit-module-trouble