Setitik embun pagi, terusan catatan waktu blogku di wordpress ditutup
SCIENCE is about KNOWING, ENGINEERING is about DOING
Selasa, 18 Agustus 2026
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│GNDMCU 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 datasheet | Yang dicari |
|---|---|
| VGS(th) | ≤ 2 V |
| RDS(on) @ VGS = 4.5 V | bagus |
| RDS(on) @ VGS = 2.5 V | sangat penting untuk 3,3 V |
| RDS(on) @ VGS = 3.3 V | ideal |
| ID | sesuai arus beban |
| VDS | lebih 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 ONGPIO LOW → MOSFET OFFGPIO Hi-Z → MOSFET OFF
7. Untuk beban Anda: lampu 12 V / 35 W
Arus nominal:
I=VP I=1235=2.92AJadi 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:
RDS(on)=0.02Ωmaka:
PMOSFET=I2R P=(2.92)2(0.02) P≈0.17WIni sangat rendah.
Tetapi jika MOSFET hanya half-on karena gate 3,3 V dan RDS(on) menjadi, misalnya, 0,2 Ω:
P=(2.92)2(0.2) P≈1.7WMOSFET 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:
STM323.3 V│▼MOSFET DRIVER││ 10–12 V gate▼IRF3205│▼LOAD
Contoh konsep:
STM32 ──► Gate Driver ──► MOSFET3.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. 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:
STM32G474REPWM 3.3 V│▼Gate Driver│10–12 V│▼IRF3205│▼12 V / 35 W Heater
Kenapa?
Heater Anda:
I=1235=2.92AJadi 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:
PMOSFET=I2RDS(on)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
| Komponen | Nilai |
|---|---|
| MOSFET | IRF3205 |
| Gate resistor | 10–22 Ω |
| Gate pull-down | 10 kΩ |
| Gate driver supply | 10–12 V |
| Heater | 12 V / 35 W |
| Arus heater | ≈2,92 A |
| PWM | sekitar 1–5 kHz |
| MCU | STM32G474RE, 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:
| Tombol | Fungsi |
|---|---|
| ▶ Resume | Melanjutkan program |
| ⏸ Suspend | Menghentikan CPU |
| ↪ Step Into | Masuk ke dalam fungsi |
| ↷ Step Over | Menjalankan satu baris |
| ↩ Step Return | Keluar dari fungsi |
| ⏹ Terminate | Menghentikan 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:
| Register | Yang diperiksa |
|---|---|
| PSC | Prescaler |
| ARR | Periode PWM |
| CCR1 | Duty cycle CH1 |
| CR1 | Counter configuration |
| CCMR1 | PWM mode |
| CCER | Channel enable |
| BDTR | Main 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.


