So-net無料ブログ作成
English Version

トラ技2019年5月号のPSoC基板 [PSoC]

 トラ技5月号にPSoC基板が付録で付いているので購入してみました。
 PSoCは「独自言語 picle on PIC24FJ」の記事のコメントに書いたpicle言語の開発スタイルとは真逆でGUIの設定で内部の機能ブロックの初期化や外部ピン接続等の初期化Cのソースを生成でき、内部レジスタの構成等を考える必要がありません。

 また、「バットディテクター(Bat Detector)の製作」の記事のコメントの最後の方に書いたようにアナログブロックを使って通過周波数をソフトで変更できるバンドパスフィルタの実現等が可能で、その素晴らしさに驚きましたが、この時はCコンパイラ環境が無かったので継続して使用することはありませんでした。

 今回、パソコン電子ブロックというキャッチフレーズでPSoC4(CY8C4146LQI_S433)基板がトラ技に付録になっていたので久々にPSoCで遊んでみました。

付録のPSoC基板で実験


 PSoCの開発環境である「PSoC Creator」は下図のような感じでGUI設定によりコード生成可能で相当な力を入れて開発しているという印象を受けます。

PSoC Creator


 今回は最初にアナログ入力値に応じてduty比を変えてLEDを点灯するような簡単なものを作りたいと思います。

ブロック図


 Clock_1は下図のような設定で1024kHzを生成し、PWM機能ブロックのクロックとしています。

Clock_1の設定


 PWMの設定は下図のとおりで周期を1024にして入力クロックが1024kHzなのでPWMの周期は1kHzになります。

PWMの設定


 信号の結線は下図のようにしました。

信号のピンアサイン


 まずはPWMブロックの周期での割込み動作を確認してみました。ソースは下記のとおりです。

割込みテスト
/* ======================================== * * 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" #define ADC_CH 0 uint16 Cnt; CY_ISR( TimerInt ) { PWM_1_ClearInterrupt( PWM_1_TC_INTERRUPT_MASK ); // clear INT flag #if 0 PWM_1_WriteCounter( ADC_1_GetResult_mVolts( ADC_CH ) ); ADC_1_StartConvert( ADC_CH ); #else Cnt ^= 1; InLED_Write( Cnt ); // isr_1_ClearPending(); #endif } void init( void ) { Clock_1_Start(); PWM_1_Start(); ADC_1_Start(); ADC_1_StartConvert( ADC_CH ); isr_1_StartEx( TimerInt ); // isr_1_Start(); } int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ init(); for(;;) { /* Place your application code here. */ } } /* [] END OF FILE */


 PWMの出力を確認すると想定通り約1kHzの矩形波が出ています。

PWMの出力


 しかし、PWM周期での割込みでトグル操作しているinLEDの信号は下図のようになり、244kHzの矩形波で想定した2kHzではありませんorz
 割込み要求が解除されずに連続して割込み処理が動作しているような感じです・・
 ISRの割込みタイプをDERIVEDからRISIN_EDGEに設定し直すと、PSoC4ではエッジ対応していないようで「Generate Application」操作でコード生成する際にエラーになり、失敗します。
 こうなるとハードを隠遁しGUI操作でコード生成するこの環境ではすぐには解決方法が判りません・・・

★2019/04/27 追記
 サンプルソースを探し出し、割込みフラグクリア(上記ソースの水色部分)を追加することで解決しました。


PWM割込み処理の出力


 PSoC4ではオペアンプ程度しかアナログブロックが無く(今時はPICでもオペアンプ入りのものがある)PSoCが出たての頃のようにアナログブロックがいろいろ有り、周辺のアナログ回路を詰め込める方が面白かったなぁというのが率直な感想です。

nice!(1)  コメント(0)