[[lbed]] #contents 2013/07/27からのアクセス回数 &counter; ** PWM(Pluse Width Modulation)を使う [#ubb85f39] LEDの明るさを変えるには、周期的にLEDのON/OFFを繰り返し、ONの時間を変える方法がPWMです。 *** LEDとの接続 [#g862291f] MyARMのp21からp26までのPWMにIOピンの内、PWMに使えそうなのはp21, p23, p26ですが、 p21でLPC-LinkのSWCLKで使っているので、LPC-Linkを使っている人は絶対に指定しないで下さい。 ((私も試しに指定してその後、LPC-Linkが使えなくなって大変でした。シリアルからプログラムを書き込みMagicFlashで別のプログラムを書き込んで復活しました。)) また、p23はどうも上手く動作しませんでした。((詳しく調査できていません)) IOにLEDを接続する場合、IOをHighの場合のLEDを点灯する正論理と、IOがLowの場合に場合に点灯する負論理が ありますが、どうも正論理でLEDを接続するとLEDが完全に消灯しません。((原因がよく分からないので、詳しい人に問い合わせ中です)) 今回は、負論理でp26にLEDのカソードをつなぎ、アノード((線の長い方))に470Ωの抵抗を直列につなぎ、3.3Vに接続しています。 &ref(PWMSetting.png); *** サンプルプログラム [#m6486cd2] サンプルプログラムでは、PwmOutのインスタンスledを生成し、200m秒毎に0.05ずつ値を大きくする (明るさを少なくする)もので、これを4秒間隔で繰り返します。 #pre{{ #include<cr_section_macros.h> #include<NXP/crp.h> __CRP extern const unsigned int CRP_WORD = CRP_NO_CRP ; #include "lbed.h" int main(void) { wait_init(); PwmOut led(p26); led = 0.0; while(1) { led = led + 0.05; wait_ms(200); if(led >= 1.0) { led = 0.0; } } } }} ** PWMOutクラスの実装 [#y9c7050d] サンプルプログラムのPWMを参考にPWMOutクラスを作成します。 最初、timer16.c, timer32.cのsetMatch_timer16PWM, setMatch_timer32PWM関数は、HEIGHTからLOWに変化するものと 勘違いして、pulsewidthを実装していたのですが、以下のタイマー機能の説明によるとLOWからHEIGHTになるものだと分かりました。 タイマー機能を使ってPWMを実装する場合の説明が、トラ技2012年10月号の図13にあるので、引用します。 &ref(Fig13-TRG.png); いつものように、サンプルのtimer16.[hc], timer32.[hc]の先頭に_を付け、ヘッダファイルの先頭の__TIMER16_Hの後に、 extern文を追加し、 #pre{{ #ifndef __TIMER16_H #define __TIMER16_H #ifdef __cplusplus extern"C" { #endif }} 最後に #pre{{ #ifdef __cplusplus } #endif #endif/* end __TIMER16_H */ }} を付けて、C++からCの関数が使えるようにします。 動作がおかしいので、ちょっと待って下さい。 ** コメント [#c81be729] #vote(おもしろかった,そうでもない,わかりずらい) 皆様のご意見、ご希望をお待ちしております。 - PwmOutの動作がおかしいので、ソースの公開は待って下さい。 -- [[竹本 浩]] &new{2013-07-28 (日) 13:47:10}; #comment_kcaptcha