Minggu, 16 Agustus 2026

Cara men-drive mosfet dengan tegangan 3,3V dari STM32 atau sejenisnya

 





Untuk men-drive MOSFET dengan logika 3,3 V dari STM32, ESP32, atau Teensy, kuncinya adalah: jangan hanya melihat tulisan “VGS(th)” pada datasheet. Yang menentukan MOSFET benar-benar ON adalah spesifikasi RDS(on) pada VGS = 2,5 V atau 3,3 V.

1. Prinsip dasar

Untuk low-side switching:

+12 V
LOAD
D
┌───┴───┐
3.3 V ──┤ Gate │
│ MOSFET│
└───┬───┘
S
GND

MCU GND ────┘

Ketika GPIO = 3,3 V, MOSFET harus masuk kondisi ON dengan resistansi drain-source yang rendah.

2. Jangan tertipu VGS(th)

Misalnya datasheet mengatakan:

VGS(th) = 1–2 V

Bukan berarti MOSFET sudah cocok untuk GPIO 3,3 V.

VGS(th) hanya menunjukkan MOSFET mulai menghantarkan arus kecil, bukan sudah fully enhanced.

Yang harus dicari:

Parameter datasheetYang dicari
VGS(th)≤ 2 V
RDS(on) @ VGS = 4.5 Vbagus
RDS(on) @ VGS = 2.5 Vsangat penting untuk 3,3 V
RDS(on) @ VGS = 3.3 Videal
IDsesuai arus beban
VDSlebih tinggi dari tegangan beban

3. Contoh MOSFET yang lebih cocok

Untuk sistem STM32 3,3 V → beban 12 V, saya lebih menyukai MOSFET tipe logic-level 3,3 V, misalnya:

  • AO3400/AO3400A — beban kecil
  • IRLZ44N — mudah ditemukan, tetapi besar dan bukan pilihan paling efisien untuk desain modern
  • IRLB8721 — lebih cocok untuk arus besar
  • FQP30N06L — cukup populer untuk logic-level, tetapi tetap cek RDS(on) pada tegangan gate yang tersedia

IRF520 kurang ideal untuk GPIO 3,3 V.
IRF3205 juga bukan pilihan terbaik jika gate hanya diberi 3,3 V, walaupun MOSFET tersebut sangat bagus untuk kondisi gate yang lebih tinggi.


4. Rangkaian yang saya rekomendasikan

Untuk STM32 Nucleo G474RE → MOSFET → lampu 12 V/35 W:

+12 V
Lampu 12V/35W
D
┌────┴────┐
STM32 │ N-MOSFET│
GPIO ──100Ω──┤ G S├──── GND
└────┬────┘
GND

Tambahkan:

GPIO STM32
100Ω
├──────── Gate MOSFET
10kΩ
GND

Jadi:

  • 100 Ω → gate resistor
  • 10 kΩ → pull-down gate
  • GND STM32 dan GND supply 12 V → harus common ground

5. Mengapa perlu resistor 100 Ω?

Gate MOSFET sebenarnya bersifat kapasitif.

Saat GPIO berubah:

3.3 V ──► resistor ──► Gate

resistor sekitar 47–220 Ω membantu membatasi peak current dan mengurangi ringing/EMI.

Untuk eksperimen STM32:

100 Ω adalah nilai awal yang sangat baik.

6. Mengapa perlu pull-down 10 kΩ?

Ketika STM32 baru reset atau GPIO masih floating:

GPIO = Hi-Z

Gate MOSFET bisa mendapatkan tegangan tidak terduga.

Dengan:

Gate ──10kΩ── GND

MOSFET dipastikan:

GPIO HIGH → MOSFET ON
GPIO LOW → MOSFET OFF
GPIO Hi-Z → MOSFET OFF

7. Untuk beban Anda: lampu 12 V / 35 W

Arus nominal:

Jadi MOSFET harus mampu menangani sekitar 3 A, tetapi saya tidak akan memilih MOSFET yang spesifikasinya hanya pas 3 A.

Lebih aman memilih MOSFET dengan kemampuan arus ≥10 A dan RDS(on) rendah.

Misalnya jika:

maka:

Ini sangat rendah.

Tetapi jika MOSFET hanya half-on karena gate 3,3 V dan RDS(on) menjadi, misalnya, 0,2 Ω:

