- Material som krävs
- ADC på STM8S103F3P6
- Kretsschema för att läsa ADC-värden på STM8S och visa på LCD
- ADC-bibliotek för STM8S103F3P6
- STM8S Program för läsning av analog spänning och display på LCD
- Avläsning av analog spänning från två potentiometrar med STM8S
Om du är en vanlig läsare som följer våra STM8S Microcontroller-handledning, skulle du veta att i vår senaste handledning lärde vi oss hur man gränssnitt en 16x2 LCD med STM8s. Nu fortsätter vi med den här handledningen och lär oss hur man använder ADC-funktionen på vår STM8S103F3P6 mikrokontroller. En ADC är en mycket användbar kringutrustning på en mikrokontroller som ofta används av inbäddade programmerare för att mäta enheter som är i konstant förändring som varierande spänning, ström, temperatur, fuktighet etc.
Som vi vet "Vi lever i en analog värld med digitala enheter", vilket betyder att allt runt omkring oss som vindhastighet, ljusintensitet, temperatur och allt vi hanterar som hastighet, hastighet, tryck etc. är analogt. Men våra mikrokontroller och mikroprocessorer är digitala enheter och de kommer inte att kunna mäta dessa parametrar utan en viktig kringutrustning som heter Analog till Digital-omvandlare (ADC). Så i den här artikeln, låt oss lära oss hur man använder ADC på STM8S Microcontroller med COMIC C-kompilator.
Material som krävs
I den här artikeln kommer vi att läsa två analoga spänningsvärden från två potentiometrar och visa dess ADC-värde på en 16x2 LCD-skärm. För att göra detta behöver vi följande komponenter.
- STM8S103F3P6 Utvecklingskort
- ST-Link V2 programmerare
- 16x2 LCD
- Potentiometrar
- Anslutande ledningar
- 1k motstånd
ADC på STM8S103F3P6
Det finns många typer av ADC och varje mikrokontroller har sina egna specifikationer. På STM8S103F3P6 har vi en ADC med 5-kanals och 10-bitars upplösning; med en 10-bitars upplösning kommer vi att kunna mäta det digitala värdet från 0 till 1024 och en 5-kanals ADC indikerar att vi har 5 stift på Microcontroller som kan stödja ADC, dessa 5 stift är markerade i bilden nedan.
Som du kan se är alla dessa fem stift (AIN2, AIN3, AIN4, AIN5 och AIN6) multiplexerade med andra kringutrustning, vilket betyder att förutom att bara fungera som en ADC-stift, kan dessa stift också användas för att utföra annan kommunikation som till exempel, stift 2 och 3 (AIN5 och AIN 6) kan inte bara användas för ADC utan kan också användas för seriell kommunikation och GPIO-funktioner. Observera att det inte går att använda samma stift för alla tre ändamål, så om vi använder dessa två stift för ADC kommer vi inte att kunna utföra seriekommunikation. Andra viktiga ADC-egenskaper för STM8S103P36 finns i nedanstående tabell från databladet.
I tabellen ovan representerar Vdd driftspänning och Vss representerar marken. Så i vårt fall på vårt utvecklingskort har vi mikrokontrollern som arbetar på 3.3V, du kan kontrollera kretsschemat för utvecklingskortet från början med STM8S-handledning. Med 3,3 V som driftspänning kan vår ADC-klockfrekvens ställas in mellan 1 och 4 MHz och vårt omvandlingsspänningsområde ligger mellan 0 V och 3,3 V. Detta innebär att vår 10-bitars ADC kommer att läsa 0 när 0V (Vss) tillhandahålls och läsa högst 1024 när 3.3V (Vdd) tillhandahålls. Vi kan enkelt ändra denna 0-5V genom att ändra driftspänningen på MCU om det behövs.
Kretsschema för att läsa ADC-värden på STM8S och visa på LCD
Det kompletta kretsschemat som används i detta projekt ges nedan, det liknar mycket STM8S LCD-handledning som vi diskuterade tidigare.
Som du kan se är de enda ytterligare komponenterna förutom LCD-skärmen två potentiometrar POT_1 och POT_2 . Dessa krukor är anslutna till portarna PC4 och PD6, som är ANI2- och ANI6-stiften som diskuterats på pinout-bilden tidigare.
Potentiometrarna är anslutna på ett sådant sätt att när vi varierar det, får vi 0-5 V på våra analoga stift. Vi kommer att programmera vår styrenhet för att läsa denna analoga spänning i digitalt värde (0 till 1024) och visa den på LCD-skärmen. Då kommer vi också att beräkna motsvarande spänningsvärde och visa det på LCD-skärmen, kom ihåg att vår styrenhet drivs av 3,3 V, så även om vi försörjer 5 V till ADC-stiftet kommer den att kunna läsa endast från 0 V till 3,3 V.
När anslutningarna är klara ser min hårdvara ut så som visas nedan. Du kan se de två potentiometrarna till höger och ST-link-programmeraren till vänster.
ADC-bibliotek för STM8S103F3P6
För att programmera ADC-funktioner på STM8S använder vi Cosmic C-kompilatorn tillsammans med SPL-biblioteken. Men för att göra processerna enklare skapade jag en annan rubrikfil som finns på GitHub med länken nedan.
ADC-bibliotek för STM8S103F3P6
Om du vet vad du gör kan du skapa en rubrikfil med ovanstående kod och lägga till den i katalogen "inkludera filer" på din projektsida. Följ annars komma igång med STM8S-självstudien för att veta hur du ställer in din programmeringsmiljö och kompilator. När din installation är klar bör din IDE ha följande rubrikfiler, åtminstone de som är inringade i rött.
Ovanstående rubrikfil består av en funktion som heter ADC_Read () . Denna funktion kan anropas i ditt huvudprogram för att få ADC-värdet vid valfri stift. Till exempel returnerar ADC_Read (AN2) ADC-värdet på stift AN2 som resultat. Funktionen visas nedan.
osignerad int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {osignerad 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 (AKTIVERA); ADC1_StartConversion (); medan (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); resultat = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Som du ser kan vi skicka åtta parametrar till den här funktionen och detta definierar hur ADC konfigureras. I vår bibliotekskod ovan har vi satt konverteringsläget till kontinuerligt och sedan får kanalnummer passerat en parameter. Och då måste vi ställa in CPU-frekvensen för vår styrenhet, som standard (om du inte har anslutit en extern kristall), kommer din STM8S att fungera med en 16MHz intern oscillator. Så vi har nämnt “ ADC1_PRESSEL_FCPU_D18 ” som förskalningsvärde. Inuti denna funktion använder vi andra metoder som definieras av SPL stm8s_adc1.h rubrikfil . Vi börjar med att de-initialisera ADC-stiften och sedan ADC1_Init () för att initialisera ADC-periferin. Definitionen av denna funktion i SPL-användarhandboken visas nedan.
Därefter ställer vi in den externa utlösaren med en timer och inaktiverar den externa utlösaren eftersom vi inte använder den här. Och sedan har vi inställningen till höger och de två sista parametrarna används för att ställa in Schmitt-utlösaren, men vi kommer att inaktivera den för den här självstudien. Så, för att kortfattat säga, kommer vi att använda vår ADC i kontinuerligt omvandlingsläge på den nödvändiga ADC-stiftet med extern trigger och Schmitt-trigger avaktiverad. Du kan kontrollera databladet om du behöver mer information om hur du använder alternativet för extern trigger eller Schmitt trigger, vi kommer inte att diskutera det i den här handledningen.
STM8S Program för läsning av analog spänning och display på LCD
Den kompletta koden som används i main.c- filen finns längst ner på denna sida. När du har lagt till de nödvändiga rubrikfilerna och källfilerna bör du kunna kompilera huvudfilen direkt. Förklaringen till koden i huvudfilen är som följer. Jag kommer inte att förklara STM8S LCD-program eftersom vi redan har diskuterat det i föregående handledning.
Syftet med koden är att läsa ADC-värden från två stift och konvertera det till ett spänningsvärde. Vi kommer också att visa både ADC-värdet och spänningsvärdet på LCD-skärmen. Så jag har använt en funktion som heter LCD_Print Var som tar in en variabel i heltal och konverterar den till ett tecken så att den visas på LCD-skärmen. Vi har använt operatorerna för enkel modul (%) och dela (/) för att få varje siffra från variabeln och sätta in variabler som d1, d2, d3 och d4 som visas nedan. Då kan vi använda funktionen LCD_Print_Char för att visa dessa tecken på LCD-skärmen.
ogiltig 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); }
Nästa under huvudfunktionen har vi fyra variabler deklarerade. Två av dem används för att spara ADC-värdet (0 till 1024) och de andra två används för att få det verkliga spänningsvärdet.
osignerad int ADC_value_1 = 0; osignerad int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Därefter måste vi förbereda GPIO-stiften och klockkonfigurationen för att läsa analog spänning. Här läser vi den analoga spänningen från stift AIN2 och AIN6 som är stift PC4 respektive PD6. Vi måste definiera dessa stift i flytande tillstånd som visas nedan. Vi kommer också att aktivera klockans kringutrustning för ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Aktivera perifer klocka för ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Nu när stiften är färdiga, måste vi komma in i det oändliga slingan för att läsa den analoga spänningen. Eftersom vi har vår huvudfil kan vi enkelt läsa av den analoga spänningen från stiften AIN2 och AIN 6 med hjälp av nedanstående rader.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Nästa steg är att konvertera denna ADC-avläsning (0 till 1023) till en analog spänning. På detta sätt kan vi visa det exakta spänningsvärde som ges till stift AIN2 och AIN6. Formlerna för att beräkna analog spänning kan ges av-
Analog spänning = ADC-avläsning * (3300/1023)
I vårt fall på STM8S103F3-kontroller har vi en ADC med 10-bitars upplösning, så vi har använt 1023 (2 ^ 10) . Också på vår utveckling driver styrenheten med 3.3V vilket är 3300, så vi delade 3300 med 1023 i ovanstående formler. Cirka 3300/1023 ger oss 3.226, så i vårt program har vi följande rader för att mäta den faktiska ADC-spänningen med ADC-spänningen.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) konverterar ADC-värde 1 till 0 till 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // konvertera ADC-värde 1 till 0 till 3300 mV
Den återstående delen av koden används endast för att visa dessa fyra värden på LCD-skärmen. Vi har också en fördröjning på 500 ms så att LCD-skärmen uppdateras för varje 500 ms. Du kan minska detta ytterligare om du behöver snabbare uppdateringar.
Avläsning av analog spänning från två potentiometrar med STM8S
Kompilera koden och ladda upp den till ditt utvecklingskort. Om du får något kompileringsfel, se till att du har lagt till alla rubrikfiler och källfiler som diskuterats tidigare. När koden har laddats upp ska du se ett litet välkomstmeddelande som säger "ADC på STM8S" och sedan bör du se nedanstående skärm.
Värdet D1 och D2 anger ADC-värdet från stift Ain2 respektive AIN6. På höger sida har vi också motsvarande spänningsvärden. Detta värde bör vara lika med spänningen som visas på stift AIN2 respektive AIN6. Vi kan kontrollera samma med en multimeter, vi kan också variera potentiometrarna för att kontrollera om spänningsvärdet också ändras i enlighet därmed.
Komplett arbete kan också hittas i videon nedan. Hoppas att du gillade handboken och lärde dig något användbart, om du har några frågor, lämna dem i kommentarsektionen nedan. Du kan också använda våra forum för att starta en diskussion eller skicka andra tekniska frågor.