TOPに戻る

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につながっています。

連載 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