MOSFET mulai panas signifikan.

Inilah alasan pemilihan MOSFET berdasarkan RDS(on) pada VGS 2,5/3,3 V sangat penting.


8. Kalau MOSFET besar membutuhkan gate 10 V?

Ada dua solusi.

Solusi A — gunakan MOSFET logic-level

STM32 3.3 V
Logic-Level MOSFET
12 V Load

Ini solusi paling sederhana.

Solusi B — gunakan MOSFET driver

Jika ingin memakai MOSFET seperti IRF3205 untuk arus besar:

STM32
3.3 V
MOSFET DRIVER
│ 10–12 V gate
IRF3205
LOAD

Contoh konsep:

STM32 ──► Gate Driver ──► MOSFET
3.3V 10-12V │
Load

Driver gate memberikan arus charging/discharging gate yang jauh lebih besar dan tegangan gate yang sesuai.


9. Untuk PWM, ini menjadi lebih penting

Karena Anda menggunakan STM32G474RE dan kemungkinan mengendalikan heater dengan PWM, saya justru menyarankan:

STM32G474RE
│ PWM 3.3 V
100 Ω
Logic-Level MOSFET
12 V / 35 W heater

Untuk PWM frekuensi beberapa kHz, pastikan gate charge (Qg) MOSFET tidak terlalu besar. MOSFET dengan Qg besar membutuhkan arus gate lebih besar agar switching cepat.

Untuk aplikasi Fuzzy Supervisory PID temperatur inkubator, tidak perlu mengejar PWM sangat tinggi. Frekuensi sekitar 1–5 kHz biasanya sudah jauh lebih dari cukup untuk heater lampu, dan beban termal sendiri sangat lambat.

Kesimpulan

Untuk STM32 3,3 V → MOSFET → heater 12 V/35 W, konfigurasi yang saya rekomendasikan:

GPIO STM32 → 100 Ω → Gate MOSFET
Gate → 10 kΩ → GND
Source → GND
Drain → heater
heater → +12 V

Dan yang paling penting: pilih MOSFET yang datasheet-nya menjamin RDS(on) pada VGS 2,5 V atau 3,3 V, bukan hanya berdasarkan VGS(th).

Kalau Anda mau menggunakan IRF3205 yang sudah Anda punya, saya bisa hitungkan apakah GPIO STM32 3,3 V cukup untuk IRF3205, termasuk RDS(on), panas MOSFET, resistor gate, frekuensi PWM, dan apakah perlu gate driver.

ya mau

Ya. Untuk IRF3205 + STM32G474RE 3,3 V + heater 12 V/35 W, hasilnya cukup jelas:

Kesimpulan utama

Saya tidak merekomendasikan IRF3205 langsung dari GPIO STM32 3,3 V.

IRF3205 memang MOSFET arus besar, tetapi bukan MOSFET yang ideal untuk gate drive 3,3 V. Pada 3,3 V, IRF3205 belum dijamin memiliki RDS(on) rendah.

Untuk sistem Anda:

STM32G474RE
PWM 3.3 V
Gate Driver
10–12 V
IRF3205
12 V / 35 W Heater

Kenapa?

Heater Anda:

Jadi arus sekitar 2,9 A.

Kalau IRF3205 mendapatkan gate drive yang cukup tinggi, MOSFET dapat bekerja sangat baik. Tetapi jika hanya diberi 3,3 V, resistansi RDS(on) dapat jauh lebih tinggi daripada kondisi datasheet yang biasanya dispesifikasikan pada gate voltage yang lebih tinggi.

Akibatnya:

Semakin besar RDS(on), semakin besar panas MOSFET.


Rangkaian yang saya pilih untuk proyek inkubator Anda

+12 V
┌─────────┐
│ HEATER │
│ 35 W │
└────┬────┘
D
┌────┴────┐
│ IRF3205 │
│ │
STM32 ──► DRIVER ─► G │
│ │
└────┬────┘
S
GND
┌───────────┘
STM32 GND

Gate:

STM32 PWM
Gate Driver
├── 10–12 V
10Ω–22Ω
IRF3205 Gate
10kΩ
GND

Komponen yang saya sarankan

