PSoC CY8C29466-24PXIの観察

ver1.001b  2023-02-06
更新履歴
2023-2-6 ver 1.000 新規作成
2023-2-6 ver 1.001 DDSもどき

注意 (2023-2-26)

CY8C29466-24PXI,CY8C29666-24LFXI,PSoC4200  CY8CKIT-049は、生産中止品です。ところが、在庫があるという販売店があります。

【詐 欺通販サイトにご注意ください!】海外電子部品ディストリビュータの事例

これを読んで、十分ご注意ください。
CY8C29466-24PXIは、はっきりした状況がわかりません。ほ ぼ在庫はないでしょう?
CY8C29666-24LFXIは、秋月電子だけが在庫があるようで す。
PSoC4200 CY8CKIT-049は、どこにも在庫がないようで す。

DDSもどき(2023-2-6)

PSoC CY8C29466-24PXIでDDSもどきをやってみましょう。このPSoCはRAMが2KBで256バイトのページメモリなので、RAMにsin テーブルをもてません。

図1−1 main.c

そこで定数テーブルとして、プログラムにsinテーブルを埋め込みます。また、DACは、MAX254なので、最大値に注意が必要です。なお、高調波を作 るには、Freq1を2倍なら2に、5倍なら5に書き換えます。テーブルが256なので、最大128ですが、その時は+,-,+,-となるので、フィル ターを通さないと正弦波になりません。三角波は、そういうこともできないので、数倍までかな?

sin_table.hを作製するプログラムは以下の通り。
/*************************?/
#include <math.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

FILE *fp;

unsigned char sine_table[256];

int main (void)
{
    int i;
    for(i=0;i<256;i++){
        sine_table[i]=128.0+126.0*sin((double)i/256.0*2.0*3.1415926);
    }

    /* 保存はカレントディレクトリーのsin_table.hというファイル名で上書きする */
  if ((fp = fopen ("sin_table.h", "w")) == NULL)
    {
      printf ("cannot open sin_table.h\n");
      exit (1);
    }
  printf ("now saving  file!\n");
  i=0;
  fprintf (fp, "const unsigned char sin_table[256]={%d, // i=%d\n",sine_table[i],i);
  for(i=1;i<256;i++){
  fprintf (fp, "%d, // i=%d\n",sine_table[i],i);
  }
  fprintf (fp, "};\n");
  fclose (fp);
  return (EXIT_SUCCESS);

}

また、cos_table.hを作製するプログラムは以下の通り。
/****************/
#include <math.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

FILE *fp;

unsigned char cos_table[256];

int main (void)
{
    int i;
    for(i=0;i<256;i++){
        cos_table[i]=128.0+126.0*cos((double)i/256.0*2.0*3.1415926);
    }

    /* 保存はカレントディレクトリーのcos_table.hというファイル名で上書きする */
  if ((fp = fopen ("cos_table.h", "w")) == NULL)
    {
      printf ("cannot open cos_table.h\n");
      exit (1);
    }
  printf ("now saving  file!\n");
  i=0;
  fprintf (fp, "const unsigned char cos_table[256]={%d, // i=%d\n",cos_table[i],i);
  for(i=1;i<256;i++){
  fprintf (fp, "%d, // i=%d\n",cos_table[i],i);
  }
  fprintf (fp, "};\n");
  fclose (fp);
  return (EXIT_SUCCESS);

}
また、triangle_table.hを作製するプログラムは以下の通り。
/******************/
#include <math.h>
#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

FILE *fp;

unsigned char triangle_table[256];

int main (void)
{
    int i;
    for(i=0;i<127;i++){
        triangle_table[i]=i+i;
    }
        triangle_table[127]=254;
    for(i=0;i<127;i++){
        triangle_table[i+128]=254-i-i;
    }
        triangle_table[256]=0;

    /* 保存はカレントディレクトリーのtriangle_table.hというファイル名で上書きする */
  if ((fp = fopen ("triangle_table.h", "w")) == NULL)
    {
      printf ("cannot open triangle_table.h\n");
      exit (1);
    }
  printf ("now saving  file!\n");
  i=0;
  fprintf (fp, "const unsigned char triangle_table[256]={%d, // i=%d\n",triangle_table[i],i);
  for(i=1;i<256;i++){
  fprintf (fp, "%d, // i=%d\n",triangle_table[i],i);
  }
  fprintf (fp, "};\n");
  fclose (fp);
  return (EXIT_SUCCESS);

}

これらを実行するには、wslが いい と思います。私は、ubuntu20.04をインストールしてます。
Windowsの中で、シームレスで、Linuxのgccが使えるので便利です。
なお、#include <math.h>をしているので、gccにリンカーオプションとして -lm が必要になります。

さて、


図1−2 三角波とsin波 周期は7.5327mSなので、132.75Hz

24MHzの8bitマイコンとしては、早いかな?



図1−3 sin波とcos波



図1−4 基本波と3倍波

つづく