2023年6月1日木曜日

Pico PWMテスト(Arduino IDE)

 
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 件のコメント:

コメントを投稿

Raspberry Pi Donkey Car スマートカー

  2020年に製作したDonkey Car スマートカー について記事にしました。 Donkey CarはRaspberry Pi のカメラからコースを ディープラーニングさせ自動走行を行います。(動画は白線上を自動走行)   動画