- Nødvendige materialer
- ADC på STM8S103F3P6
- Kredsløbsdiagram til at læse ADC-værdier på STM8S og vise på LCD
- ADC-bibliotek til STM8S103F3P6
- STM8S Program til at læse analog spænding og display på LCD
- Aflæsning af analog spænding fra to potentiometer ved hjælp af STM8S
Hvis du er en almindelig læser, der følger vores STM8S Microcontroller Tutorials, ville du vide, at vi i vores sidste tutorial lærte, hvordan man interfacer en 16x2 LCD med STM8s. Nu fortsætter vi med denne vejledning, og vi lærer, hvordan du bruger ADC-funktionen på vores STM8S103F3P6 Microcontroller. En ADC er en meget nyttig periferi på en mikrocontroller, der ofte bruges af indlejrede programmerere til at måle enheder, der er i konstant forandring som varierende spænding, strøm, temperatur, fugtighed osv.
Som vi ved “Vi lever i en analog verden med digitale enheder”, hvilket betyder, at alt omkring os som vindhastighed, lysintensitet, temperatur og alt, hvad vi beskæftiger os med som hastighed, hastighed, tryk osv. Er analogt. Men vores mikrokontroller og mikroprocessorer er digitale enheder, og de vil ikke være i stand til at måle disse parametre uden en vigtig perifer enhed kaldet Analog til digitale konvertere (ADC). Så i denne artikel, lad os lære at bruge ADC på STM8S Microcontroller med COMIC C compiler.
Nødvendige materialer
I denne artikel læser vi to analoge spændingsværdier fra to potentiometre og viser dens ADC-værdi på en 16x2 LCD-skærm. For at gøre dette har vi brug for følgende komponenter.
- STM8S103F3P6 Udviklingskort
- ST-Link V2 programmør
- 16x2 LCD
- Potentiometre
- Tilslutning af ledninger
- 1k modstand
ADC på STM8S103F3P6
Der er mange typer ADC, og hver mikrocontroller har sine egne specifikationer. På STM8S103F3P6 har vi en ADC med 5-kanal og 10-bit opløsning; med en 10-bit opløsning, vil vi være i stand til at måle den digitale værdi fra 0 til 1024, og en 5-kanals ADC indikerer, at vi har 5 ben på mikrocontrolleren, der kan understøtte ADC, disse 5 ben er fremhævet på billedet nedenfor.
Som du kan se, er alle disse fem ben (AIN2, AIN3, AIN4, AIN5 og AIN6) multipleksede med andre perifere enheder, hvilket betyder bortset fra bare at fungere som en ADC-pin, kan disse ben også bruges til at udføre anden kommunikation som f.eks., pin 2 og 3 (AIN5 og AIN 6) kan ikke kun bruges til ADC, men kan også bruges til seriel kommunikation og GPIO-funktioner. Bemærk, at det ikke vil være muligt at bruge den samme pin til alle tre formål, så hvis vi bruger disse to ben til ADC, vil vi ikke være i stand til at udføre seriel kommunikation. Andre vigtige ADC-egenskaber for STM8S103P36 kan findes i nedenstående tabel taget fra databladet.
I ovenstående tabel repræsenterer Vdd driftsspænding, og Vss repræsenterer jorden. Så i vores tilfælde på vores udviklingskort har vi mikrocontrolleren, der fungerer på 3.3V, du kan kontrollere kredsløbsdiagrammet for udviklingskortet fra at komme i gang med STM8S tutorial. Med 3,3 V som driftsspænding kan vores ADC-urfrekvens indstilles mellem 1 og 4 MHz, og vores konverteringsspændingsområde ligger mellem 0 V og 3,3 V. Dette betyder, at vores 10-bit ADC læser 0, når 0V (Vss) leveres, og vil læse maksimalt 1024, når 3.3V (Vdd) leveres. Vi kan nemt ændre denne 0-5V ved at ændre MCU's driftsspænding, hvis det kræves.
Kredsløbsdiagram til at læse ADC-værdier på STM8S og vise på LCD
Det komplette kredsløbsdiagram, der bruges i dette projekt, er angivet nedenfor, det ligner meget STM8S LCD-tutorial, som vi tidligere diskuterede.
Som du kan se, er de eneste ekstra komponenter bortset fra LCD-skærmen to potentiometre POT_1 og POT_2 . Disse potter er forbundet til portene PC4 og PD6, som er ANI2- og ANI6-stifterne, som tidligere beskrevet i pinout-billedet.
Potentiometrene er forbundet på en sådan måde, at når vi varierer det, får vi 0-5 V på vores analoge ben. Vi programmerer vores controller til at læse denne analoge spænding i digital værdi (0 til 1024) og vise den på LCD-skærmen. Derefter beregner vi også den ækvivalente spændingsværdi og viser den på LCD'et. Husk at vores controller er drevet af 3.3V, så selvom vi leverer 5V til ADC-stiften, kan den kun læse fra 0V til 3.3V.
Når forbindelserne er udført, ser min hardware sådan ud som vist nedenfor. Du kan se de to potentiometre til højre og ST-link programmøren til venstre.
ADC-bibliotek til STM8S103F3P6
For at programmere ADC-funktionaliteter på STM8S bruger vi Cosmic C-compileren sammen med SPL-bibliotekerne. Men for at gøre processerne lettere, lavede jeg en anden header-fil, der kan findes på GitHub med nedenstående link.
ADC-bibliotek til STM8S103F3P6
Hvis du ved hvad du laver, kan du oprette en headerfil ved hjælp af ovenstående kode og føje den til "inkluder filer" -mappen på din projektside. Ellers følg Kom godt i gang med STM8S tutorial for at vide, hvordan du konfigurerer dit programmeringsmiljø og kompilatoren. Når din opsætning er klar, skal din IDE have følgende headerfiler, i det mindste dem omgivet med rødt.
Ovenstående header-fil består af en funktion kaldet ADC_Read () . Denne funktion kan kaldes i dit hovedprogram for at få ADC-værdien ved enhver pin. For eksempel returnerer ADC_Read (AN2) ADC-værdien på pin AN2 som resultat. Funktionen er vist nedenfor.
usigneret int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {usigneret int resultat = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (AKTIVER); ADC1_StartConversion (); mens (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); resultat = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Som du ser, kan vi overføre otte parametre til denne funktion, og dette definerer, hvordan ADC er konfigureret. I vores bibliotekskode ovenfor har vi indstillet konverteringstilstanden til kontinuerlig og derefter fået kanalnummeret sendt en parameter. Og så er vi nødt til at indstille CPU-frekvensen på vores controller, som standard (hvis du ikke har tilsluttet en ekstern krystal), fungerer din STM8S med en 16 MHz intern oscillator. Så vi har nævnt “ ADC1_PRESSEL_FCPU_D18 ” som forskaleringsværdien . Inde i denne funktion bruger vi andre metoder defineret af SPL stm8s_adc1.h headerfilen. Vi starter med at de-initialisere ADC-stifterne og derefter ADC1_Init () for at initialisere ADC-periferien. Definitionen af denne funktion i SPL-brugervejledningen er vist nedenfor.
Dernæst indstiller vi den eksterne trigger ved hjælp af en timer og deaktiverer den eksterne trigger, da vi ikke bruger den her. Og så har vi justeringen indstillet til højre, og de sidste to parametre bruges til at indstille Schmitt-trigger, men vi deaktiverer den til denne tutorial. Så for at sige det kort vil vi arbejde med vores ADC i kontinuerlig konverteringstilstand på den krævede ADC-pin med ekstern trigger og Schmitt-trigger deaktiveret. Du kan kontrollere databladet, hvis du har brug for flere oplysninger om, hvordan du bruger den eksterne trigger eller Schmitt trigger-indstilling, vi diskuterer ikke det i denne vejledning.
STM8S Program til at læse analog spænding og display på LCD
Den komplette kode, der bruges i main.c- filen, findes nederst på denne side. Når du har tilføjet de nødvendige headerfiler og kildefiler, skal du kunne kompilere hovedfilen direkte. Forklaringen på koden i hovedfilen er som følger. Jeg forklarer ikke STM8S LCD-programmet, da vi allerede har diskuteret det i den foregående vejledning.
Formålet med koden vil være at læse ADC-værdier fra to ben og konvertere den til en spændingsværdi. Vi viser også både ADC-værdien og spændingsværdien på LCD'et. Så jeg har brugt en funktion kaldet LCD_Print Var, der tager en variabel i heltalformat og konverterer den til et tegn for at vise den på LCD'et. Vi har brugt operatorerne med simpelt modul (%) og divideret (/) til at få hvert ciffer fra variablen og indsætte variabler som d1, d2, d3 og d4 som vist nedenfor. Derefter kan vi bruge funktionen LCD_Print_Char til at vise disse tegn på LCD'et.
ugyldig LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
Dernæst under hovedfunktionen har vi deklareret fire variabler. To af dem bruges til at gemme ADC-værdien (0 til 1024), og de andre to bruges til at få den faktiske spændingsværdi.
usigneret int ADC_value_1 = 0; usigneret int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Derefter skal vi forberede GPIO-benene og urkonfigurationen til at læse analog spænding. Her læser vi den analoge spænding fra ben AIN2 og AIN6, som er henholdsvis ben PC4 og PD6. Vi er nødt til at definere disse pin i flydende tilstand som vist nedenfor. Vi aktiverer også perifert ur til ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Aktivér perifert ur til ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Nu hvor stifterne er klar, er vi nødt til at komme ind i den uendelige loop for at læse den analoge spænding. Da vi har vores header-fil, kan vi let læse den analoge spænding fra ben AIN2 og AIN 6 ved hjælp af nedenstående linjer.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Det næste trin er at konvertere denne ADC-aflæsning (0 til 1023) til en analog spænding. På denne måde kan vi vise den nøjagtige spændingsværdi, der er angivet til pin AIN2 og AIN6. Formlerne til beregning af analog spænding kan gives ved-
Analog spænding = ADC-aflæsning * (3300/1023)
I vores tilfælde på STM8S103F3-controllere har vi en ADC med 10-bit opløsning, så vi har brugt 1023 (2 ^ 10) . Også på vores udvikling styrer controlleren med 3.3V, hvilket er 3300, så vi delte 3300 med 1023 i ovenstående formler. Cirka 3300/1023 giver os 3,226, så på vores program har vi følgende linjer til at måle den faktiske ADC-spænding ved hjælp af ADC-spændingen.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) konverterer ADC-værdi 1 til 0 til 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // konverter ADC-værdi 1 til 0 til 3300 mV
Den resterende del af koden bruges kun til at vise disse fire værdier på LCD-skærmen. Vi har også en forsinkelse på 500 ms, så LCD'en opdateres for hver 500 ms. Du kan reducere dette yderligere, hvis du har brug for hurtigere opdateringer.
Aflæsning af analog spænding fra to potentiometer ved hjælp af STM8S
Kompilér koden, og upload den til dit udviklingskort. Hvis du får nogen kompileringsfejl, skal du sørge for at have tilføjet alle headerfiler og kildefiler som diskuteret tidligere. Når koden er uploadet, skal du se en lille velkomstmeddelelse, der siger "ADC på STM8S", og derefter skal du se nedenstående skærmbillede.
Værdien D1 og D2 angiver ADC-værdien fra henholdsvis pin Ain2 og AIN6. På højre side har vi også de tilsvarende spændingsværdier vist. Denne værdi skal være lig med spændingen, der vises på henholdsvis pin AIN2 og AIN6. Vi kan kontrollere det samme ved hjælp af et multimeter, vi kan også variere potentiometrene for at kontrollere, om spændingsværdien også ændrer sig i overensstemmelse hermed.
Komplet arbejde kan også findes i videoen nedenfor. Håber du har haft vejledningen og lært noget nyttigt, hvis du har spørgsmål, skal du lade dem være i kommentarfeltet nedenfor. Du kan også bruge vores fora til at starte en diskussion eller sende andre tekniske spørgsmål.