MplabのMCCを使って、PWMのコードを自動で作成できる。
MCCの基本的な使い方は、本家のドキュメントか、以下のURLあたりを参照ください。
http://blog.e-photographer.net/how-to-program-pics-with-mplab-x-and-mcc?lang=ja
手順
PWMが参照するタイマーをセットするため、Device Resourses からTimerを追加する。
どれでもよいがTMR2を使う。
Timer Clockと、Timer periodの設定によって、PWMの解像度が変わる。
今回はできるだけ解像度をあげるため、プリスケーラ、ポストスケーラともに1:1とした。
で、mccのコード生成を実行し、mccが自動生成した、PWM3_LoadDutyValueを叩いてDutyをコントロールします。CuriosityだとPort Aの5番は、D4のLEDとつながっているため、LEDが調光されます。
uint16_t sawToothX = 0b1111111111; // 10bit
while (1) {
PWM3_LoadDutyValue(sawToothX);
sawToothX -= 1;
if(sawToothX == 0){
sawToothX = 0b1111111111;
}
__delay_ms(10);
}
##PWM5で試す
このマイコンだと、PWM5は、オフセットや位相なども設定できるのですが、PWM3とインターフェースが異なります。
クロックを直接指定します。
今度は、PORTAの1番にアサインします。これはLEDのD5に対応してます。
PWM5_DutyCycleSet
したあとに、設定を反映させるためには、PWM5_LoadBufferSet
が必要でハマりました。(ドキュメント読めばわかるのですが。。)
uint16_t sawToothX = 0b1111111111; // 10bit
while (1) {
PWM3_LoadDutyValue(sawToothX);
PWM5_DutyCycleSet(sawToothX);
PWM5_LoadBufferSet();
sawToothX -= 1;
if(sawToothX == 0){
sawToothX = 0b1111111111;
}
__delay_ms(10);
}
これでD5とD4のLEDがPWMで明滅します。
ビルドは通るけどうまく動かないときは、このNotificationsを見ると、コンフィギュレーション上ダメな箇所があれば教えてくれます。