PSoC5 CY8C5888LTI-LP097 音を奏でる

プロジェクトファイルはこちら

数日、PSoCでなにをしたら良いのか、何に向いているのか色々と試行錯誤
していまして、私なりに思った事

・I2Cにはなんか向いてないなぁ
 理由はI2Cって或る一定のコモンセンスが在りますよね
 START / STOP / RESTART / ACK / NACK
 そういう共通した言葉が使われていない
・LCD、限定的だなぁ
 I2CタイプのLCDも使えるには使えるがどっちか言うと
 PSoCに合わせたLCDを使う方が全然楽みたいな縛りを感じる
・USBUARTってやってみたいがネット記事が余りにも少なすぎる
 やっとみつけてやってみたが動いて呉れない
・かといって今更RS232Cやりたくないなぁ
・或る意味決定的かな、つまり、基板を起こしたときPSoCを実装
 する訳だけど量産ならいいよ、だけど試作段階でDIPがPSoC1
 しか無いのは決定的に良くない、取り敢えずDIPでバラック組んで
 デバッグしてから量産でしょ?最初から手半田が困難って問題
 ですよね。

それと、ネット情報という資産を考えたときの指標は矢張りグーグル検索
でのヒット数だ、ちょっと調べてみた

検索文字、PSoC=約 1,940,000 件 (0.41 秒)
検索文字、PIC Microchip=約 10,800,000 件 (0.48 秒)
検索文字、arduino=約 126,000,000 件 (0.34 秒)
検索文字、raspberry pi=約 235,000,000 件 (0.36 秒)
この乖離が在る、だから出て来ないんだなって

PSoCの一番便利だなと思う部分
・レゴブロックみたいに組み立てられる
・アナログ回路モジュールが複数在る PSoC5

不便だと思う部分
・ネット検索してもなかなか問題解決策が見つからない
・秋月電子の販売数の少なさ
・ラズパイ、アーデュイーノとの親和性の無さ
・PICマイコンとの親和性の無さ
・唯我独尊なの?

まぁ、そのくらいにして私がこれだけは使えそうだと思って居る
モジュール WaveDAC  正弦波、ノコギリ波、描画波形、等が
簡単に得られるのは実に魅力的だと感じて居ます、ってんで

グーグル様に頼ってひたすらネットを彷徨いました、当然乍ら
最初は日本語サイト、然し乍らこれが殆ど壊滅状態、何だか
空しくなってきて「俺、何やってんだろ」とやがて哀しくなって

きました、なので次は英語圏、ところがこれも出てくるのは何所
やらのフォーラムサイトばっかりで問題が在って動かないソース
が提示されそれに対してアドバイスがあるものの解決したソース

は提示されていない、や、尻切れトンボの儘、何も得られない
で、中国語サイトもダメ、やっと見つかったのがスペイン語サイト
ここで他力本願発揮100%です、一発で動きました。

回路図は下記の通りですが、率直に感じたことは
何故 WaveDAC8 だけで周波数を変えられないのか
ってことですWaveDAC8専用パラメーターが在るんだからそれを
設定していけば出来るハズ、マニュアルにはこんな文言が在る

void WaveDAC8_Wave1Setup(uint8 *WavePtr, uint16 SampleSize)
Description:
Selects a new waveform array for the waveform 1 output. The WaveDAC8_Stop function should be called prior to calling this function and WaveDAC8_Start should be called to restart waveform.
Parameters:
uint8 *WavePtr: Pointer to array containing waveform data
uint16 SampleSize: Size of waveform array pointed to by WavePtr. (Maximum sample size is 4000, minimum is 4)
Return Value:
None
Side Effects:
Does not affect WaveDAC8 type or power settings

これらを駆使すれば自由にプログラミングできるはず、最初にそう考えた
からネット中探しまくったのにそれらしき記事が全く出て来ないのは何故?
って思って居たところ冒頭のスペイン語サイトを見つけたって経緯です

回路は外部クロックを選択することでWaveDAC8の周波数を変化させて居ます
ってことは音源と成る周波数毎にクロックを造らなければならないこれって
良いの? 無駄なリソース浪費ではないの? まぁ良いけどね

bandicam 2019-02-22 19-55-35-646

クロックの周波数
bandicam 2019-02-22 19-55-58-362

WaveDACのパラメーター
bandicam 2019-02-22 19-56-16-620
Muxのパラメーター
bandicam 2019-02-22 19-56-23-813

