Pelajaran Teach
STM32 Mbed CodeIDE (6/8): PWM kecerahan dan kawalan RGB
Pelajar menggunakan Mbed PwmOut untuk mengawal tahap kecerahan LED dan warna RGB, kemudian merekodkan cara kitaran tugas mengubah output papan sebenar.
Kali pertama menggunakan LabsLand? Cipta akaun guru anda
Hasil pembelajaran
Gunakan Mbed
PwmOutuntuk mengawal kecerahan output.Hubungkaitkan kitaran tugas dengan kecerahan yang boleh dilihat atau keseimbangan warna.
Gunakan input analog untuk mengawal output PWM.
Pratonton aktiviti pelajar
Kandungan aktiviti
Pratonton sahaja. Dalam sesi kelas, pelajar boleh mengisi jawapan dan menyerahkan hasil kerja mereka kepada guru.
Kitaran tugas
8 min
Banyak peranti memerlukan tahap antara mati dan hidup: lampu boleh dimalapkan, penunjuk warna, motor, buzzer dan output lain yang sepatutnya boleh dilaraskan. Dalam pelajaran ini, PWM membolehkan anda mengawal kecerahan dan keamatan warna, kemudian menyambungkan output yang boleh dilihat itu kepada kawalan analog langsung.
Mbed menggunakan PwmOut untuk PWM pin:
PwmOut red(PA_8);
red.period_ms(2);
red.write(0.25f);
PwmOut red(PA_8) mencipta objek output PWM Mbed. period_ms(2) menetapkan tempoh corak denyutan berulang, manakala write(0.25f) menetapkan bahagian setiap kitaran yang hidup. Dengan menggunakan tempoh yang sama bagi saluran merah, hijau dan biru, ketiga-tiganya berfungsi sebagai satu output warna RGB yang diselaraskan.
write() mengambil kitaran tugas dari 0.0 hingga 1.0:
- 0.0f: sentiasa dimatikan
- 0.25f: hidup selama 25 peratus daripada setiap kitaran
- 1.0f: sentiasa hidup
Pelajaran ini menggunakan pin RGB PWM PA_8, PA_9 dan PA_10.
Ia juga menggunakan PC_0 sebagai pin kawalan analog pada separuh kedua pelajaran. Dalam UI makmal, PC_0 ialah peluncur Pot. pot1. Ini berbeza daripada pelajaran 5, yang menggunakan PC_1 / Pot. pot2.
Daripada Pot. pot1 kepada saluran RGB PWM
Laluan hanya menggunakan Pot. pot1 pada PC_0 dan tiga output RGB. Gambar rajah
menunjukkan antara muka; TODO anda masih menentukan nilai kitaran tugas sebenar yang akan ditulis.
Manakah yang sepatutnya kelihatan lebih cerah pada saluran LED yang sama: kitaran tugas 0.20 atau kitaran tugas 0.80? Terangkan dalam satu ayat.
Uji tahap RGB tetap
22 min
Buka makmal STM32 Mbed CodeIDE.
Buka
main.cpp.Gantikan fail dengan program di bawah.
Simpan, kompil dan muat naik.
Tonton konsol dan kamera bersama-sama.
Perhatikan tiga keadaan kecerahan/warna.
Catat perkara yang berubah antara merah rendah, warna campuran dan biru tinggi.
#include "mbed.h"
PwmOut red(PA_8);
PwmOut green(PA_9);
PwmOut blue(PA_10);
void set_rgb(float r, float g, float b) {
red.write(r);
green.write(g);
blue.write(b);
}
int main() {
red.period_ms(2);
green.period_ms(2);
blue.period_ms(2);
printf("PWM RGB fixed levels start\n");
while (true) {
set_rgb(0.20f, 0.00f, 0.00f);
printf("state=low_red r=20 g=0 b=0\n");
ThisThread::sleep_for(2000ms);
set_rgb(0.20f, 0.50f, 0.10f);
printf("state=mixed r=20 g=50 b=10\n");
ThisThread::sleep_for(2000ms);
set_rgb(0.00f, 0.00f, 0.80f);
printf("state=high_blue r=0 g=0 b=80\n");
ThisThread::sleep_for(2000ms);
}
}
Isi tiga baris, satu setiap keadaan RGB yang dicetak. Peratusan bercetak bermaksud tiga peratusan kitaran tugas yang ditunjukkan selepas r=, g= dan b=; Output yang diperhatikan ialah warna/kecerahan kamera. Jadual mungkin memaparkan baris tambahan: biarkan baris yang tidak digunakan kosong sepenuhnya. Jika warna halus, pilih sebahagiannya atau tidak daripada meneka.
Jadual bukti tetapan RGB
Lengkapkan tiga keadaan bercetak. Biarkan baris tambahan yang tidak digunakan kosong.
| Keadaan bercetak | Bercetak merah % | Hijau bercetak % | Biru bercetak % | Output diperhatikan | Jangkaan sepadan? |
|---|---|---|---|---|---|
Gunakan potensiometer sebagai kawalan kecerahan
22 min
Sekarang gabungkan input analog dan output PWM. Potensiometer mengawal kitaran tugas saluran merah. Peratusan bersiri ialah bukti terkuat jika pendedahan kamera menyukarkan perbezaan kecerahan yang kecil.
Gantikan
main.cppdengan program di bawah.Lengkapkan TODO 1 supaya
dutymemetakan bacaan analog 0.0-1.0 kepada julat 0.0-1.0 PWM yang sama.Lengkapkan TODO 2 supaya nilai yang dipetakan ditulis pada saluran merah.
Simpan, kompil dan muat naik. Ini ialah kitaran 2 daripada 2 yang dirancang.
Gerakkan peluncur
Pot. pot1perlahan-lahan.Catatkan bacaan rendah, pertengahan dan tinggi dengan output yang boleh dilihat.
#include "mbed.h"
AnalogIn pot(PC_0);
PwmOut red(PA_8);
PwmOut green(PA_9);
PwmOut blue(PA_10);
int main() {
red.period_ms(2);
green.period_ms(2);
blue.period_ms(2);
green.write(0.0f);
blue.write(0.0f);
printf("Potentiometer controlled PWM start\n");
while (true) {
float reading = pot.read();
// TODO 1: gantikan 0.0f dengan pemetaan analog-ke-tugas.
float duty = 0.0f;
int percent = (int)(duty * 100.0f);
// TODO 2: gantikan 0.0f dengan pembolehubah tugas yang dipetakan.
red.write(0.0f);
printf("red_percent=%d\n", percent);
ThisThread::sleep_for(500ms);
}
}
Isikan tepat tiga kes yang diperlukan: kedudukan potensiometer rendah, tengah dan tinggi. Peratus bersiri ialah integer selepas red_percent= dan mempunyai unit %; Kecerahan yang diperhatikan ialah penilaian umum melalui kamera, bukan ukuran angka; Keterlihatan merekodkan sama ada bukti kamera jelas. Biarkan mana-mana baris tambahan yang tidak digunakan kosong sepenuhnya.
Jadual bukti PWM potensiometer
Lengkapkan baris rendah, tengah dan tinggi selepas program TODO dijalankan. Biarkan baris tambahan yang tidak digunakan kosong.
| Kedudukan potensiometer | Peratus bersiri % | Kecerahan diperhatikan | Keterlihatan kamera |
|---|---|---|---|
Bandingkan baris rendah, tengah dan tinggi anda. Nyatakan tiga peratusan yang dicetak mengikut tertib dan sama ada kecerahan merah yang kelihatan mengikuti aliran rendah ke tinggi yang sama.
Serahkan kod anda
8 min
Lampirkan main.cpp akhir anda yang disimpan
Klik Semak fail yang disimpan, sahkan bahawa main.cpp mengandungi versi PWM yang dikawal potensiometer, kemudian klik Lampirkan kod yang disimpan. Selepas kod dilampirkan, klik Serah serahan di bahagian bawah aktiviti.