PIC16F1455のPWMのテストをします。
このPICは2つPWMを持っていて、出力先は次のようになっています。
PWM1 → RC5固定
PWM2 → RC3またはRA5(デフォルトはRC3でAFPCONで変更できる)
テスト回路はLED点滅の時と同じPIC16F1455開発ボードです。
今回は、PWM2を使いRC3(赤色LEDが接続されている)に出力します。
projectを作成し、MCCの設定を行います。
まず、System Moduleでクロックを設定します。
INTOSC,FOSC,4MHz_HFに設定し、PLLは使いません。Clock dividerも使いませんので4MHzで動作させます。
割込みは使いません。
PWM2モジュールを導入し、RC3をoutputに指定します。
PWM2モジュールの設定です。
TimerはデフォルトのTimer2とします。
Duty Cycle 50%のときPWMDC Valueは249です。これはメモしておきます。
Timer2(TMR2)モジュールを導入し設定します。
Prescaler 1:4,Postscaler 1:4とし、Timer Period を2msとしました。
この設定が上のPWMモジュールに反映され、
PWM Period = 500us
PWM Frequency = 2kHz
となりました。
この設定でGenerateして、次のmainプログラムをコンパイル、書き込みをして出力される波形を見てみます。
--------------------------------------------------------
#include "mcc_generated_files/mcc.h"
void main(void)
{
// initialize the device
SYSTEM_Initialize();
while (1)
{
}
}
--------------------------------------------------------
プログラムには何も書いていないのですが、既にMCCのPWMモジュールでPWM Period 500us,duty cycle 50%に設定しています。
RC3にPico scopeを接続して見てみると確かに設定どおりの波形が出力されました。
duty cycleを変更する場合は、
PWM2_LoadDutyValue(uint16_t dutyValue);
という関数を使います。
dutyValue=249のときduty cycle 50%ですので、
PWM2_LoadDutyValue(125);
とするとduty cycle 25%のPWMが出力されます。
次に、LEDを明るくしたり暗くしたりを繰り返すプログラムを試してみました。
----------------------------------------------------------
#include "mcc_generated_files/mcc.h"
void main(void)
{
// initialize the device
SYSTEM_Initialize();
while (1)
{
for(uint16_t i=0 ;i<=500;i++){
PWM2_LoadDutyValue(i);
__delay_ms(5);
}
for(uint16_t i=500;i>0;i--){
PWM2_LoadDutyValue(i);
__delay_ms(5);
}
}
}
----------------------------------------------------------
RC3に接続した赤色LEDが、明るくなったり暗くなったりを繰り返しました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます