Raspberry Pi PicoとMOSFET ⑥ PチャネルMOSFETをPicoからドライブ Ver2
PicoのPWM波形をGP2以外にGP3にも同じものを出力します。GP3の信号を用いてPチャネルのMOSFET 2SJ681を駆動します。
●PチャネルのMOSFET 2SJ681のおもなスペック
- ドレイン-ソース間電圧 -60V
- ゲート-ソース間電圧 ±20V
- ドレイン-ゲート間電圧 -60V
- ドレイン電流(DC) 5A
- ドレイン-ソース間オン抵抗 0.12Ω
- 許容損失(25℃) 20W
●プログラム
wrapだけで10kHzを得ました。GP2、GP3の両方ともデューティ10%です。
#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
// duty 10%
pwm_set_chan_level(slice_num, PWM_CHAN_A, (int)divCounter*0.1);
// duty 10%
pwm_set_chan_level(slice_num, PWM_CHAN_B, (int)divCounter*0.1);
pwm_set_wrap(slice_num2, 1249);
pwm_set_chan_level(slice_num2, PWM_CHAN_A, 256);
pwm_set_chan_level(slice_num2, PWM_CHAN_B, 256);
// Set the PWM running
//pwm_set_enabled(slice_num, true);
//pwm_set_enabled(slice_num2, true);
pwm_set_mask_enabled(0b00000110);
return 0;
}
●実行結果
GP3の出力;周波数は10kHzで、デューティ比は10%です。
ドレイン電圧(下の緑色)は7.36V、ゲート電圧(上の黄色)Vsは7.0Vです。
ゲート電圧Vsは7.0Vのまま、ドレイン電圧を8.2Vに上げました。波形がなまってきます。ドレイン電圧とゲート電圧の電圧差が大きくなると、もっとなまります。
ゲート電圧Vsは7.0Vのまま、ドレイン電圧を下げます。7.1Vで、電圧が浅くなっていきます。
前回のNチャネルのときと同じようにドレイン電圧を10.0Vにしたとき、スイッチングが正常になるゲート電圧Vsは9.92Vでした。
このように、PチャネルMOSFETは、ドレイン電圧とゲート電圧差が一定の範囲内でないとスイッチングしません。使いずらいですね。Nチャネルと同時に使うとき、条件が厳しくなります。
(2020/7/25)加筆。上記の波形では、Pch MOSFETをONさせるLow信号が入ったときに、ソースがONになるという現象をうまく撮影できていません。
波形の極性を反転させるプログラムを追加しました。
#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
// duty 10%
pwm_set_chan_level(slice_num, PWM_CHAN_A, (int)divCounter*0.1);
// duty 10%
pwm_set_chan_level(slice_num, PWM_CHAN_B, (int)divCounter*0.1);
pwm_set_output_polarity(slice_num, true, true); // A B
pwm_set_wrap(slice_num2, 1249);
pwm_set_chan_level(slice_num2, PWM_CHAN_A, 256);
pwm_set_chan_level(slice_num2, PWM_CHAN_B, 256);
// Set the PWM running
//pwm_set_enabled(slice_num, true);
//pwm_set_enabled(slice_num2, true);
pwm_set_mask_enabled(0b00000110);
return 0;
}
実行例です。ソースの電圧は10.1V、Vsは9.35Vです。上の黄色の波形がゲート、下の緑色がドレインの波形です。
●回路図
コラム 失敗例
●実行結果
GP3の出力;周波数は10kHzで、デューティ比は10%です。
ドレイン電圧(下の緑色)は7.9V、ゲート電圧(上の黄色)Vsは7.0Vです。
ゲート電圧Vsは7.0Vのまま、ドレイン電圧を8.2Vに上げました。波形がなまってきます。ドレイン電圧とゲート電圧の電圧差が大きくなると、もっとなまります。
ゲート電圧Vsは7.0Vのまま、ドレイン電圧を下げます。7.6Vで、電圧が浅くなっていきます。
前回のNチャネルのときと同じようにドレイン電圧を10.0Vにしたとき、スイッチングが正常になるゲート電圧Vsは9.16Vでした。
このように、PチャネルMOSFETは、ドレイン電圧とゲート電圧差が一定の範囲内でないとスイッチングしません。使いずらいですね。Nチャネルと同時に使うとき、条件が厳しくなります。
●回路図
ゲートに入れた100kがドレインではなくGNDにつながっています。