2018-10-05に更新

PIC32MX220F032Bでpwm

PIC32MX220F032Bでpwmをやってみた。
サンプルないのかなーと思ったが、pwmに使う機能が
Outcompareというものらしく、よく見るとサンプルがあった。

やってる内容を簡単にまとめると下記みたいな感じ。
すごく簡単だった。

・まずpwmを行うピンを設定。
特にピンが決まっておらず、PPSという機能でピンを決める必要があるため。
デフォルトはどこかよくわからない。(0だったら必ず設定する必要があるかも)
設定の仕方はプログラムとデータシートをOC1で検索してもらえれば
すぐわかると思う。
(あってるかは知らないが動いたので…)
あとで調べたらplibにPPSOutputというマクロもあった。
確かに他のプログラムで見たことがある。
変なマクロだなと思っていたがようやく意味がわかった。

・plibを使って簡単にPWMを設定。

|c|

include <xc.h>

include <plib.h>

pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF

pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_8

define SYS_FREQ (80000000L)

void __delay_us(WORD us)
{
DWORD start = _CP0_GET_COUNT();
DWORD end = start + SYS_FREQ / 10000000 / 2 * us;
// DWORD end = start + SYS_FREQ / 1000000 / 2 * us;
if (end > start) while (_CP0_GET_COUNT() < end);
else while (_CP0_GET_COUNT() > start || _CP0_GET_COUNT() < end);
}

void __delay_ms(unsigned int msec) //1msec遅延関数
{
unsigned int i;

for(i=0; i&lt;msec; i++) {
    __delay_us(1000);
}

}

int main(void)
{
char s[17];
int i;

SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
mJTAGPortEnable(DEBUG_JTAGPORT_OFF);

RPB15R = 0b0101;

OpenTimer2(T2_ON, 0x550);
/* Enable OC | 32 bit Mode  | Timer2 is selected | Continuous O/P   | OC Pin High , S Compare value, Compare value*/
OpenOC1( OC_ON | OC_TIMER_MODE32 | OC_TIMER2_SRC | OC_CONTINUE_PULSE | OC_LOW_HIGH , 0x550, 0x500 );


while(1)
{
    for (i = 0; i &lt; 4; i++) {
        __delay_ms(1000);
        SetDCOC1PWM((0x550 - 1) * i / 4);
    }
}

}
||

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, React, Flutter, Vue.js, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々 PHPフレームワークちいたんの作者

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント