使用部品はPSoCマイコン29466のみです。
プログラムはこんな感じ。
ちなみにDACモジュールの出力はP0[4]にしています。
(与えるクロックはVC1=24MHz/12)
#include
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void main()
{
// Insert your main routine code here.
int val,a; // RAM for loop iteration variable
unsigned int i = 0;
DAC8_2_Start(3); // power up the DAC
val = 0;
a = 1;
while(1) {
if(val <= 0) a=1;
else if(val >= 255) a=-1;
val = val+a;
DAC8_2_WriteStall(val); // update DAC8
}
動作としてはvalが0~255を行ったり来たりしてその変化の都度DA変換されるという処理です。
PSoCは動作の割にコードがすごく短いからわかりやすいです。
で出力波形はこうなります。

なぜこうなるのかは分かりませんが、とりあえず5V付近の出力を直接DAモジュールで行うのは危険かもしれません。(クロックが高すぎるのかな?)
他の部分は概ね良好な反応をしてくれています。
次に、これにPRSモジュールを組み合わせてホワイトノイズを出してみました。
厳密なホワイトノイズというのはデルタ関数からしか出せないようですが、不規則に上下する波に近似できるらしいです。
コードは上のより短くなります。
PRSモジュールのクロックもVC1(さっきと同じ)を使ってます。
#include
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void main(){
// Insert your main routine code here.
DAC8_2_Start(3);
PRS8_1_Start();
PRS8_1_WritePolynomial(0xb8);
PRS8_1_WriteSeed(255);
while(1){
DAC8_2_WriteStall(PRS8_1_bReadPRS());
}
}
この中の"PRS8_1_WritePolynomial(0xb8);"と書いてる部分が結構重要だったりして、0xb8じゃないと値がきれいに散らばりません。
データシートが長い英文でしかも表の読み方が意味不明だったので、色々試した挙げ句サンプルプログラムの書き方に落ち着きました。
出力波形はこうなりました。

今回は疑似乱数というか出た波形からして周期性があるので、その不規則性すら近似しています。
まさか乱数発生までモジュールがあるのは驚きでした。
極限までCPUに楽をさせる仕様になっています。
とにかくPSoCというのはクロックというのが重要で、何をするときもついて回ります。
あとあの手厚すぎると言っても過言ではないデータシートをきっちり読むのが一番の近道ということが最近分かりました。(まさかアンペアの読み方まで書いてるとは・・・)
とりあえずPSoCは使えば使うほど奥が深くなるマイコンです。

0 コメント:
コメントを投稿