Pelajaran Teach
STM32 Mbed CodeIDE (5/8): amaran voltan analog
Pelajar membaca potensiometer dengan Mbed AnalogIn, menukar nilai kepada amaran voltan dan mengesahkan kelakuan ambang pada papan sebenar.
Kali pertama menggunakan LabsLand? Cipta akaun guru anda
Hasil pembelajaran
Baca input analog dengan Mbed
AnalogIn.Tukar bacaan biasa kepada milivolt anggaran.
Bina amaran ambang menggunakan LED dan bukti bersiri.
Pratonton aktiviti pelajar
Kandungan aktiviti
Pratonton sahaja. Dalam sesi kelas, pelajar boleh mengisi jawapan dan menyerahkan hasil kerja mereka kepada guru.
Daripada nilai analog kepada keputusan
9 min
Banyak pengawal sebenar melihat nilai yang berubah secara beransur-ansur, seperti voltan bateri, aras penderia atau tombol pelarasan, dan kemudian memutuskan apabila nilai itu telah melepasi ambang amaran. Potensiometer memberikan nilai analog yang boleh diubah dengan selamat untuk mempraktikkan corak itu.
Pelajaran ini menggunakan PC_1, salah satu pin input analog dalam panduan STM32 Mbed CodeIDE. Dalam UI makmal jauh, ini ialah peluncur Pot. pot2. Gerakkan peluncur itu perlahan-lahan dan lihat perubahan nilai konsol.
Senarai semak pin untuk pelajaran ini:
- Input analog: Pot. pot2 -> PC_1
- Hijau LED 1: PB_13
- Hijau LED 2: PB_14
- Hijau LED 3: PB_15
Bagaimana satu bacaan analog menjadi amaran
Mbed kod:
AnalogIn pot(PC_1);
float reading = pot.read();
int millivolts = (int)(reading * 3300.0f);
AnalogIn pot(PC_1) mencipta objek input Mbed untuk voltan yang diukur, sama seperti cara DigitalOut mencipta objek output untuk LED. pot.read() mengambil satu sampel dan mengembalikan nilai normal daripada kira-kira 0.0 hingga 1.0. Mendarab dengan 3300.0f menukarkan pecahan itu kepada milivolt anggaran untuk julat input 3.3 V. Program ini mencetak milivolt integer, bukan teks titik terapung.
Ambang anggaran:
- di bawah 1000 mV: rendah
- 1000-1999 mV: sederhana
- 2000-2999 mV: tinggi
- 3000 mV dan ke atas: simulasi amaran voltan lampau/skala penuh, ditunjukkan dengan berkelip pada ketiga-tiga LED hijau
Keadaan rendah masih menghidupkan satu LED hijau. Dalam pelajaran ini, ini bermaksud "tahap amaran LOW", bukan "tiada output."
Jangkaan tingkah laku amaran:
- < 1000 mV: tahap bercetak LOW; satu LED hijau dihidupkan.
- 1000-1999 mV: tahap bercetak MEDIUM; dua LED hijau menyala.
- 2000-2999 mV: tahap bercetak HIGH; tiga LED hijau menyala.
- >= 3000 mV: tahap bercetak OVERVOLTAGE; ketiga-tiga LED hijau berkelip hidup dan mati bersama-sama.
Fungsi pembantu set_led() menulis 0 untuk hidup dan 1 untuk mati kerana output LED hijau ini aktif-rendah dalam contoh makmal.
Jika konsol bersiri mencetak millivolts=2450, bacaan itu berada dalam julat ambang yang mana, dan tahap amaran apakah yang patut ditunjukkan oleh atur cara?
Jalankan monitor amaran
30 min
Buka makmal STM32 Mbed CodeIDE.
Buka
main.cpp.Gantikan fail dengan program di bawah.
Lengkapkan TODO 1, TODO 2 dan TODO 3 dengan tiga nilai sempadan yang dinyatakan di atas. Jangan tukar mana-mana garisan permulaan yang lain lagi.
Simpan, kompil dan muat naik. Ini ialah kitaran 1 daripada 2 yang dirancang.
Gerakkan peluncur
Pot. pot2perlahan-lahan melalui kedudukan rendah, tengah dan tinggi.Catat sekurang-kurangnya empat bacaan bersiri dan keadaan LED.
Jika ambang sukar dicapai, rekod nilai yang paling hampir dan terangkan.
#include "mbed.h"
AnalogIn pot(PC_1);
DigitalOut led1(PB_13, 1);
DigitalOut led2(PB_14, 1);
DigitalOut led3(PB_15, 1);
// TODO 1: gantikan 0 dengan sempadan LOW/MEDIUM dalam mV.
constexpr int low_medium_boundary_mv = 0;
// TODO 2: gantikan 0 dengan sempadan MEDIUM/HIGH dalam mV.
constexpr int medium_high_boundary_mv = 0;
// TODO 3: gantikan 0 dengan sempadan HIGH/OVERVOLTAGE dalam mV.
constexpr int overvoltage_boundary_mv = 0;
void set_led(DigitalOut &led, bool on) {
led = on ? 0 : 1;
}
void set_leds(int count) {
set_led(led1, count >= 1);
set_led(led2, count >= 2);
set_led(led3, count >= 3);
}
int main() {
printf("Analog voltage warning start\n");
bool overvoltage_flash = false;
while (true) {
float reading = pot.read();
int millivolts = (int)(reading * 3300.0f);
if (millivolts < low_medium_boundary_mv) {
overvoltage_flash = false;
set_leds(1);
printf("millivolts=%d level=LOW\n", millivolts);
} else if (millivolts < medium_high_boundary_mv) {
overvoltage_flash = false;
set_leds(2);
printf("millivolts=%d level=MEDIUM\n", millivolts);
} else if (millivolts < overvoltage_boundary_mv) {
overvoltage_flash = false;
set_leds(3);
printf("millivolts=%d level=HIGH\n", millivolts);
} else {
overvoltage_flash = !overvoltage_flash;
set_leds(overvoltage_flash ? 3 : 0);
printf("millivolts=%d level=OVERVOLTAGE flash=%d\n",
millivolts,
overvoltage_flash);
}
ThisThread::sleep_for(1000ms);
}
}
Program di atas ialah satu fail main.cpp berterusan. Jika paparan PDF anda membahagikan blok kod pada dua halaman, teruskan menyalin dengan baris seterusnya pada halaman berikut.
Isi sekurang-kurangnya empat baris jadual semasa anda menggerakkan potensiometer. Gunakan kedudukan yang berbeza apabila boleh: nilai rendah, sederhana, tinggi dan tertinggi yang boleh anda capai. Kes ujian mengenal pasti julat yang dimaksudkan; Milivolt bersiri ialah bacaan konsol integer dalam mV; Tahap bercetak ialah label konsol yang tepat; dan Keadaan LED yang diperhatikan ialah yang ditunjukkan oleh kamera. Pilih sama ada hasil sepadan dengan jangkaan daripada pilihan yang disenaraikan. Jadual mungkin menunjukkan baris tambahan: biarkan setiap baris yang tidak digunakan kosong sepenuhnya.
Salin nilai daripada konsol semasa anda sendiri. Baris yang sah bermula dengan
millivolts= dan termasuk tahap yang dipilih oleh kod ambang lengkap anda.
Untuk level=OVERVOLTAGE, amati sekurang-kurangnya dua saat sebelum mengisi baris. flash=1 bermakna ketiga-tiga LED hijau dihidupkan untuk sampel itu; flash=0 bermakna ketiga-tiganya dimatikan untuk sampel itu. Rakam keseluruhan tingkah laku sebagai "ketiga-tiga berkelip", bukan sebagai satu imej pegun.
Jadual bukti amaran voltan
Lengkapkan empat baris untuk julat yang berbeza. Biarkan baris tambahan yang tidak digunakan kosong.
| Kes ujian | Milivolt bersiri mV | Tahap bercetak | Keadaan LED diperhatikan | Ambang sepadan? |
|---|---|---|---|---|
Pilih satu baris daripada jadual anda. Petik nilai milivolt bersiri, namakan julat ambang yang dimilikinya dan terangkan sama ada keadaan LED sepadan dengan julat tersebut.
Menala kelakuan amaran
13 min
Pilih sendiri satu daripada tiga pemalar sempadan yang dinamakan dan ubah nilainya tepat +200 mV atau -200 mV. Pastikan sempadan kekal dalam susunan menaik supaya setiap julat amaran masih boleh dicapai. Jangan salin pilihan rakan sekelas: pilih sempadan dan arah yang sesuai dengan tingkah laku amaran yang anda inginkan.
Sebelum mengedit, nyatakan nama pemalar, nilai asalnya, sama ada anda akan menambah atau menolak 200 mV, dan nilai yang terhasil.
Edit pemalar itu sahaja, kemudian simpan, kompil dan muat naik. Ini ialah kitaran 2 daripada 2 yang dirancang. Uji dua kedudukan di sekitar sempadan baharu: bacaan terdekat di bawahnya dan bacaan terdekat yang sama dengan atau melebihinya. Salin kedua-dua baris bersiri dengan lengkap. Bacaan yang sama dengan sempadan memasuki cabang yang lebih tinggi kerana kod menggunakan <. Jika peluncur melangkaui nilai yang tepat, gunakan bacaan paling hampir pada setiap sisi dan nyatakan perkara itu.
Tampalkan dua baris bersiri berhampiran sempadan. Labelkan satu sebagai di bawah dan satu lagi sebagai sama dengan atau melebihi, kemudian nyatakan cabang yang dicetak bagi setiap baris.
Serahkan kod anda
8 min
Lampirkan main.cpp akhir anda yang disimpan
Klik Semak fail yang disimpan, sahkan bahawa main.cpp mengandungi versi ambang yang ditala anda, kemudian klik Lampirkan kod yang disimpan. Selepas kod dilampirkan, klik Serah serahan di bahagian bawah aktiviti.