PIC24FJ64GB002のPWM出力機能を使ってみたいと思います。基本はPeripheral Libraryの関数、マクロを使用します
Peripheral LibraryはXC16_v1.25には.hファイルが何故か同梱されてないため使えません。v1.24以前のバージョンでコンパイルします。
⊿1: Peripheral Librariesを個別でインストールすれば最新のコンパイラーでもコンパイルできました。
個別に Peripheral Librariesをインストールする方法はこちら
Peripheral Librariesの詳細マニュアルはインストール先によりますが、だいたいここら辺りにあります。
\Microchip\xc16\v1.24\docs\periph_libs\Microchip PIC24F Peripheral Library.chm
もっと詳しく知りたい場合はこれを見ましょう。
それではLEDを4個使いそれぞれPWM周波数を変えて明るさに違いを付けたいと思います。
ソースです▼
#define USE_AND_OR /**/ #define FCY 16000000UL /*delay関数用定義 Forc/2*/ #include<ports.h> /*ポートbit操作マクロの定義*/ #include<libpic30.h> /*delay関数用*/ #include<PPS.h> /*ピン割り当て*/ #include<timer.h> #include<outcompare.h> int main(void) { AD1PCFG = 0xffff; /*全てのポートをデジタルI/O */ CLKDIV = 0x0000; /*クロックをPLL prescaler (1:1)で使用 32MHz*/ mPORTBOutputConfig(IOPORT_BIT_1); /*RB1出力設定*/ mPORTBWrite(0); /*PORTB Low設定*/ PPSOutput(PPS_RP14, PPS_OC1); /*RP14(RB14)にOC1を割り当て*/ PPSOutput(PPS_RP15, PPS_OC2); /*RP14(RB14)にOC1を割り当て*/ PPSOutput(PPS_RP2, PPS_OC3); /*RP14(RB14)にOC1を割り当て*/ PPSOutput(PPS_RP3, PPS_OC4); /*RP14(RB14)にOC1を割り当て*/ OpenTimer2(T2_ON | T2_PS_1_1 , 0x0fff); OpenOC1(OC_IDLE_CON | OC_TIMER2_SRC | OC_PWM_EDGE_ALIGN , OC_SYNC_TRIG_IN_TMR2, 0, 0); OpenOC2(OC_IDLE_CON | OC_TIMER2_SRC | OC_PWM_EDGE_ALIGN , OC_SYNC_TRIG_IN_TMR2, 0, 0); OpenOC3(OC_IDLE_CON | OC_TIMER2_SRC | OC_PWM_EDGE_ALIGN , OC_SYNC_TRIG_IN_TMR2, 0, 0); OpenOC4(OC_IDLE_CON | OC_TIMER2_SRC | OC_PWM_EDGE_ALIGN , OC_SYNC_TRIG_IN_TMR2, 0, 0); SetDCOC1PWM((0x0fff / 10) * 2, 0); SetDCOC2PWM((0x0fff / 10) * 4, 0); SetDCOC3PWM((0x0fff / 10) * 6, 0); SetDCOC4PWM((0x0fff / 10) * 8, 0); while (1) { mPORTBSetBits(IOPORT_BIT_1); __delay_us(10); mPORTBClearBits(IOPORT_BIT_1); __delay_us(246); }
IDEで簡単にコンフィグ設定ができるためコンフィグレーション設定は割愛してます。
RB1出力設定はただLEDを点滅させたかったので記述してるだけ。PWM出力には関係ありません。
まず必要なヘッダーファイルを取り込みます。次にピン割り付けでOCxの機能をそれぞれPR2/3/14/15ピンにアサインします。その後、OpenTimerでTimer2を設定します。
今回はTimer2を使用し、フリーランでプリスケール1です。クロック32MHz使用ですのでPWM周波数は約244Hz(4.096ms)になります。
OCxをそれぞれ設定します。アイドルモードやトリガー等、多くの設定マクロが準備されてます。
詳細はマニュアル参照して下さい。ここではTimer2への紐つけと立ち上がりエッジの設定、必要最低現の設定をしてます。
最後にPWM出力です。それぞれOCxに対してPWM出力します。SetDCOCxPWM()関数を使用してDuty、周波数を記述します。周波数はTimerをフリーランで使用するため「0」です。Dutyはそれぞれ20%、40%、60%、80%となるように設定してます。
Arduinoのとかのライブラリと比べると少し面倒ですがレジスタ直接操作するよりはずいぶん楽になると思う。
コメント