- Vereiste materialen
- ADC op STM8S103F3P6
- Schakelschema om ADC-waarden op STM8S te lezen en op LCD weer te geven
- ADC-bibliotheek voor STM8S103F3P6
- STM8S-programma om analoge spanning en weergave op LCD te lezen
- Analoge spanning van twee potentiometers lezen met STM8S
Als u een gewone lezer bent die onze STM8S Microcontroller Tutorials volgt, zou u weten dat we in onze laatste tutorial hebben geleerd hoe u een 16x2 LCD met STM8s kunt verbinden. Nu we hiermee verder gaan in deze tutorial, zullen we leren hoe we de ADC-functie op onze STM8S103F3P6 Microcontroller kunnen gebruiken. Een ADC is een zeer handig randapparaat op een microcontroller dat vaak wordt gebruikt door embedded programmeurs om eenheden te meten die constant veranderen, zoals de variërende spanning, stroom, temperatuur, vochtigheid, enz.
Zoals we weten "We leven in een analoge wereld met digitale apparaten", wat betekent dat alles om ons heen, zoals windsnelheid, lichtintensiteit, temperatuur en alles waar we mee te maken hebben, zoals snelheid, snelheid, druk, enz., Analoog van aard zijn. Maar onze microcontrollers en microprocessors zijn digitale apparaten en ze zullen deze parameters niet kunnen meten zonder een belangrijk randapparaat genaamd Analog to Digital Converters (ADC). Laten we in dit artikel dus leren hoe we ADC kunnen gebruiken op STM8S Microcontroller met COMIC C-compiler.
Vereiste materialen
In dit artikel lezen we twee analoge spanningswaarden van twee potentiometers en geven we de ADC-waarde weer op een 16x2 LCD-scherm. Hiervoor hebben we de volgende componenten nodig.
- STM8S103F3P6 Ontwikkelingsbord
- ST-Link V2 programmeur
- 16x2 LCD
- Potentiometers
- Draden aansluiten
- 1k weerstand
ADC op STM8S103F3P6
Er zijn veel soorten ADC en elke microcontroller heeft zijn eigen specificaties. Op de STM8S103F3P6 hebben we een ADC met 5 kanalen en 10-bits resolutie; met een 10-bits resolutie kunnen we de digitale waarde meten van 0 tot 1024 en een 5-kanaals ADC geeft aan dat we 5 pinnen op de microcontroller hebben die ADC kunnen ondersteunen, deze 5 pinnen zijn gemarkeerd in de onderstaande afbeelding.
Zoals u kunt zien, zijn al deze vijf pinnen (AIN2, AIN3, AIN4, AIN5 en AIN6) gemultiplexed met andere randapparatuur, wat betekent dat deze pinnen niet alleen als ADC-pin fungeren, maar ook kunnen worden gebruikt voor het uitvoeren van andere communicatie, zoals bijvoorbeeld kunnen de pin 2 en 3 (AIN5 en AIN 6) niet alleen worden gebruikt voor ADC, maar ook voor seriële communicatie en GPIO-functies. Houd er rekening mee dat het niet mogelijk is om dezelfde pin voor alle drie de doeleinden te gebruiken, dus als we deze twee pinnen voor ADC gebruiken, kunnen we geen seriële communicatie uitvoeren. Andere belangrijke ADC-kenmerken voor STM8S103P36 zijn te vinden in de onderstaande tabel uit de datasheet.
In de bovenstaande tabel vertegenwoordigt Vdd de bedrijfsspanning en vertegenwoordigt Vss de aarde. Dus in ons geval op ons ontwikkelbord hebben we de microcontroller die op 3,3 V werkt, je kunt het schakelschema van het ontwikkelbord bekijken vanaf het begin met de STM8S-tutorial. Met 3.3V als bedrijfsspanning kan onze ADC-klokfrequentie worden ingesteld tussen 1 en 4MHz en ons conversiespanningsbereik ligt tussen 0V en 3.3V. Dit betekent dat onze 10-bit ADC 0 zal lezen wanneer 0V (Vss) wordt geleverd en maximaal 1024 zal lezen wanneer 3.3V (Vdd) wordt geleverd. We kunnen deze 0-5V eenvoudig wijzigen door indien nodig de bedrijfsspanning van de MCU te wijzigen.
Schakelschema om ADC-waarden op STM8S te lezen en op LCD weer te geven
Het volledige schakelschema dat in dit project wordt gebruikt, wordt hieronder gegeven, het lijkt erg op de STM8S LCD-tutorial die we eerder hebben besproken.
Zoals u kunt zien, zijn de enige aanvullende componenten naast het LCD-scherm twee potentiometers POT_1 en POT_2 . Deze potten zijn verbonden met de poorten PC4 en PD6, dit zijn de ANI2- en ANI6-pinnen zoals eerder besproken op de pinout-afbeelding.
De potmeters zijn zo aangesloten dat als we het variëren, we 0-5 V op onze analoge pinnen krijgen. We gaan onze controller programmeren om deze analoge spanning in digitale waarde (0 tot 1024) uit te lezen en op het LCD-scherm weer te geven. Vervolgens zullen we ook de equivalente spanningswaarde berekenen en deze op het LCD-scherm weergeven, onthoud dat onze controller wordt gevoed door 3,3 V, dus zelfs als we 5 V leveren aan de ADC-pin, kan deze alleen lezen van 0 V tot 3,3 V.
Zodra de verbindingen zijn gemaakt, ziet mijn hardware er als volgt uit, zoals hieronder wordt weergegeven. Rechts zie je de twee potmeters en links de ST-link programmeur.
ADC-bibliotheek voor STM8S103F3P6
Om te programmeren voor ADC-functionaliteiten op STM8S, zullen we de Cosmic C-compiler gebruiken samen met de SPL-bibliotheken. Maar om de processen gemakkelijker te maken, heb ik nog een header-bestand gemaakt dat op GitHub te vinden is met de onderstaande link.
ADC-bibliotheek voor STM8S103F3P6
Als u weet wat u doet, kunt u een header-bestand maken met behulp van de bovenstaande code en dit toevoegen aan de directory "include files" op uw projectpagina. Volg anders de instructies om aan de slag te gaan met de STM8S-tutorial om te weten hoe u uw programmeeromgeving en compiler instelt. Als je installatie klaar is, zou je IDE de volgende header-bestanden moeten hebben, tenminste de rood omcirkelde bestanden.
Het bovenstaande header-bestand bestaat uit een functie genaamd ADC_Read () . Deze functie kan in uw hoofdprogramma worden aangeroepen om de ADC-waarde op een willekeurige pin te krijgen. Bijvoorbeeld, ADC_Read (AN2) de ADC waarde terug op pin AN2 als resultaat. De functie wordt hieronder getoond.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int result = 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 (INSCHAKELEN); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); resultaat = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Zoals u ziet, kunnen we acht parameters aan deze functie doorgeven en dit bepaalt hoe de ADC is geconfigureerd. In onze bibliotheekcode hierboven hebben we de conversiemodus ingesteld op continu en vervolgens het kanaalnummer doorgegeven aan een parameter. En dan moeten we de CPU-frequentie van onze controller instellen, standaard (als je geen extern kristal hebt aangesloten), zal je STM8S werken met een interne oscillator van 16 MHz. Daarom hebben we “ ADC1_PRESSEL_FCPU_D18 ” genoemd als de pre-scaler-waarde. Binnen deze functie gebruiken we andere methoden die zijn gedefinieerd door het SPL stm8s_adc1.h header-bestand. We beginnen met de-initialisatie van de ADC-pinnen en vervolgens ADC1_Init () om het ADC-randapparaat te initialiseren. De definitie van deze functie uit de SPL-gebruikershandleiding wordt hieronder weergegeven.
Vervolgens stellen we de externe trigger in met een timer en schakelen we de externe trigger uit, omdat we deze hier niet zullen gebruiken. En dan hebben we de uitlijning naar rechts ingesteld en de laatste twee parameters worden gebruikt om de Schmitt-trigger in te stellen, maar we zullen deze uitschakelen voor deze tutorial. Dus, kort gezegd, we zullen onze ADC in continue conversiemodus werken op de vereiste ADC-pin met externe trigger en Schmitt-trigger uitgeschakeld. U kunt het gegevensblad raadplegen als u meer informatie nodig heeft over het gebruik van de externe trigger of Schmitt-triggeroptie, we zullen dat in deze tutorial niet bespreken.
STM8S-programma om analoge spanning en weergave op LCD te lezen
De volledige code die in het main.c- bestand wordt gebruikt, vindt u onderaan deze pagina. Na het toevoegen van de vereiste header-bestanden en bronbestanden, zou u het hoofdbestand direct moeten kunnen compileren. De uitleg van de code in het hoofdbestand is als volgt. Ik zal het STM8S LCD-programma niet uitleggen, aangezien we dat al in de vorige tutorial hebben besproken.
Het doel van de code is om ADC-waarden van twee pinnen te lezen en deze om te zetten in een spanningswaarde. We zullen ook zowel de ADC-waarde als de spanningswaarde op het LCD-scherm weergeven. Dus ik heb een functie met de naam LCD_Print Var gebruikt die een variabele in integer-indeling opneemt en deze omzet in een teken om deze op het LCD-scherm weer te geven. We hebben de eenvoudige modulus (%) en deel (/) operators gebruikt om elk cijfer uit de variabele te halen en variabelen zoals d1, d2, d3 en d4 in te voeren, zoals hieronder getoond. Vervolgens kunnen we de functie LCD_Print_Char gebruiken om deze tekens op het LCD-scherm weer te geven.
ongeldig 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); }
Vervolgens hebben we onder de hoofdfunctie vier variabelen gedeclareerd. Twee ervan worden gebruikt om de ADC-waarde op te slaan (0 tot 1024) en de andere twee worden gebruikt om de werkelijke spanningswaarde te krijgen.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Vervolgens moeten we de GPIO-pinnen en klokconfiguratie voorbereiden om de analoge spanning te lezen. Hier zullen we de analoge spanning lezen van de pinnen AIN2 en AIN6, respectievelijk pinnen PC4 en PD6. We moeten deze pin in een zwevende toestand definiëren, zoals hieronder wordt weergegeven. We zullen ook de klokrandapparatuur inschakelen voor ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Schakel perifere klok in voor ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Nu de pinnen klaar zijn, moeten we in de oneindige while-lus komen om de analoge spanning te lezen. Aangezien we ons header-bestand hebben, kunnen we gemakkelijk de analoge spanning van pinnen AIN2 en AIN 6 aflezen met behulp van de onderstaande regels.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
De volgende stap is om deze ADC-waarde (0 tot 1023) om te zetten naar een analoge spanning. Op deze manier kunnen we de exacte spanningswaarde weergeven die is gegeven aan pin AIN2 en AIN6. De formules om analoge spanning te berekenen kunnen worden gegeven door:
Analoge spanning = ADC-uitlezing * (3300/1023)
In ons geval op STM8S103F3-controllers hebben we een ADC met 10-bits resolutie, dus we hebben 1023 (2 ^ 10) gebruikt . Ook op onze ontwikkeling voedt de controller met 3.3V, wat 3300 is, dus we hebben 3300 gedeeld door 1023 in de bovenstaande formules. Ongeveer 3300/1023 geeft ons 3.226, dus in ons programma hebben we de volgende regels om de werkelijke ADC-spanning te meten met behulp van de ADC-spanning.
ADC_voltage_1 = ADC_waarde_1 * (3.226); // (3300/1023 = ~ 3.226) converteer ADC-waarde 1 naar 0 naar 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // converteer ADC-waarde 1 naar 0 naar 3300mV
Het resterende deel van de code wordt alleen gebruikt om deze vier waarden op het LCD-scherm weer te geven. We hebben ook een vertraging van 500 ms, zodat de LCD elke 500 ms wordt bijgewerkt. U kunt dit verder verminderen als u snellere updates nodig heeft.
Analoge spanning van twee potentiometers lezen met STM8S
Compileer de code en upload deze naar je ontwikkelbord. Als je een compileerfout krijgt, zorg er dan voor dat je alle headerbestanden en bronbestanden hebt toegevoegd zoals eerder besproken. Zodra de code is geüpload, zou u een klein welkomstbericht moeten zien met de tekst "ADC op STM8S" en vervolgens zou u het onderstaande scherm moeten zien.
De waarde D1 en D2 geven de ADC-waarde van respectievelijk pin Ain2 en AIN6 aan. Aan de rechterkant hebben we ook de equivalente spanningswaarden weergegeven. Deze waarde moet gelijk zijn aan de spanning die verschijnt op respectievelijk pin AIN2 en AIN6. We kunnen hetzelfde controleren met een multimeter, we kunnen ook de potentiometers variëren om te controleren of de spanningswaarde ook dienovereenkomstig verandert.
De volledige werking is ook te vinden in de onderstaande video. Ik hoop dat je de tutorial leuk vond en iets nuttigs hebt geleerd, als je vragen hebt, laat ze dan achter in het commentaargedeelte hieronder. U kunt ook onze forums gebruiken om een discussie te starten of andere technische vragen te stellen.