Teach ikasgaia
STM32 Mbed CodeIDE (5/8): tentsio analogikoaren araberako abisua
Irakurri potentziometroa Mbed-en AnalogIn erabiliz, bihurtu irakurketa tentsioaren araberako abisu eta egiaztatu atalaseak benetako plakan.
Hasi saioa irakasle-kontu batekin klase-saioa prestatzeko. Ikasleak klase-kode batekin sartzen dira.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua
Ikaskuntza-emaitzak
Sarrera analogikoa irakurtzea Mbed-en
AnalogInerabiliz.Irakurketa normalizatua gutxi gorabeherako milivolt bihurtzea.
Atalaseen araberako abisua programatzea, eta LEDen eta serieko mezuen bidez egiaztatzea.
Ikaslearen jardueraren aurrebista
Jardueraren edukia
Aurrebista soilik. Klase-saio batean, ikasleek erantzunak bete eta lana irakasleari bidal diezaiokete.
Balio analogikotik erabakira
9 min
STM32 Mbed CodeIDE ikastaroa · 8 saiotatik 5.a. Benetako kontrolagailu askok pixkanaka aldatzen diren balioak zaintzen dituzte —bateriaren tentsioa, sentsore baten seinalea edo doikuntza-agintea—, eta abisu-atalase bat noiz gainditzen den erabakitzen dute. Potentziometroarekin jokaera hori praktikatuko duzu, laborategiko ohiko kontrola erabiliz. «Gaintentsioa» jarduera honetako abisu simulatua da, ez plakari tentsio arriskutsurik aplikatzeko eskaera.
Aurreikusi laborategiko 43 minutu inguru eta bi konpilazio/karga, hasierako proba eta ondorengo aldaketa barne. Ilaran, prestatu aurreikuspena, hasierako hiru mugak eta zure 200 mV-ko aldaketa. Hirugarren konpilazioa errore bat zuzentzeko soilik erabili.
Ikasgaiak PC_1 sarrera analogikoa erabiltzen du. Urruneko interfazean Pot. pot2 graduatzailea da. Mugitu poliki, eta behatu kontsolako balioa nola aldatzen den.
Ikasgai honetako pinak:
- Sarrera analogikoa:
Pot. pot2→PC_1. - 1. LED berdea:
PB_13. - 2. LED berdea:
PB_14. - 3. LED berdea:
PB_15.
Irakurketa analogikoa abisu bihurtzeko urratsak
Potentziometroaren irakurketa eskalatu, mugekin alderatu eta dagokion LED patroia ezartzen da.
Mbed kodea:
AnalogIn pot(PC_1);
float reading = pot.read();
int millivolts = (int)(reading * 3300.0f);
AnalogIn pot(PC_1) adierazpenak tentsioa irakurtzeko objektua sortzen du. pot.read() deitzean lagin bat hartzen da, eta 0,0–1,0 tartera normalizatutako balioa lortzen da. 3300.0f balioaz biderkatzeak gutxi gorabeherako milivoltak ematen ditu, 3,3 V-ko erreferentzia hartuta. (int) bihurketak zati hamartarra kentzen du; ez du ohiko biribiltzerik egiten. Programak zenbaki osoak inprimatzen ditu. Estimazioa da, ez voltmetro kalibratu baten neurketa.
Hasierako atalaseak:
- 1000 mV-tik behera: maila baxua.
- 1000–1999 mV: tarteko maila.
- 2000–2999 mV: maila altua.
- 3000 mV edo gehiago: gaintentsioaren abisu simulatua; hiru LED berdeak batera pizten eta itzaltzen dira.
Maila baxuan ere LED berde bat pizten da: abisu-maila baxua adierazten du. Kontsolan, millivolts kalkulatutako milivoltak dira; level, hautatutako maila; eta flash, LEDak une horretan piztuta ala itzalita ezarri diren adierazten duen balioa. Kopiatu etiketak agertu bezala eta azaldu haien esanahia euskaraz.
Espero den portaera:
< 1000 mV:LOW(baxua); LED berde bat piztuta.1000–1999 mV:MEDIUM(tartekoa); bi LED berde piztuta.2000–2999 mV:HIGH(altua); hiru LED berde piztuta.>= 3000 mV:OVERVOLTAGE(gaintentsioaren abisu simulatua); hiru LEDak batera piztu eta itzaltzen dira.
set_led() laguntzaileak 0 idazten du pizteko eta 1 itzaltzeko, LED berde hauek maila baxuan aktibatzen direlako.
Kontsolak millivolts=2450 inprimatzen badu, zein tartetan dago balioa eta zein abisu-maila erakutsi beharko luke programak?
Exekutatu abisu-programa
30 min
Ireki STM32 Mbed CodeIDE laborategia jarduera honetatik.
Ireki
main.cpp.Ordeztu fitxategia hurrengo programarekin.
Bete TODO 1, TODO 2 eta TODO 3 goian adierazitako hiru mugekin. Ez aldatu oraindik beste lerrorik.
Gorde, konpilatu eta kargatu. Aurreikusitako bi konpilazioetatik lehena da.
Mugitu poliki
Pot. pot2graduatzailea posizio baxu, ertain eta altuetara.Jaso gutxienez lau serie-irakurketa eta dagozkien LED egoerak.
Atalase batera iristea zaila bada, jaso lortutako baliorik hurbilena eta azaldu muga hori.
Klase-saio batean erabilgarri
#include "mbed.h"
AnalogIn pot(PC_1);
DigitalOut led1(PB_13, 1);
DigitalOut led2(PB_14, 1);
DigitalOut led3(PB_15, 1);
// TODO 1: ordeztu 0 LOW/MEDIUM mugarekin, mV-tan.
constexpr int low_medium_boundary_mv = 0;
// TODO 2: ordeztu 0 MEDIUM/HIGH mugarekin, mV-tan.
constexpr int medium_high_boundary_mv = 0;
// TODO 3: ordeztu 0 HIGH/OVERVOLTAGE mugarekin, mV-tan.
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);
}
}
Aurreko programa main.cpp fitxategi bakarrean doa. PDF ikuspegiak kodea bi orritan banatzen badu, jarraitu kopiatzen hurrengo orrialdeko lehen lerrotik.
Bete gutxienez lau errenkada, potentziometroa mugitzen duzun bitartean. Proba-kasua bilatzen duzun tartea da; Serieko milivoltak, kontsolako zenbaki osoa mV-tan; Inprimatutako maila, etiketa zehatza; eta Behatutako LED egoera, kameran ikusitakoa. Hautatu bat-etortzeari dagokion aukera. Utzi erabat hutsik erabiltzen ez dituzun errenkada gehigarriak. Kopiatu zure uneko kontsolako balioak: lerroa millivolts= etiketarekin hasten da eta osatutako programak hautatutako maila jasotzen du. Analog voltage warning start mezuak programa hasi dela adierazten du.
level=OVERVOLTAGE egoeran, behatu gutxienez bi segundo errenkada bete aurretik. flash=1 bada, hiru LEDak piztuta ezarri dira lagin horretan; flash=0 bada, itzalita. Deskribatu portaera orokorra («hirurak keinuka ari dira»), ez irudi finko bakarra. Kamera atzeratuta badabil, behatu luzaroago. Egoera segundoan behin aldatzen da gutxi gorabehera; piztu-itzali ziklo osoa bi segundo ingurukoa da.
Tentsio-abisuaren ebidentzien taula
Bete lau proba-kasuen errenkadak. Mailaren batera iritsi ezin bazara, jaso lortutako baliorik hurbilena eta azaldu. Utzi hutsik erabiltzen ez dituzun errenkada gehigarriak.
| Proba-kasua | Serieko milivoltak mV | Inprimatutako maila | Behatutako LED egoera | Bat etorri da atalasearekin? |
|---|---|---|---|---|
Aukeratu taulako errenkada bat. Aipatu serieko balioa milivoltetan, adierazi zein atalase-tartetan dagoen eta azaldu LED egoera tarte horri dagokionarekin bat etorri den.
Doitu abisuaren portaera
13 min
Aukeratu zeure kabuz hiru muga-konstanteetako bat, eta aldatu zehazki +200 mV edo −200 mV. Mantendu mugak txikienetik handienera ordenatuta, tarteak bereizita gera daitezen. Tarte horietara irits daitekeen ere egiaztatu beharko duzu benetako irakurketekin. Hautatu muga eta aldaketaren noranzkoa doitu nahi duzun abisuaren arabera.
Editatu aurretik, adierazi konstantearen izena, jatorrizko balioa, 200 mV gehitu edo kenduko dituzun eta emaitzako balioa.
Editatu konstante hori bakarrik; gorde, konpilatu eta kargatu. Aurreikusitako bigarren konpilazioa da. Probatu muga berriaren bi aldeetako posizioak: azpitik lor dezakezun irakurketarik hurbilena, eta mugaren berdina edo handiagoa den hurbilena. Kopiatu bi serie-lerro osoak. Mugaren berdina den balioa goiko tarteari dagokio, kodeak < erabiltzen duelako. Graduatzaileak balio zehatza saltatzen badu, erabili alde bakoitzeko irakurketarik hurbilena eta adierazi hori. Alde batera iritsi ezin bazara, jaso muga; ez asmatu daturik. Kontsolako balioa beti zerotik edo eskala osotik gertu geratzen bada, egiaztatu PC_1 eta Pot. pot2. LEDak eta testua bat ez badatoz, berrikusi set_leds() funtzioari emandako kopurua eta mantendu LEDen polaritatea. Balio analogikoak pixka bat alda daitezke posizioa mugitu gabe ere.
Itsatsi mugatik hurbil dauden bi serie-lerroak. Markatu bata azpitik eta bestea berdina edo handiagoa, eta adierazi bakoitzean inprimatutako maila.
Bidali zure kodea
8 min
Erantsi gordetako azken main.cpp fitxategia
Sakatu Comprobar archivos guardados (egiaztatu gordetako fitxategiak), ziurtatu main.cpp fitxategiak atalasea doitu duzun bertsioa duela eta sakatu Adjuntar código guardado (erantsi gordetako kodea). Ondoren, sakatu Enviar entrega (bidali lana), jardueraren amaieran.
Bihurtu aurrebista hau klase-saio batean
Jarraitu LabsLand Teach-era ikasgai hau ikasleekin erabiltzeko eta kontuaren sarbidea berrikusteko.
Lehen aldia duzu LabsLand-en? Sortu irakasle-kontua