Controlのパラメーター
bandicam 2019-02-22 19-56-34-344

Pin配列
bandicam 2019-02-22 19-57-09-184
スペイン語サイトの鍵盤です
これメッチャ勉強に成ります、有り難う御座いました
notasyfrecsbg

動画です、何所の国のなんて言う曲か全く判りません
なんか哀愁が漂う曲です

ソースファイル

/* ========================================
*
* 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"
int main()
{
CyGlobalIntEnable;
Wave_Start();
float negra;
negra=700;
Wave_Enable();
Control_Write(0);
CyDelay(negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(1);
CyDelay(negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(2);
CyDelay(negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(3);
CyDelay(negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(4);
CyDelay(negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(5);
CyDelay(negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(6);
CyDelay(negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(7);
CyDelay(negra);
Wave_Stop();
CyDelay(1000);
for(;;)
{
Wave_Enable();
Control_Write(7);
CyDelay(negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(4);
CyDelay(1.75*negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(0);
CyDelay(.25*negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(0);
CyDelay(.25*negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(1);
CyDelay(.25*negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(2);
CyDelay(.25*negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(3);
CyDelay(.25*negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(4);
CyDelay(2.5*negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(4);
CyDelay(.5*negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(4);
CyDelay(negra/3);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(5);
CyDelay(negra/3);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(6);
CyDelay(negra/3);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(7);
CyDelay((2+1/3)*negra);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(7);
CyDelay(negra/3);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(7);
CyDelay(negra/3);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(6);
CyDelay(negra/3);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(5);
CyDelay(negra/3);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(6);
CyDelay(negra*.75);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(5);
CyDelay(negra*.25);
Wave_Stop();
CyDelay(10);
Wave_Enable();
Control_Write(4);
CyDelay(negra*2);
Wave_Stop();
CyDelay(1000);
}
}
/* [] END OF FILE */

PSoC5 CY8C5888LTI-LP097 VGA_inv を使う(オペアンプ・ゲイン可変)

PSoCのOPamp絡みのモジュール PGA_inv です
これは可変ゲインを持って居るのですが逆位相で出力します
x1  / x3  / x7  / x15 / x22  / x24  / x31  / x47  / x49 がプログラムで
選べますがなんとも中途半端な倍率ですこと、例えば何で x10 / x20
が無いんでしょうねぇ。

取り敢えず回路図を提示します
WaveDAC8_2 が正弦波発振モジュール
VDAC8_1  と VDAC8_2  が DCバイアス、Vref です
PGA_Inv_1 が反転増幅器
PGA_1 が正転増幅器
bandicam 2019-02-19 23-08-19-889

WaveDAC8_2  正弦波発振モジュールのパラメーター

bandicam 2019-02-19 23-08-35-113

VDAC8_1  、Vref のパラメーター

bandicam 2019-02-19 23-08-54-419

VDAC8_2  DCバイアス、Vref のパラメーター

bandicam 2019-02-19 23-08-59-097

PGA_1 正転増幅器のパラメーター
bandicam 2019-02-19 23-09-08-096

PGA_Inv_1 反転増幅器のパラメーター

bandicam 2019-02-19 23-09-14-135

Pin 配列
bandicam 2019-02-19 23-09-28-258
main.c
それぞれのモジュールを起動し
倍率を変化させ、1秒キープ
四種類の増幅率をそれぞれ1秒キープ
Loopで繰り返しという単純な動作です
こんな使い方は無いでしょう、単なる実験です

bandicam 2019-02-19 23-09-51-823

で、思ったんですが、と言うか、ダメだこりゃって思った事です
VDAC8 からDCが出て来ます、これ、あちこちに繋ぐとレベル変動が
激しくて使い物に成りません、信号でフラれまくりです

なんて言うか・・・テーブルタップに色んな機器を配線して電源
とったらどんどん電圧が落ちて使えなく成る感じです
なので一つのOPampに一つのVDAC8が必要です、要は根性無しです
それと電源5Vですからレール・トゥ・レールって謳ってますが

たった5Vですよ?然かもマイナスには絶対振れません、絶対に
もっと言うと基準が0Vでしょ?だから増幅するとDC成分も重畳して仕舞い
必要な交流成分がサチッて仕舞うんです、なのでCカットとか外部で

