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;
}