RaspberryPi PicoによるPWM制御をテスト。Arduino IDEにはPico ARM GCC コンパイル SDKライブラリがあり、その中の<hardware/pwm.h>からPWMを処理します。
●同ブログ関連記事:【Raspberry Pi Pico開発環境(Arduino IDE)】
●PWMついてこちらのサイトを参照しました。
ピン機能の設定
●RaspberryPi PicoはすべてのGPIOからPWMを出力することができる。
●PWMのチャンネル数は8で1チャンネルに対してA:偶数番,B:奇数番の2出力。
●別々のDuty比を設定できるピン数は16のみ。 別々の周期は8本のみ。
gpio_set_function(0, GPIO_FUNC_PWM); //GPIO0をPWM出力設定
gpio_set_function(1, GPIO_FUNC_PWM); //GPIO1をPWM出力設定
uint slice_num = pwm_gpio_to_slice_num(0); //GP0 GP1のPWMスライス宣言
PWM周波数の設定
●Raspberry Pi Pico【メインクロック】sysclockは125MHz。
●pwm_set_clkdiv()【分周比】を設定する。[0~256未満の実数値で設定]
●pwm_set_wrap()【PWMの分解能】を設定する。
[32768 16384 8192 4096 | 2048 1024 512 256 | 128 64 32 16 | 8 4 2 1 ] - 1
【PWM周波数】 f = sysclock / ((wrap+1) ⋅ clkdiv)
【分周比】clkdiv = sysclock / ((wrap+1) ⋅ f )[0~256未満の実数値で設定]
[f=250Hz sysclock = 125,000,000Hz wrap = 2047 clkdiv = 244.140625 ]
pwm_set_clkdiv(slice_num, 244.140625);
pwm_set_wrap(slice_num, 2047);
デューティーの設定
●pwm_set_chan_level()【デューティー設定】
●pwm_set_enabled()【PWM出力有効/無効】
pwm_set_chan_level(slice_num, PWM_CHAN_A, 1024);
pwm_set_chan_level(slice_num, PWM_CHAN_B, 512);
pwm_set_enabled(slice_num, true);
プログラム 50Hz
【分周比】clkdiv = sysclock / ((wrap+1) ⋅ f )[0~256未満の実数値で設定]
[f=50Hz sysclock = 125,000,000Hz wrap = 16383 clkdiv = 152.58789 ]
#include <hardware/pwm.h>
void setup()
{
// GP2とGP3のピン機能をPWMに設定
gpio_set_function(0, GPIO_FUNC_PWM);
gpio_set_function(1, GPIO_FUNC_PWM);
// GP2(とGP3)のPWMスライスを取得
uint slice_num = pwm_gpio_to_slice_num(0);
// PWM周期を設定
pwm_set_clkdiv(slice_num, 152.58789 );
pwm_set_wrap(slice_num, 16383);
// チャンネルA(GP2)とチャンネルB(GP3)のPWMのHigh期間を設定
pwm_set_chan_level(slice_num, PWM_CHAN_A, 8192);
pwm_set_chan_level(slice_num, PWM_CHAN_B, 4096);
// PWM出力イネーブル
pwm_set_enabled(slice_num, true);
}
void loop()
{
}
プログラム 250Hz
【分周比】clkdiv = sysclock / ((wrap+1) ⋅ f )[0~256未満の実数値で設定]
[f=250Hz sysclock = 125,000,000Hz wrap = 2047 clkdiv = 244.140625 ]
#include <hardware/pwm.h>
void setup()
{
// GP2とGP3のピン機能をPWMに設定
gpio_set_function(0, GPIO_FUNC_PWM);
gpio_set_function(1, GPIO_FUNC_PWM);
// GP2(とGP3)のPWMスライスを取得
uint slice_num = pwm_gpio_to_slice_num(0);
// PWM周期を設定
pwm_set_clkdiv(slice_num, 244.140625);
pwm_set_wrap(slice_num, 2047);
// チャンネルA(GP2)とチャンネルB(GP3)のPWMのHigh期間を設定
pwm_set_chan_level(slice_num, PWM_CHAN_A, 1024);
pwm_set_chan_level(slice_num, PWM_CHAN_B, 512);
// PWM出力イネーブル
pwm_set_enabled(slice_num, true);
}
void loop()
{
}
プログラム 1MHz
【分周比】clkdiv = sysclock / ((wrap+1) ⋅ f )[0~256未満の実数値で設定]
[f=1MHz sysclock = 125,000,000Hz wrap = 31 clkdiv = 3.90625 ]
#include <hardware/pwm.h>
void setup()
{
// GP2とGP3のピン機能をPWMに設定
gpio_set_function(0, GPIO_FUNC_PWM);
gpio_set_function(1, GPIO_FUNC_PWM);
// GP2(とGP3)のPWMスライスを取得
uint slice_num = pwm_gpio_to_slice_num(0);
// PWM周期を設定
pwm_set_clkdiv(slice_num, 3.90625);
pwm_set_wrap(slice_num, 32);
// チャンネルA(GP2)とチャンネルB(GP3)のPWMのHigh期間を設定
pwm_set_chan_level(slice_num, PWM_CHAN_A, 16);
pwm_set_chan_level(slice_num, PWM_CHAN_B, 8);
// PWM出力イネーブル
pwm_set_enabled(slice_num, true);
}
0 件のコメント:
コメントを投稿