オシレータの作成
オシレータの作成
- オシレータの概要
- 1Hz ~ 20kHzの方形/正弦/三角波を発生するオシレータの作成
- PSoC は 8ピンの PSoC CY8C7143-24PXIを使用
- 3つのピンで、方形/正弦/三角波を出力
- 1つのピンで、AGND (Vdd/2)を出力
- 周波数の変更は、UP,DOWNの二つのスイッチでおこなう。
- LCD等の表示器はないので、オシロで確認するか、LEDやイヤホンを別に接続してだいたいを把握する。
- プログラムのダウンロードはこちらから
Tiny-Oscillator_02
→ Clone & download → Download ZIP をクリックしてください。
PSoC Designer 5.4 使用
作成方法(段取り)
- Step1 Global Resource のパラメータの入力
- Step2 デジタルブロックの配置
- Step3 アナログブロックの配置
- Step4 ブロックの接続とピンのパラメータの確認
- Step5 プログラム main.c
- Step6 プログラム 割り込み
- Step7 プログラムの説明
- Step8 回路図・配線図・写真
完成見本
ブロック図完成図
- 参考文献:はじめてのPSoCマイコン 桑野雅彦ほか共著 CQ出版社
第6章 1Hz~20kHzの方形/正弦/三角波を発生するテスト・オシレータの製作
- 参考文献:アナログ・デジタル!? PSoCに目覚める本 高野慶一著 CQ出版社
第6章 6-8 マイコン的使用例 割り込みを使う
● Step1 Global Resource のパラメータの入力
- PSoCの型番を入力し、プロジェクトを新規作成する。
Start Page > File > NewProject > ( Chip-level-Project選択 ) >- ファイル名 : OSILATOR (任意)
- Device : CY8C27143-24PXI
- 言語 : C
- Global Resource のパラメータの入力
View > Global Resources
又は Window > Restore Default Layout
- 特にサイクル関係は重要です。
● Step2 デジタルブロックの配置
デジタルブブロック画面
1.PWM16 を DBB00 に配置
- User Module > PWMs > PWM16 を選択し、DBB00 に配置
Name : PWM16_1
パラメータ
2.PWM8 を DCB02 に配置
- User Module > PWMs > PWM8 を選択し、DCB02 に配置
Name : PWM8_1
パラメータ
3.PWM8 を DCB03 に配置
- User Module > PWMs > PWM8 を選択し、DCB03 に配置
Name : PWM8_2
パラメータ
● Step3 アナログルブロックの配置
アナログブロック画面
1.PGA を ACB01, ACB02, ACB03に配置
- User Module > Amplifiers >PGA を選択し、ACB01, ACB02, ACB03に配置
Name : PGA_1, PGA_2, PGA_3
パラメータ PGA_1
パラメータ PGA_2
パラメータ PGA_3
2.BPF2 を ASD11, ASD20 に配置
- User Module > Filters > BPF2 > BPF2A を選択し、ASD11, ASD20 に配置
Name : BPF2_1, BPF2_2
パラメータ BPF2_1
パラメータ BPF2_2
3.SCBLOCK を ASC12 に配置
- User Module > Generic > SCBLOCK を選択し、ASC12 に配置
Name : SCBLOCK_1
パラメータSCBLOCK_11
● Step4 ブロックの接続とピンのパラメータの確認
デジタルブロック接続図
1.デジタルブロック PWM8_1 の接続
- Parameters > CompareOut : Row_0_Output_3
- Row_0_Output_3 をクリック > GlobalOutEven_3 を選択して接続
- GlobalOutEven_3 をクリック > Pin : Port_0_3 を選択して接続
アナログブロック接続図
2.アナログブロック BPF2_2 の接続
- Parameters > AnalogBus : AnalogOutBus_1
- buf 1(AnalogOutBuf_1) をクリック > Port_0_5 を選択して接続
- クロックの選択
- AnalogColumn_Clock_0 をクリック > AnalogClock_0_Select を選択
- AnalogClock_0_Select をクリック > DBB01 を選択 > デジタルブロックPWM16_1 に接続される
3.アナログブロック PGA_1 の接続
- Parameters > Input : AnalogColumn_InputSelect_1
- AnalogColumn_InputSelect_1 をクリック > AnalogColumn_InputMUX_0 を選択
- AnalogColumn_InputMUX_0 をクリック > Port_0_3 を選択して接続
- クロックの選択
- AnalogColumn_Clock_1 をクリック > AnalogClock_0_select を選択 > PWM16_1 に接続
4.アナログブロック PGA_2 の接続
- Parameters > Input : AnalogColumn_InputSelect_2
- AnalogColumn_InputSelect_2 をクリック > AnalogColumn_InputMUX_2 を選択
- AnalogColumn_InputMUX_2 をクリック > Port_0_3 を選択して接続
- クロックの選択
- AnalogColumn_Clock_2 をクリック > AnalogClock_0_select を選択 > PWM16_1 に接続
5.アナログブロック SCBLOCK_1 の接続
- Parameters > AnalogBus : AnalogOutBus_2
- buf 2(AnalogOutBuf_2) をクリック > Port_0_4 を選択して接続
6.アナログブロック PGA_3 の接続
- Parameters > AnalogBus : AnalogOutBus_3
- buf 3(AnalogOutBuf_3) をクリック > Port_0_2 を選択して接続
- クロックの選択
- AnalogColumn_Clock_3 をクリック > AnalogClock_0_select を選択 > PWM16_1 に接続
7.Pinoutの設定
- View > Pinout
- Pin 1[0], Pin 1[1] > Drive : Pull Up に設定 (UP,DOWN ボタン用)
● Step5 プログラム main.c
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler isr_pwm8_2
#define NUM_FREQ 14
unsigned int freq_table[] = {1,2,5,10,20,50,100,200,500,1000,2000,5000,10000,20000};
#define SW_UP 0x1 //?? 0x00 ??
#define SW_DOWN 0x2 //?? 0x01 ??
void set_freq(unsigned char fnum)
{
unsigned int pw; pw = 40000/freq_table[fnum]; PWM16_1_Stop(); PWM16_1_WritePeriod(pw-1); PWM16_1_WritePulseWidth(pw/2-1); PWM16_1_Start();
}
unsigned char pastdat = 0xff;
unsigned char pdat;
unsigned int intcount = 0;
void isr_pwm8_2(void)
{
unsigned char cdat, stable; cdat = PRT1DR; //?? PRT1DR ?? stable = ~(cdat ^ pastdat); pdat = (pdat & ~stable) | (cdat & stable); pastdat = cdat; intcount++;
}
void main(void)
{
unsigned char cfreq,psw,csw,onsw;
// Insert your main routine code here. PWM16_1_Start(); PWM8_1_Start(); PWM8_2_Start(); PGA_1_Start(PGA_1_HIGHPOWER); PGA_2_Start(PGA_2_HIGHPOWER); PGA_3_Start(PGA_3_HIGHPOWER); BPF2_1_Start(BPF2_1_HIGHPOWER); BPF2_2_Start(BPF2_2_HIGHPOWER); SCBLOCK_1_Start(SCBLOCK_1_HIGHPOWER);
M8C_EnableGInt; PWM8_2_EnableInt(); psw = pdat;
cfreq = 0; set_freq(cfreq); while(1) { csw = pdat; onsw = ((psw ^ csw) & ~csw); psw = csw; if (onsw & (SW_UP | SW_DOWN)) { if (onsw & SW_UP) { cfreq++; if (cfreq >= NUM_FREQ) cfreq = 0; } if (onsw & SW_DOWN) { if (cfreq == 0) cfreq = NUM_FREQ-1; else cfreq--; } set_freq(cfreq); } }
}
● Step6 プログラム 割り込み
割り込みのプロセス
- 目的:周波数を変更するボタンのチャタリングを防止するためのルーチンのため、割り込みを発生させます。
- 割り込みのための手続きの順番
1.割り込みに使用するユーザモジュールの配置
2.コンフィギュレーションの構築
3.コンプィギュレーションで作成されたアセンブラ・ファイルにジャンプ先を追加
4.C言語ソースファイル「main.c」に割り込み宣言を記述
5.割り込み処理を記述
6.スタート および 割り込み許可の記述
1.割り込みに使用するユーザモジュールの配置
- PWM8_2を割り込みに使います。
2.コンフィギュレーションの構築
- Build > Genarate/Build 'OSILATOR' Project
をクリックしてビルドします。 - Workspace Explorer > OSILATOR > lib > Library Source Files > PWM8_2INT.asm
というファイルが生成されます。
3.コンプィギュレーションで作成されたアセンブラ・ファイルにジャンプ先を追加
- ジャンプ先は、 main.c の isr_PWM8_2 というファイル名にしますので…
ファイル名の前にアンダースコアをつけ、生成された PWM8_2INT.asm ファイルの所定の場所に次のジャンプ命令を記述します。
lJmp _isr_PWM8_2 |
4.C言語ソースファイル「main.c」に割り込み宣言を記述
- Workspace Explorer > OSILATOR > Source Files > main.c
- 割り込み宣言を記述します。
#pragma interrupt_handler isr_pwm8_2 |
5.割り込み処理を記述
- 割り込みが発生した時のプログラムを記述します。
6.スタート および 割り込み許可の記述
- main.cの中に、PWM8_2のスタート命令と割り込み許可の記述をします。
- スタート命令
PWM8_2_Start(); |
- PWM8_2 の割り込み許可 API関数
PWM8_2_EnableInt(); |
- PSoC 全体の割り込み許可するマクロ命令
M8C_EnableGInt; |
で、割り込みが可能になります。
● Step7 プログラムの説明
各モジュールの説明
- デジタルブロック
1.PWM16_1
2.PWM8_1
3.PWM8_2
- アナログブロック
4.PGA_1, PGA_2
5.BPF2_1, BPF2_2
6.SCBLOCK
7.PGA_3
デジダルブロック
1.PWM16_1
(16-Bit Pulse Width Modulator : 16ビットパルス幅変調器)
(16-Bit Pulse Width Modulator : 16ビットパルス幅変調器)
- Clock は VC1(24/3MHz)
- UP, DOWN ボタンにより、プログラムから Period と PulseWidthの数値を変更してパルスの周波数を変更する。
- 次の PWM8_1 で200分の1にしたものが、基本方形波
- アナログモジュールの BPF2_1, BPF1_2, SCBLOCK のサンプリング周波数に使用
2.PWM8_1
(8-Bit Pulse Width Modulator : 8ビットパルス幅変調器)
(8-Bit Pulse Width Modulator : 8ビットパルス幅変調器)
- PWM16_1 の周波数を200分の1にして方形波を出力し、Pinout に出力
- 内部バスで、アナログブロックの BPF2_1, BPF2_2, SCBLOCK の Input に使用され、正弦波・三角波に加工される。
3.PWM8_2
(8-Bit Pulse Width Modulator : 8ビットパルス幅変調器)
(8-Bit Pulse Width Modulator : 8ビットパルス幅変調器)
- 割り込みのタイミングに使用される。10mSごと。
アナログブロック
4.PGA_1, PGA_2
(Programmable Gain Amplifier : プログラマブル・ゲイン・アンプ)
(Programmable Gain Amplifier : プログラマブル・ゲイン・アンプ)
- PWM8_1で作られた方形波の Gain を低める。そのまま加工するとゆがむため。
5.BPF2_1, BPF2_2
(Two-Pole Band-Pass Filter : 2極バンドパスフィルタ)
(Two-Pole Band-Pass Filter : 2極バンドパスフィルタ)
- 減衰されたPWM8_1 の方形波を、二つのフィルタを通すことにより正弦波を生成
- フィルタのパラメータ・デザインは BPF2 Design.xlsを使用
Help > Documentation > Filter Design > BPF2 Design.xls
6.SCBLOCK
(Analog Switched Capacitor PSoC Block : アナログ・スイッチドキャパシタ・PSoCブロック)
(Analog Switched Capacitor PSoC Block : アナログ・スイッチドキャパシタ・PSoCブロック)
- 減衰されたPWM8_1 の方形波から、SCBLOCKを積分器として使用し、三角波を生成
- 内部の回路を直接いじっているので説明を読んでも詳細は理解できず。
7.PGA_3
(Programmable Gain Amplifier : プログラマブル・ゲイン・アンプ)
(Programmable Gain Amplifier : プログラマブル・ゲイン・アンプ)
- Add/2 の電圧をAGND として出力
- GNDとして使用すれば、直流電圧成分がカットできるということか。
- 説明間違いはお許しください。
Step8 回路図・配線図・写真
回路図です。
- UP SW, DOWN SW に接続している330Ωの抵抗は、Pin 1[0],Pin 1[1]が 内部抵抗に接続されている Pull Up設定ですので、無くても動きますが、Pinout の設定を間違えた場合、短絡して事故につながります。
- このケースではありませんが、8Pin のPSoC を短絡させてしまい、ブレッドボードが融けてしまいました。
熱くなるという程度のものではありませんでした。
配線図です。上から見たところ。
20KHz の時の方形はと正弦波のオシロスコープの写真です。
20Hz の時の方形はと正弦波のオシロスコープの写真です。
- 正弦波、三角波のよく見るとギザギザは、スイチト・キャパシタ方式によるものです。
完成写真
裏面写真
ハンダがヘタです。
- 最終更新:2017-04-08 19:00:34