KomponenNilai
MOSFETIRF3205
Gate resistor10–22 Ω
Gate pull-down10 kΩ
Gate driver supply10–12 V
Heater12 V / 35 W
Arus heater≈2,92 A
PWMsekitar 1–5 kHz
MCUSTM32G474RE, 3,3 V

Tetapi ada pilihan yang lebih sederhana

Kalau Anda belum membeli gate driver, saya justru menyarankan mengganti IRF3205 dengan MOSFET logic-level yang benar-benar dispesifikasikan pada VGS 2,5/3,3 V.

Untuk proyek inkubator Anda, konfigurasi ini jauh lebih sederhana:

STM32 3.3 V
100Ω
Logic-Level MOSFET
Heater 12 V / 35 W

Tidak perlu gate driver, selama MOSFET yang dipilih memang memenuhi RDS(on) pada 3,3 V.

Kalau Anda ingin tetap memakai IRF3205 yang sudah ada, saya bisa lanjutkan dengan rangkaian gate driver IRF3205 yang konkret menggunakan transistor/BJT atau IC driver, lengkap dengan nilai resistor, wiring STM32G474RE, dan contoh PWM TIM1 STM32CubeIDE.

Sabtu, 15 Agustus 2026

Debug program STM32G474RE PWM TIM




Debugging pada STM32 bukan sekadar mencari error compile. Tujuannya adalah menjalankan program secara bertahap sambil melihat nilai variabel, register, peripheral, dan aliran eksekusi secara real-time.

Untuk kasus STM32G474RE + STM32CubeIDE + PWM TIM1, alurnya seperti ini:

1. Build program

Di STM32CubeIDE:

Project → Build Project

Periksa bagian Console.

  • 0 errors → program berhasil dikompilasi.
  • warning → belum tentu fatal.
  • error → program belum bisa di-debug.

2. Pastikan debugger ST-LINK

Nucleo-G474RE sudah memiliki ST-LINK onboard.

Hubungkan USB dari PC ke konektor ST-LINK USB pada board.

Kemudian:

Run → Debug As → STM32 Cortex-M C/C++ Application

CubeIDE akan masuk ke Debug Perspective.


3. Pasang Breakpoint

Breakpoint adalah titik tempat CPU berhenti sementara.

Misalnya program:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

while (1)

{

    HAL_Delay(100);

}

Pasang breakpoint pada:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

Caranya:

double-click nomor baris di sebelah kiri kode.

Akan muncul tanda breakpoint.

Ketika program berjalan dan mencapai baris tersebut, CPU berhenti.


4. Gunakan tombol utama Debug

Di toolbar Debug biasanya ada:

TombolFungsi
▶ ResumeMelanjutkan program
⏸ SuspendMenghentikan CPU
↪ Step IntoMasuk ke dalam fungsi
↷ Step OverMenjalankan satu baris
↩ Step ReturnKeluar dari fungsi
⏹ TerminateMenghentikan debugging

 Yang paling sering digunakan adalah:

Breakpoint → Resume → lihat nilai → Step Over

5. Contoh debugging PWM TIM1

Misalnya Anda ingin:

TIM1_CH1 → PA8 → PWM 1 kHz → duty cycle 50%

Konfigurasi:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

Kemudian:

__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500);

Jika:

ARR = 999

CCR1 = 500

maka secara sederhana:

6. Periksa variabel dengan Watch

Saat breakpoint aktif, buka:

Window → Show View → Expressions

Tambahkan:

htim1.Instance

htim1.Init.Prescaler

htim1.Init.Period

Untuk PWM, yang paling penting:

TIM1->PSC

TIM1->ARR

TIM1->CCR1

Misalnya hasil:

PSC  = 169
ARR  = 999
CCR1 = 500

berarti kita dapat memeriksa konfigurasi PWM langsung dari register hardware.


7. Debug register TIM1

Ini bagian yang sangat penting untuk STM32.

Jangan hanya melihat kode C. Periksa juga register peripheral.

Buka:

Window → Show View → SFRs

atau gunakan Live Expressions/Expressions.

Perhatikan:

TIM1->PSC
TIM1->ARR
TIM1->CCR1
TIM1->CR1
TIM1->CCMR1
TIM1->CCER
TIM1->BDTR

Contoh interpretasi:

