TOPに戻る

Raspberry Pi PicoとMOSFET ⑧ P/NチャネルMOSFETをPicoからドライブ<その2>

 前回、デッド・タイムをうまく確保できませんでした。

 プログラムを修正して、GP2、GP3、GP4、GP5の各端子の波形を見ます。オシロスコープが2チャネルなので、GP2の立ち上がり位置を基準に並べています。デューティ比は20%です。

float duty_factor = 0.2;
float dead_time = 0.6;

 GP2を反転したのがGP3です。

 GP5とGP4は、デッド・タイムを確保した波形です。

 INaにGP3、INbにGP4をつなぎます。

 ドレイン出力を見ています。黄色がPチャネルMOSFET(ハイサイド)で、下の緑色がNチャネルMOSFET(ローサイド)です。PチャネルがONになる前後にNチャネルMOSFETは完全にOFF(High)になっているので、貫通電流は流れないと思われます。

 INaにGP5、INbにGP2をつなぎます。

 黄色がPチャネルMOSFET(ハイサイド)で、下の緑色がNチャネルMOSFET(ローサイド)です。NチャネルがON(Low)になる前後にPチャネルMOSFETは完全にOFFになっているので、貫通電流が流れないと思われます。

 デューティ比を20%から50%に変更しました。

 デッド・タイムは十分とれています。

 デューティ比を50%から90%に変更しました。dead_timeを0.6->0.8に少なくしました。

float duty_factor = 0.9;
float dead_time = 0.8;

 デッド・タイムは十分とれています。

プログラム

 上記の条件時のプログラムです。


#include "pico/stdlib.h"
#include <stdio.h>
#include "hardware/pwm.h"

int main() {
    stdio_init_all();
    printf("\nHello, PWM GP2/3,GP4/5\n");

    gpio_set_function(2, GPIO_FUNC_PWM);
    gpio_set_function(3, GPIO_FUNC_PWM);
    gpio_set_function(4, GPIO_FUNC_PWM);
    gpio_set_function(5, GPIO_FUNC_PWM);

    uint slice_num  = pwm_gpio_to_slice_num(2);
    uint slice_num2 = pwm_gpio_to_slice_num(4);

    uint16_t divCounter = 12500; // max 2^16 = 65536
    pwm_set_wrap(slice_num, divCounter-1);  // 10kHz
    pwm_set_wrap(slice_num2, divCounter-1);  // 10kHz
    uint8_t div = 10;
    uint8_t fract = 0;
    pwm_set_clkdiv_int_frac(slice_num, div, fract); // 1kHz
    pwm_set_clkdiv_int_frac(slice_num2, div, fract); // 1kHz
    // duty 
    float duty_factor = 0.9;
    float dead_time   = 0.8;
    // GP2
    pwm_set_chan_level(slice_num, PWM_CHAN_A, (int)divCounter * duty_factor);
    // GP3
    pwm_set_chan_level(slice_num, PWM_CHAN_B, (int)divCounter * duty_factor);
    // GP4
    pwm_set_chan_level(slice_num2, PWM_CHAN_A, (int)divCounter * duty_factor * dead_time);
    // GP5
    pwm_set_chan_level(slice_num2, PWM_CHAN_B, (int)divCounter * duty_factor * dead_time);
    // phase
    pwm_set_output_polarity(slice_num, false, true);  // A B
    pwm_set_output_polarity(slice_num2, true, false);  // A B

    // Set the PWM running
    pwm_set_enabled(slice_num, true);
    sleep_us(0.1);
    pwm_set_enabled(slice_num2, true);
    return 0;
}

連載 Raspberry Pi PicoとMOSFET

(1) MOSFETの特徴

(2) MOSFETを発振器でドライブ

(3) PWMのAPI

(4) PWM 分周

(5) NチャネルMOSFETをPicoからドライブ

(6) PチャネルMOSFETをPicoからドライブ

(7) P/NチャネルMOSFETをPicoからドライブ<その1>

(8) P/NチャネルMOSFETをPicoからドライブ<その2>


連載 Raspberry Pi Picoでプログラミング

(1) ラズパイ4の準備(1) USBブートの設定

(2) ラズパイ4の準備(2) 標準入出力の用意

(3) ラズパイ4の準備(3) LチカとHello, world!の実行

(4) ラズパイ4の準備(4) リモート環境の設定

(5) プログラミングの環境整備とLチカ

(6) Hello, World!

(7) 使用するピンと機能

(8) クロックの値の表示

(9) i2cscanner

(10) i2c APIと気圧センサLPS25

(11) i2c 温度センサTMP117

(12) i2c 湿度センサAHT20

(13) spi APIとA-DコンバータMCP3008

(14) spi A-DコンバータMCP3208

(15) gpioファンクション

(16) gpio スイッチを押すとLEDが点灯する STEP2

(17) gpioファンクション MASK