製作モジュール一覧

ラベル PSoC 5LP の投稿を表示しています。 すべての投稿を表示
ラベル PSoC 5LP の投稿を表示しています。 すべての投稿を表示

2017年7月24日月曜日

PSoC 5LP内蔵DACとMCP4922の処理能力を見てみる。


ブレッドボード配線図

デバッグ情報表示用にキャラクタ液晶を接続している。P2[6:0]。

80MHz駆動するために、20MHzの水晶と22pFのCを接続。水晶をつなぐPinは固定で、P15[0]、P15[1]。

MCP4922はSPIの信号線を割り当てた。SCK P12[0]、MOSI P12[2]、CS P12[3]。

処理タイミングを計測するPinを割り当てた。P0[0]。

内蔵DACの出力はP3[0]。

内蔵DAC(VDAC8)


TopDesign

PSoC 5LPの内蔵DACはVDAC8というコンポーネントを使う。8bit精度。VDAC8の出力は弱いのでOPAMP(Follower)で増強する。

<main.c>

/* ========================================
 *
 * Copyright YOUR COMPANY, THE YEAR
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF your company.
 *
 * ========================================
*/
#include "project.h"
#include <stdio.h>
#include <math.h>

#define TITLE_STR1  ("VDAC Test")
#define TITLE_STR2  ("20170723")

#define PI        (3.141592653589793238462)
#define AMPLITUDE (1.0)    // x * 3.3V
#define PHASE     (PI * 1) // 2*pi is one period
#define RANGE     (0x7FFF)
#define OFFSET    (0x7FFF)

// Configuration for wave output
#define BUFFER_SIZE (360)
uint16_t buffer_sine[BUFFER_SIZE];

char strBuffer[80];
    
// Create the wave buffer
void calculate_sinewave(void){
    for (int i = 0; i < BUFFER_SIZE; i++) {
        double rads = (PI * i)/180.0; // Convert degree in radian
        buffer_sine[i] = (uint16_t)(AMPLITUDE * (RANGE * (sin(rads + PHASE))) + OFFSET);
    }
}

int main(void)
{
    uint8_t cnt = 0;
    
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    LCD_Char_Start();
    UART_Start();
    VDAC8_1_Start();
    Opamp_1_Start();
    
    LCD_Char_PrintString(TITLE_STR1);
    LCD_Char_Position(1, 0);
    LCD_Char_PrintString(TITLE_STR2);
    
    sprintf(strBuffer, "\r\n%s %s\r\n", TITLE_STR1, TITLE_STR2);
    UART_PutString(strBuffer);

    calculate_sinewave();
    
    for(;;)
    {
        /* Place your application code here. */
        for (int i = 0; i < BUFFER_SIZE; i++) {
            Pin_Check1_Write(1);
            VDAC8_1_SetValue(buffer_sine[i] >> 8);
            Pin_Check1_Write(0);
        }
        
        cnt++;
    }
}

/* [] END OF FILE */

プログラムはNucleo F303で試したものとほぼおなじ処理で、事前にサイン波テーブルを生成しておいて、値を連続してDACに出力している。

DACに出力する前後でPin_Check1をH/Lさせているので、Highの時間を見れば処理に要した時間がわかる。

浮動小数点演算を行う場合、math libraryをリンクする必要がある。

メニューのProjectから[Build Setting...]を選択。ダイアログでコマンドラインオプションに「-lm」を設定する。


MCP4922


TopDesign

<main.c>

/* ========================================
 *
 * Copyright YOUR COMPANY, THE YEAR
 * All Rights Reserved
 * UNPUBLISHED, LICENSED SOFTWARE.
 *
 * CONFIDENTIAL AND PROPRIETARY INFORMATION
 * WHICH IS THE PROPERTY OF your company.
 *
 * ========================================
*/
#include "project.h"
#include <stdio.h>
#include <math.h>

#define TITLE_STR1  ("MCP4922 Test")
#define TITLE_STR2  ("20170723")

#define PI        (3.141592653589793238462)
#define AMPLITUDE (1.0)    // x * 3.3V
#define PHASE     (PI * 1) // 2*pi is one period
#define RANGE     (0x7FFF)
#define OFFSET    (0x7FFF)

// Configuration for wave output
#define BUFFER_SIZE (360)
uint16_t buffer_sine[BUFFER_SIZE];

char strBuffer[80];
   
