LoginSignup
1
2

More than 3 years have passed since last update.

PIC16F1764 MPLAB MCC & Curiosity でPWMを試す

Posted at

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を使う。
image.png

Timer Clockと、Timer periodの設定によって、PWMの解像度が変わる。
今回はできるだけ解像度をあげるため、プリスケーラ、ポストスケーラともに1:1とした。

続いてPWM3を追加。
image.png

PortAの5番にPWM3を紐付けます。
image.png

で、mccのコード生成を実行し、mccが自動生成した、PWM3_LoadDutyValueを叩いてDutyをコントロールします。CuriosityだとPort Aの5番は、D4のLEDとつながっているため、LEDが調光されます。

main.c
    uint16_t sawToothX = 0b1111111111; // 10bit
    while (1) {
        PWM3_LoadDutyValue(sawToothX);

        sawToothX -= 1;
        if(sawToothX == 0){
            sawToothX = 0b1111111111;
        }
        __delay_ms(10);
    }

PWM5で試す

このマイコンだと、PWM5は、オフセットや位相なども設定できるのですが、PWM3とインターフェースが異なります。
クロックを直接指定します。
image.png

今度は、PORTAの1番にアサインします。これはLEDのD5に対応してます。

image.png

PWM5_DutyCycleSet したあとに、設定を反映させるためには、PWM5_LoadBufferSetが必要でハマりました。(ドキュメント読めばわかるのですが。。)

main.c
    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を見ると、コンフィギュレーション上ダメな箇所があれば教えてくれます。

image.png

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2