RegisterYang diperiksa
PSCPrescaler
ARRPeriode PWM
CCR1Duty cycle CH1
CR1Counter configuration
CCMR1PWM mode
CCERChannel enable
BDTRMain Output Enable

8. Mengapa TIM1 berbeda dari timer biasa?

TIM1 adalah Advanced-Control Timer.

Ini penting.

Untuk PWM TIM1/TIM8 terdapat konsep Main Output Enable (MOE) melalui register:

TIM1_BDTR

Bit penting:

MOE = 1

Jika konfigurasi timer terlihat benar tetapi output PWM tidak muncul, BDTR/MOE perlu diperiksa.

Namun jika Anda menggunakan:

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

HAL biasanya menangani kebutuhan output utama tersebut untuk penggunaan PWM normal.


9. Debug GPIO PA8

TIM1_CH1 pada konfigurasi umum dapat menggunakan:

PA8

PA8 tidak boleh dikonfigurasi sebagai GPIO Output biasa jika ingin menghasilkan PWM hardware.

Harus menjadi:

PA8
AF1
TIM1_CH1

Di CubeMX:

Pinout → PA8 → TIM1_CH1

Kemudian GPIO akan dikonfigurasi sebagai Alternate Function.

Secara konsep:

TIM1

 │

 └── CH1

      │

      ▼

     PA8

      │

      ▼

    PWM OUT

10. Debug frekuensi PWM

Misalnya clock TIM1:

TIM1CLK = 170 MHz

Prescaler:

PSC = 169

Maka:


Jika:

ARR = 999

maka:



Jadi konfigurasi:

TIM1CLK = 170 MHz
PSC     = 169
ARR     = 999
CCR1    = 500

menghasilkan kira-kira:

PWM = 1 kHz
Duty = 50%

11. Jika PWM tidak keluar

Gunakan urutan debugging berikut:

PROGRAM │ ▼ HAL_TIM_PWM_Start() │ ▼ TIM1 berjalan? / \ NO YES │ │ ▼ ▼ cek clock cek CH1 │ ▼ PA8? / \ NO YES │ │ ▼ ▼ cek AF1 cek CCR1 │ ▼ cek CCER │ ▼ cek BDTR │ ▼ OSCILLOSCOPE

12. Debug dengan oscilloscope

Setelah software benar, ukur:

PA8 ───────── Oscilloscope CH1
GND ───────── Oscilloscope GND

Jika target:

Frequency = 1 kHz
Duty      = 50%

maka waveform kira-kira:

3.3V  ┌───────┐       ┌───────┐
      │       │       │       │
0V ───┘       └───────┘       └────
       0.5 ms   0.5 ms
       <------ 1 ms --------->

Catatan: level logika STM32G474RE umumnya 3.3 V; jangan menghubungkan output PA8 langsung ke beban yang membutuhkan tegangan lebih tinggi.


13. Debug program secara sistematis

Untuk program STM32 yang lebih kompleks, gunakan urutan:

Level 1 — Compile

Apakah program berhasil build?

Level 2 — Program execution

Apakah CPU masuk main()?

Level 3 — Peripheral initialization

Apakah MX_TIM1_Init() dijalankan?

Level 4 — Peripheral start

Apakah HAL_TIM_PWM_Start() dijalankan?

Level 5 — Register

PSC
ARR
CCR1
CCER
BDTR

Level 6 — Pin

PA8 = TIM1_CH1 / AF1

Level 7 — Hardware

Oscilloscope / Logic Analyzer

Ini jauh lebih efektif daripada langsung mengubah-ubah kode secara acak.

Untuk STM32G474RE Anda, pola debug yang paling saya sarankan:

STM32CubeIDE
      │
      ▼
Build
      │
      ▼
Debug
      │
      ▼
Breakpoint
      │
      ▼
main()
      │
      ▼
MX_TIM1_Init()
      │
      ▼
HAL_TIM_PWM_Start()
      │
      ▼
Check TIM1 Registers
      │
      ▼
Check PA8 / AF1
      │
      ▼
Oscilloscope

Intinya: debugging STM32 yang benar dilakukan dari software → peripheral → register → GPIO → sinyal fisik. Untuk kasus PWM TIM1, jangan berhenti pada “program tidak error”; pastikan TIM1 benar-benar running dan PA8 benar-benar mengeluarkan waveform PWM.


ADS Article