やってチマチマと狭いスパンで基準を気にしながら回路を組む
組まざるを得ない、こんなのやってられない、ってのが正直な
感想です、だからこのOPampモジュールは使途は本当に限定的だな
って感じます。

ソースファイル

/* ========================================
*
* 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"
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
WaveDAC8_2_Start();
VDAC8_1_Start();
VDAC8_2_Start();
PGA_1_Start();
PGA_Inv_1_Start();
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
for(;;)
{
/* Place your application code here. */
PGA_1_SetGain(PGA_1_GAIN_01);
PGA_Inv_1_SetGain(PGA_Inv_1_GAIN_01);
CyDelay(1000);
PGA_1_SetGain(PGA_1_GAIN_02);
PGA_Inv_1_SetGain(PGA_Inv_1_GAIN_03);
CyDelay(1000);
PGA_1_SetGain(PGA_1_GAIN_04);
PGA_Inv_1_SetGain(PGA_Inv_1_GAIN_07);
CyDelay(1000);
PGA_1_SetGain(PGA_1_GAIN_08);
PGA_Inv_1_SetGain(PGA_Inv_1_GAIN_15);
CyDelay(1000);
}
}
/* [] END OF FILE */


 
動画です
黄色が発振回路の源波形
青がAGP正転増幅器
紫がAGP_Inv反転増幅器

PSoC5 CY8C5888LTI-LP097  VGAを使う(オペアンプ・ゲイン可変)

bandicam 2019-02-19 16-43-01-826
PSoCの特徴的なモジュールに OPamp が在りますが、これ
或る程度の制限付きでゲインが変えられます
VGA (Variable Gain Amp)モジュールです
但し正転アンプです
 x1  / x2 / x4  / x8 / x16  / x24 / x48  つまり33dBぐらいまで増幅が
プログラミングで可能って事です
逆に逆転アンプも在りますがゲインが異なるので要注意です
なんでやねんと言いたいですね
VGA_inv というモジュールです、こちらは
 x1  / x3  / x7  / x15 / x22  / x24  / x31  / x47  / x49 の逆位相です
統一性が無いですねぇ・・・まぁ仕方無い・・・・。
動画は  x1  / x2 / x4  を繰り返すだけの単純動作です
上、黄色が入力波形
下、青色が出力波形


但し、プログラミングしてて無駄な一日を過ごして仕舞ったので
この記事をご覧の方は、嘲ってやって下さい、何が無駄だったのか
ですが、オペアンプの出力です、これが適切に選択されていないと
ドツボに嵌まります

動画の詳細は以下のように成ります、これなら動きます
回路図、抵抗は外付けでコンパイルには無関係です、メモ程度と
お考え下さい
bandicam 2019-02-19 16-22-05-842
WavwDAC8_2 パラメーター
bandicam 2019-02-19 16-22-29-256

VDAC8_1 パラメーター
bandicam 2019-02-19 16-22-36-669

PGA_1 パラメーター
bandicam 2019-02-19 16-22-44-190
main.c
モジュールを起動 → ゲインを変化させる → Loop

bandicam 2019-02-19 16-23-40-149
こんな簡単なプログラムなんですが
こうすると動きません
bandicam 2019-02-19 16-28-57-679
Pin_1 をご覧下さい 15[4] と書かれていますよね
なんでこの Pin を選んだかですが、作図していて pin 配置の画面に
切り替えるとご親切に自動的に pinが選ばれるのです
「ああーー便利だなぁ♪ 流石サイプレス社だ、ふんふんふーーん♪」ヽ(´ー`)ノ
なんて調子に乗ってやっていた訳ですよそしたらとんでもない
なにやっても出力が出て来ないんです、ちゃんと Analog out pin
をドラッグ・アンド・ペーストしたにも関わらずです

恐らくと言うか間違いなく英文マニュアルを読めばどの pin を
使うべきなのか書いて有るハズです、こういうバカをするから
ど素人なんですよね、あーあ、無駄な時間を過ごした。

ソースファイル

/* ========================================
*
* 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"
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
WaveDAC8_2_Start();
VDAC8_1_Start();
PGA_1_Start();
//PGA_Inv_2_Start();
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
for(;;)
{
/* Place your application code here. */
PGA_1_SetGain(PGA_1_GAIN_01);
CyDelay(1000);
PGA_1_SetGain(PGA_1_GAIN_02);
CyDelay(1000);
PGA_1_SetGain(PGA_1_GAIN_04);
CyDelay(1000);
}
}
/* [] END OF FILE */