// Create the wave buffer
void calculate_sinewave(void){
    for (int i = 0; i < BUFFER_SIZE; i++) {
        double rads = (PI * i)/180.0; // Convert degree in radian
        buffer_sine[i] = (uint16_t)(AMPLITUDE * (RANGE * (sin(rads + PHASE))) + OFFSET);
    }
}

// Write to MCP4922
// v: 0..4096
void MCP4922_write_u16(uint16 v)
{
    SPIM_WriteTxData((v >> 8) | 0x30);
    SPIM_WriteTxData(v & 0xff);
    while (! (SPIM_ReadTxStatus() & SPIM_STS_SPI_DONE))
        ;
}

int main(void)
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    LCD_Start();
    SPIM_Start();
    UART_Start();
   
    LCD_Position(0u,0u);
    LCD_PrintString(TITLE_STR1);
    LCD_Position(1u,0u);
    LCD_PrintString(TITLE_STR2);
   
    sprintf(strBuffer, "%s %s \r\n", TITLE_STR1, TITLE_STR2);
    UART_PutString(strBuffer);
   
    CyDelay(1000u);
    //LCD_ClearDisplay();
   
    calculate_sinewave();
   
    /*
    for (int i = 0; i < BUFFER_SIZE; i++) {
        sprintf(strBuffer, "%u\r\n", buffer_sine[i]);
        UART_PutString(strBuffer);
    }  
    UART_PutString("Dump end\r\n");
    */

    for(;;)
    {
        for (int i = 0; i < BUFFER_SIZE; i++) {
            Pin_Check1_Write(1);
            MCP4922_write_u16(buffer_sine[i] >> 4);
            Pin_Check1_Write(0);
        }
        //CyDelay(1);
    }
}

/* [] END OF FILE */

処理時間の比較


VDAC8

ch2:Pin_Check1の出力

周波数は1.702MHzで1ループは約587.5ns。
DAC出力の処理時間は350.0ns

MCP4922

ch2:Pin_Check1の出力

周波数は491.0kHzで1ループは約2037ns。
DAC出力の処理時間は1800ns

DAC LOOP(ns) DAC(ns) LOOP-DAC
VDAC8 587.5 350.0 237.5
MCP4922 2037 1800 237

PSoC 5LPはCoretex-M3でCortex-M4のNucleo F446と比較すると、
Nucleo F446の内蔵DAC(12bit精度)は700nsだったので、PSoC 5LPの内蔵DACは8bit精度ではあるが処理が速い。

SPI接続のMCP4922はNucleo F446でSPIクロックが22.44MHzのとき6.74us(6740ns)だったので、こちらもかなり速い。

PSoC Creatorはグラフィカルで使い易いが、ネイティブなので高速なコードを生成してくれるようだ。

出力波形

VDAC8

サイン波の周波数:4.726kHz

MCP4922

サイン波の周波数:1.336kHz

WaveSpectraで測定

VDAC8

MCP4922

周波数が違うので単純に比較はできないが、VDAC8は高調波歪がはっきり出ている。

MCP4922のSPI信号


SCK : MOSI

ch1:MOSI ch2:SCK

SPI Masterコンポーネントのクロックに40MHzを入れているがSCKは8.676MHzになっている。

SCK : CS

ch1:CS ch2:SCK

CSがアクティブ(L)の区間は目盛りから読み取って約840ns。1周期は約2026nsでPin_Check1で測定した周期とほぼ同じ。

Github:
VDAC8
https://github.com/ryood/PSoC-Creator-4.1-Test/tree/master/VDAC_Test.cydsn

MCP4922
https://github.com/ryood/PSoC-Creator-4.1-Test/tree/master/MCP4922_Test.cydsn

<追記:2017.07.26>

SCKを拡大して測定し直したら、20MHzだった。


ch1:SCK ch2:CS

8.676MHzになっている画像も、SCKは200ns×4マス=800nsで16クロックなので

800ns / 16clk = 50ns
1 / 50ns = 20MHz

になり、たまたま少ない周波数が表示されていただけだと思う。

また、SPI Masterコンポーネントに「Enable High Speed Mode」というプロパティがあり、これをチェックしない場合最大クロック9MHz、チェックすると最大クロック18MHzまで対応する。
←したがって、SCK 20MHzは仕様外。

</追記>

2016年7月22日金曜日

PCM5102Aを使ったファンクションジェネレータの熱対策と小改良

