CY8CKIT-059 IIRフィルタによる正弦波生成

投稿日 2015/07/12

PSoCのDFBコンポーネントでIIRフィルタを構成し正弦波を生成します。

CY8CKIT-059_IIR_01.jpg

CY8CKIT-059 Prototype Kitで正弦波を生成

プログラムはトランジスタ技術2013年11月号に掲載された

PSoC5LP_SINGENを使用

PSoC5ボード用だが、少しの変更でCY8CKIT-059でも動く

 

これはトランジスタ技術 2013年11号で取り上げられたCQ出版社のPSoC 5ボードによる「IIRフィルタで正弦波を発生させる」のトレースですが、ボードにCypressのプロトタイプ・キット CY8CKIT-059を使用した点が違います。

 

CY8CKIT-059は1500円と廉価なPSoC 5LPのプロトタイプ。ボードです。搭載されているPSoCはCY8C5888LTI-LP097です。

 

CQ出版のトランジスタ技術ダウンロード・サービス(2013年11号)でPSoC5LP_SINGENをダウンロードしておき、PSoC Creatorを起動してPSoC5LP_SINGENプロジェクトを開いておきます。

シールバッテリ簡易充電回路

CY8CKIT-059_IIR_02.jpg

DFBでIIRフィルタを構成し、

1MHzでツツいて(サンプリングして)演算結果をDAコンバータに渡す

USB-UARTでPCから発振周波数(100Hz - 50KHz)を

指定できるようになっている

LEDは1秒毎に点滅する

CY8CKIT-059ボードで実行する場合でも

コンポーネントとプログラムの変更は不要

(デバイスとクロック設定に変更が必要)

 

CY8CKIT-059で動かす場合、デバイスとクロック設定を変更する必要があります。

 

CQ出版のPSoC5ボードのデバイスは、CY8C5868AXI-LP035ですが、CY8CKIT-059ボードのデバイスはCY8C5888LTI-LP097です。Projectを右クリックし、Device Selectorで変更します。

 

またPSoC5ボードには24MHzのXTALを搭載していますが、CY8CKIT-059ボードには、XTALは搭載されていません。廉価なボードなので省略されています。このため、システム・クロックのIMO(Internal Main Oscillator)の設定をOSC(内部発信器)にする必要があります。

CY8CKIT-059_IIR_03.jpg

CY8CKIT-059ボードにはXTALが搭載されていないので

IMOはOSCに変更する必要がある

 

波形生成の心臓部IIRフィルタはDFB(Digital Filter Block)内のアセンブラのコードで実現されています。DFB自体は積和高速演算器ですが、このアセンブラのプログラムを書きかえればさまざまなフィルタリング処理が実現できるようです。

 

PSoC5LP_SINGEN(RTOSベースで作られている)は、USB-UARTでCOMポートとしてPCとつなぎ、PCのTera Term等のターミナル・エミュレータで発振周波数(100Hz から50KHz)を指定できるようになっています。

 

当局ではwindows7でうまくCOMポートが認識してくれないので、今回の実験ではUSB-UARTを殺し(実際にはタスクTask_USBUARTが生成されないようにmain.cで以下のようにコメントアウトしました。)、指定周波数を直接波形生成タスクに書き込むことにしました。周波数を変更するごとにコンパイルし直しですが、数種類の周波数を試すだけですのでまぁいいでしょう。

 

//xTaskCreate(Task_USBUART,(signed portCHAR *)"USBUART", TASK_STACK_USBUART, NULL, TASK_PRIORITY_USBUART, NULL);

 

タスクTask_USBUARTが生成されないとタスク間のデータ授受のキューに指定周波数データが入らないのでタスクTask_SINGENは永久に待ち状態になります。

 

そこでタスクTask_SINGEN内のキューから指定周波数(n)を取り出すための待ち部分(if文)を以下のようにコメントアウトし、nを強制的に入れてやります。

 

nが100の場合10KHzを発振します。これはサンプリング周波数1MHzを発振周波数で割った値(整数)です。

 

1000000 / 10000 = 100

 

50KHz : n = 20

10KHz : n = 100

1KHz : n = 1000

200Hz : n = 5000

 

   Task_SINGENの中

   while(1)
    {
        //
        // Found data in Queue?
        int32 n;
        //if (xQueueReceive(xQueue_PARAM, &n, 0))  //<- コメント・アウト
        //{
            uint32 i;
            double fn, fa1_half, fa2_half, fb;
            int32  ia1_half, ia2_half, ib;
            int32  ramA[16], ramB[16];
            uint32 addr[16];
            //
            n = 100;  //< - 追加 100にすると10KHzを発振
            fn = (double)n;
            fa1_half = cos(2 * M_PI / fn);
            fa2_half = -0.5;
            fb       = sin(2 * M_PI / fn);
            ia1_half = floor(fa1_half * pow(2, 23) + 0.5);
            ia2_half = floor(fa2_half * pow(2, 23) + 0.5);
            ib       = floor(fb * pow(2, 23) + 0.5);

  

    以下省略

 

            //}

CY8CKIT-059_IIR_04.jpg

50KHz

CY8CKIT-059_IIR_05.jpg

10KHz

CY8CKIT-059_IIR_06.jpg

1KHz

CY8CKIT-059_IIR_07.jpg

200Hz

 

 

50KHzでは階段状がすこし目立ちます。

 

CY8CKIT-059ボードは先に書いたようにメインオシレータにXTALが選べません(搭載していない)ので内部発振器を24MHzで使用する必要があります。このためPSoC5ボードよりは周波数精度が悪いようです。

 

 

 

 

 

 

(JF1VRR)

コメント(2)

  • こんばんわ。先日、CY8CKIT-059を購入して全く同じことをしようとしてこの記事を拝見しました。クロックの切換を忘れていました・・・。ありがとうございます。なお、USBですが、電圧がCQ出版のものと違うので、以下のように変えて認識してくれました。
    //USBUART_1_Start(0, USBUART_1_3V_OPERATION);
    USBUART_1_Start(0, USBUART_1_DWR_VDDD_OPERATION);

    lam*d*_55* ]

    2016/5/31(火) 午前 0:08

  • > lam*d*_55*さん 情報ありがとうございました。助かります。(JF1VRR) 2016/6/7(火) 午前 10:15