夏場になってきてPCM5102Aを使ったファンクションジェネレータが誤動作するようになってきた。通電後しばらくすると出力波形がぐちゃぐちゃになる。(操作はできる)

プログラムでダイ温度を表示できるようにしているので見てみると40℃程度まで上がっていた。

なんちゃって放熱器をつけていたが、ちゃんとした(?)放熱器をaitendoで仕入れたので付け替えてみた。


共立で売っている熱伝導シールで接着した。


触ってみるとPCM5102Aも相当発熱していたので、もともと使っていたものはPCM5102Aの方につけた。

室温28℃で

旧ラジエーター:5分後38℃
新ラジエーター:5分後37℃

と効果はそれほどかわらなかった(^q^;

が、PCM5102Aの方にも放熱器を付けたおかげか、20分ぐらい様子を見ても波形がぐしゃぐしゃになることはなくなった。PCM5102Aの方が原因だったのかな?

小改良


この間PSoC 5LPのEEPROMを使ってみる実験をしたので、設定値をEEPROMに保存して電源再投入後も前の設定が呼び出されるように改良した。

電池がもったいないので電源を頻繁にオン・オフするので、これ、結構便利です(^q^/

Github:
https://github.com/ryood/I2S_FG/tree/master/PSoC/I2S_FG/PrototypingKit_FG.cydsn

2016年6月24日金曜日

PSoC5LP Prototyping KitでEEPROMを使ってみる。

シーケンサーで作ったシーケンスを永続化したいのだが、何が一番簡単か考えてみるとマイコンに内蔵されているflashメモリーに書いてしまえれば話が早そうだ。

だがしかし、ノイマン型ではない、なんだっけ名前忘れたが(^q^; プログラムをflashメモリにおいてSRAMを作業領域として分離して使うタイプのCPUだと、実行時にそうは簡単にflashメモリーに書き込めない仕組みになっているようだ。

flashメモリへの実行時書き込みは宿題として、簡単にアクセスできそうなメモリは

SDカード
EEPROM

ぐらいだと思う。

SDカードはハンダ付けしたり配線するのがめんどくさそうなのでEEPROMが内蔵されているPSoC 5LPでEEPROMを使ってみることにした。

試した見たのはPSoC CreatorのexampleのEEPROM_Designというプロジェクト。

基本的には「PSoC 5LP Prototyping KitでChar LCD(HD44780)を使う まとめ」と同じ配線で、プロジェクトのTopDesignに書いてあるように


Procedure:

2. Connect LED1 to pin P0[0], LED4 to P0[1] and SW1 to P0[2].

のとおり配線した。(LEDの1とか4の意味は分からないがCY8CKIT-001がそうなってるのかな?)


そのままではコンパイルが通らなかったので、PSoC CreatorのメニューからProject/Debice SelectorでPSoC 5LP Prototyping KitのCY8C5888-LP097を指定。

USBを引っこ抜いて挿しなおしても表示値は追随していたので、RST回数やERASE回数はEEPROMに保持されていると思う。

メモ:

PSoC5LPの型番は覚えにくいが、Prototyping KitはLP097、CQ出版のはLP035。

PSoCにはEm_EEPROMというコンポーネントがあって、EEPROMが実装されていないPSoC4てもflashメモリーでエミュレートできるようだ。

→製作中のベースマシンではmbedで使うNucleoF401REが親なのでSDカードで保持する方向で考えるべきか?


2016年3月27日日曜日

PSoC 5LPを98.304MHz駆動する

中途半端なクロック数だが、98.304MHz/2=49.152MHzをI2Sコンポーネントのクロックとして入力すると
49.152(MHz) / 32(bit) / 2 / 2 = 384(kHz)
となり、I2Sのサンプリング周波数がPCM5102Aの最大サンプリング周波数になる。

クロック源には24.576MHzの外付け水晶振動子を使った。(aitendoで買ったので精度は不明)

PSoC 5LP Prototyping KitのCY8C5888LTI-LP097の最大クロックは80MHzなので仕様外だが無理やり動かした。

クロックの設定ダイアログ

80MHz以上は設定できないので20MHzのXTALを使う設定にして、実際は24.576MHzのXTALを使った。

オーバークロック(懐かしい響き)するとコアの温度が心配なので、PSoCのダイ温度を測定するコンポーネント(DieTemp)で計測してみた。

配線図


BUS_CLKと2分周したものを出力

ch1:BUS_CLK ch2:2分周

正確な周波数はわからないが98.304MHz駆動できているようだ。

室温20度で、動作開始後10分程度でDieTempを計測した。
48MHz駆動のとき: 30℃
98.304MHz駆動のとき: 35℃
そこそこ温度が上がっているようなので念のためなんちゃって放熱器をつけるつもり。

Github:
https://github.com/ryood/PSoC_5LP_Die_Temp.git

2016年2月14日日曜日

PSoC 5LP Prototyping Kit: UARTの使い方 (KitProgを分割した場合)

PSoC 5LP Prototyping Kitのプログラマー部分のKitProgを分割すると、そのままではUSBを使ったUART通信ができなくなる。はまってしまったのメモ。

配線図


KitProgのP12[7](UART TX)、P12[6](UART RX)をPrototyping Kit本体のP12[6]、P12[7]につなぐ。TX同士、RX同士ではなくTXとRX。

KitProgをUSBのVBUSで5V駆動、PrototypingKit本体を別電源で3.3V駆動しても動作する。(ほんとはちょっとまずいかも?)

2016年2月12日金曜日

NUCLEO-F401RE(Cortex-M4)とPSoC 5LP(Cortex-M3)の浮動小数点演算比較

小ネタ実験です。

NUCLEO-F401REに載っているMPUはSTM32F401でCortex-M4ベースでFPUが搭載されている。しかも1,500円@秋月とPSoC 5LP Prototyping Kit(Cortex-M3ベース)と同じ値段だ。

このあいだPSoC 5LPで浮動小数点演算をしてサイン波のテーブルを作成してみたが、FPU付きのNUCLEO-F401REでも同じことをして比較してみた。

NUCLEOはmbedのオンラインコンパイラ使った。

 #include "mbed.h"  
   
 //------------------------------------  
 // Hyperterminal configuration  
 // 9600 bauds, 8-bit data, no parity  
 //------------------------------------  
 #include <math.h>  
   
 #define M_PI      (3.14159265358979323846) /* pi double*/  
 #define M_PI_f     (3.1415926f) /* pi float */  
 #define TABLE_LENGTH  (8192)  
   
 Serial pc(SERIAL_TX, SERIAL_RX);  
 Timer timer0;  
 uint8_t waveTable_0[TABLE_LENGTH];  
   
 void genSineTable_double(uint8_t *table, int length)   
 {   
   int i;   
   int16_t v;   
   int8_t* p8;   
   for (i = 0; i < length / 2; i++) {   
      v = (int16_t)(sin(2.0 * M_PI * i * 2 / length) * 32767);   
      p8 = (int8_t *)&v;   
      table[i*2] = *(p8+1);   
      table[i*2+1] = *p8;   
   }   
 }  
   
 void genSineTable_float(uint8_t *table, int length)   
 {   
   int i;   
   int16_t v;   
   int8_t* p8;   
   for (i = 0; i < length / 2; i++) {   
      v = (int16_t)(sinf(2.0f * M_PI_f * i * 2 / length) * 32767);   
      p8 = (int8_t *)&v;   
      table[i*2] = *(p8+1);   
      table[i*2+1] = *p8;   
   }   
 }  
     
 int main() {  
   timer0.start();  
     
   // 単精度浮動小数点演算 (with FPU)  
   pc.printf("start float: TABLE_SIZE:%d\r\n", TABLE_LENGTH);  
   timer0.reset();  
   genSineTable_float(waveTable_0, TABLE_LENGTH);  
   pc.printf("%d\r\n", timer0.read_us());  
     
   // 倍精度浮動小数点演算  
   pc.printf("start double: TABLE_SIZE:%d\r\n", TABLE_LENGTH);  
   timer0.reset();  
   genSineTable_double(waveTable_0, TABLE_LENGTH);  
   pc.printf("%d\r\n", timer0.read_us());  
 }  
    


FPU付きだが単精度小数点数しか使えないらしいのでdouble型とfloat型の二通りでサイン波テーブルを生成。


TABLE_LENGTH Nucleo float (us) Nucleo double (us) float vs double PSoC 5LP(us)
512 372 18125 48.72311828 15280
1024 743 36255 48.79542396 29640
2048 1486 72718 48.93539704 58400
4096 2972 145631 49.00100942 116000
8192 5943 291349 49.02389366 230000


比較すると、floatだとNUCLEO-F401REが圧倒的に速い。

PSoC 5LPのコードは今回のものと少し違うが、double型で計算している。double型(FPUなし)だとM3のPSoC 5LPの方が若干速い結果になった。

動作クロックはPSoC5LPが72MHz、NUCLEO-F401REは84MHz。

double型(FPUなし)での比較はM3もM4も大差ないというぐらいの認識で(^q^;


メモ:


NucleoというかSTM32はmbed以外にもSTM32ネイティブ(?)のコンパイラがあってオフィシャルではIARとかの有償(企業向)のものが推奨されている。

無償ではCooCox CoIDEというのがある(GCC based IDEと書かれているのはこれかな?)

STM32 Cubeというライブラリもあるみたいで、よくわかりません。

エンディアンの変換 __REV()関数

リトルエンディアンからビッグエンディアンに変換するためにバイト単位で入れ替えていたが、__REV()という(マクロ)関数が用意されていた。Cortex-M用のGCCの関数のようだ。

1バイトずつ入れ替え
v = (sineTable[index] >> 0);
p8 = (uint8 *)(&v);
waveBuffer_0[i]   = *(p8 + 3);
waveBuffer_0[i+1] = *(p8 + 2);
waveBuffer_0[i+2] = *(p8 + 1);
waveBuffer_0[i+3] = *p8;
__REV()を使用
v = (sineTable[index] >> 0);
*((uint32 *)waveBuffer_0) = __REV(v);

__REV()はARMのasmにrevと言う命令があってこれを呼び出していて一発でエンディアンを変換できるようだ。


演算の前後でPinにH/Lを出力して実行時間を比較。


1バイトずつ入れ替え

ch1:実行時間 ch2:I2SのWS

(1)PW:1.520us

__REV()

(1)PW:1.070us

※横軸の縮尺が違います。

PWはパルスの+側の時間で、比較すると__REV()を使ったほうがかなり短縮されている。

また、1バイトずつ入れ替えている方は、実行時間より、WSがHiの時間のほうが長い。つまり2ch出力すると間に合っていなかったようだ。



2016年2月11日木曜日

オーディオ用DACを使ったファンクションジェネレータ ファームウェアを改良

PSoCだけではなくてmbedでもやってみようと思って調べてみたが、I2Sのライブラリがいまいちで、DMAが簡単には使えないようだ。

手持ちのNUCLEO-F401REはCortex-M4なのでもう少し調べてみたいところですが。


というわけで、引き続きPSoC 5LPで。

Github:
https://github.com/ryood/I2S_FG/tree/master/PSoC/I2S_FG


波形の振幅を小さくする。

PCM5102aの電源電圧が3.3Vだとフルスケール出ないようなので、波形テーブルの値を0.9倍にしてみた。

フルスケール

0.9倍

振幅が小さくなって波形の頭打ちがなくなった。

波形テーブルをリッチにする。

間に合わせで、16bit/1024個のテーブルにしていたのを32bit/32768個に拡張した。32bit×32768/8bit=131,072Byteのテーブルになる。PSoC 5LPはFlashメモリが256kBあるのでまだ余裕がある。32bit版も振幅は0.9倍している。

10kHz 16bit/1024

10kHz 32bit/32768

20kHz 16bit/1024

20kHz 32bit/32768

50kHz 16bit/1024

50kHz 32bit/32768

100kHz 16bit/1024

100kHz 32bit/32768

192kHz 16bit/1024

192kHz 32bit/32768

理屈で言うと32bit/32768の方がサンプリングポイントがなめらかになるはずだがオシロで波形を見た限りではよくわからない。

100kHzで32bitの方が悪化して見えるのは、ちゃんと波形が出力されていないのが原因のようだ。メモリ転送が間に合っていないのかも。

2ch出力をやめて1ch出力にしてみる。

CPUの処理を短縮するために、32bit/32768のままI2Sコンポーネントの設定を変更してLchのみ出力するようにしてみた。また、PCM5102aからの出力にかけている470Ω/2200pFのLPFの手前での波形も見てみた。

100kHz

ch1:LPF通過後 ch2:LPF通過前

1ch出力にしたら100kHzの波形(ch1)は綺麗になった。LPFを通す前を見ると高い周波数では相当ガタガタなので1次LPFを通すだけでもかなり波形は綺麗になっている方だろう。

プログラムで振幅を絞る。

POTによるレベル調整ではなくプログラムで出力振幅を絞る実験もしてみた。出力値(整数)をシフト演算したもの。

シフト0 (1倍)

ch1:LPF通過後 ch2:LPF通過前

(1)Vk(RMS):1.889V

シフト1 (1/2倍)

(1)Vk(RMS):954.4mV
1.889V / 2 = 944.5mV

シフト2 (1/4倍)

(1)Vk(RMS):483.0mV
1.889V / 4 = 472.25mV

シフト3 (1/8倍)

(1)Vk(RMS):250.8mV
1.889V / 8 = 236.125mV

シフト4 (1/16倍)

(1)Vk(RMS):142.5mV
1.889V / 16 ≒ 118mV

だいたい想定通りに振幅が小さくなっている。振幅が小さくなると誤差が出ているのはノイズの影響かな。

拡大

周期性がありそうなのでクロックノイズかな?300mV~500mV(p-p)ぐらいなので結構でかい。

メモ:

オシロのFFT機能を使って高調波歪を見てみる。

テーブルの要素数は増やせば良くなるかと思ってたが、どうだかわからない。出力周波数とサンプリングレートの比率でジッターになる?

1次LPFを通す前の波形も出力できるようにして、外付けで高次のActive LPF(+レベル調整)を入れられるようにする?

2016年1月31日日曜日

PSoC 5LP Prototyping KitでPCM5102Aをサンプリング周波数384kHzで使う。

PSoC CreatorのProject
https://github.com/ryood/I2S_FG/tree/master/PSoC/I2S_FG/PrototypingKit_DDS.cydsn

PSoCのI2SコンポーネントのDATASHEETではClockの設定の項では


となっていて、192kHz/16bitまでしか選択できない様に書いてあるので仕様外かもしれない。

※WSは2ch分なのでtws=32bitsだと1chは16bitになる。

配線

PSoC 5LP Prototyping KitでPCM5102Aを使ってみる。」のブレッドボード図に周波数設定用のロータリーエンコーダをつないだ。

384kHz/24bit

CPU Clockを72MHz、I2Sコンポーネントに入れるクロックを36MHzに設定。
DMAのBUFFER_SIZEを6(byte)に設定。


ch1:SCK ch2:WS
Fsck / Fws = 17.90MHz / 373.1kHz ≒ 48
なので24bitを2ch分送信できているようだ。


ch1:SDO ch2:WS

WSがLとHで同じデータが送られているようだ。


ch1:ROUT ch2:LOUT

だいたい10kHzに設定して出力。

384kHz/32bit

CPU Clockを48MHz、I2Sコンポーネントに入れるクロックを48MHzに設定。
DMAのBUFFER_SIZEを4(byte)に設定。


ch1:SCK ch2:WS
Fsck / Fws = 23.90MHz / 373.7kHz ≒ 64
なので32bitを2ch分送信できているようだ。


ch1:SDO ch2:WS

これもOK

1kHz

ch1:ROUT ch2:LOUT

10kHz

192kHz

I2SのSCKが373.7kHzなので出力周波数がずれているが
1kHz * 373.7kHz / 382kHz ≒ 978.3Hz
10kHz * 373.7kHz / 382kHz ≒ 9.783kHz
192kHz * 373.7kHz / 382kHz ≒ 187.83kHz
なのでだいたいOKだと思う。

I2Sに入力しているクロック

47.81MHz

メモ:

波形テーブルを作るのがめんどくさかったのでとりあえず16bitのデータに下位bitを0で埋めて出力したので実質16bitのデータ。32bitに拡張しつつ予めバイト順を入れ替えておく。

Flashメモリが余っているので波形テーブルの要素数も増やしてみる。

100kHz超えのサイン波を中心に考えて出力にLPFを入れる。←三角波、ノコギリ波は妥協するかLPFをON/OFFできるようにする?

表示用に3.3V駆動のLCDを使いつつノイズにも気をつける。←これもON/OFFできるようにする?

出力レベルの調整はアナログ信号をPOTで減衰させる。←適当な抵抗値を考える。入れる場所をLPFの前段、後段で実験

出力レベルはPSoC内蔵の基準電圧とADCで測定できる?

AVDD-AGNDの電圧を測ると3.10V程度まで低下している。電源には「5V/3.3Vの安定化電源」を使っているのに電圧が低下する原因がわからない。電源からの出力電流は70mA程度。電圧安定度をオシロで見てみる?