- Reikalingos medžiagos
- ADC dėl STM8S103F3P6
- Grandinės schema, skirta skaityti ADC vertes STM8S ir ekrane
- ADC biblioteka, skirta STM8S103F3P6
- STM8S programa, skirta nuskaityti analoginę įtampą ir ekraną LCD ekrane
- Analoginės įtampos nuskaitymas iš dviejų potenciometrų naudojant STM8S
Jei esate nuolatinis skaitytojas, kuris seka mūsų STM8S mikrovaldiklių pamokas, žinotumėte, kad paskutinėje mūsų pamokoje sužinojome, kaip susieti 16x2 LCD ekraną su STM8. Dabar, tęsdami šią mokymo programą, sužinosime, kaip naudoti ADC funkciją mūsų mikrovaldiklyje STM8S103F3P6. ADC yra labai naudingas mikrovaldiklio periferinis įrenginys, kurį įterptieji programuotojai dažnai naudoja matuodami vienetus, kurie nuolat kinta, pvz., Kintanti įtampa, srovė, temperatūra, drėgmė ir kt.
Kaip žinome „Gyvename analoginiame pasaulyje su skaitmeniniais prietaisais“, vadinasi, viskas aplinkui, kaip vėjo greitis, šviesos intensyvumas, temperatūra ir viskas, su kuo susiduriame, pvz., Greitis, greitis, slėgis ir kt., Yra analogiško pobūdžio. Tačiau mūsų mikrovaldikliai ir mikroprocesoriai yra skaitmeniniai įrenginiai ir jie negalės išmatuoti šių parametrų be svarbaus periferinio įrenginio, vadinamo analoginiais skaitmeniniais keitikliais (ADC). Taigi šiame straipsnyje sužinokime, kaip naudoti ADC „STM8S“ mikrovaldiklyje su „COMIC C“ kompiliatoriumi.
Reikalingos medžiagos
Šiame straipsnyje mes perskaitysime dvi analogines įtampos vertes iš dviejų potenciometrų ir parodysime jo ADC vertę 16x2 LCD ekrane. Norėdami tai padaryti, mums reikės šių komponentų.
- STM8S103F3P6 plėtros lenta
- „ST-Link V2“ programuotojas
- 16x2 LCD ekranas
- Potenciometrai
- Jungiamieji laidai
- 1k rezistorius
ADC dėl STM8S103F3P6
Yra daugybė ADC tipų ir kiekvienas mikrovaldiklis turi savo specifikacijas. STM8S103F3P6 turime ADC su 5 kanalų ir 10 bitų skiriamąja geba; turėdami 10 bitų skiriamąją gebą, galėsime išmatuoti skaitmeninę vertę nuo 0 iki 1024, o 5 kanalų ADC rodo, kad mikrovaldiklyje turime 5 kaiščius, kurie gali palaikyti ADC, šie 5 kaiščiai paryškinti paveikslėlyje žemiau.
Kaip matote, visi šie penki kaiščiai (AIN2, AIN3, AIN4, AIN5 ir AIN6) yra multipleksuojami su kitais periferiniais įrenginiais, t., 2 ir 3 kaiščiai (AIN5 ir AIN 6) gali būti naudojami ne tik ADC, bet ir nuosekliojo ryšio bei GPIO funkcijoms. Atkreipkite dėmesį, kad to paties kaiščio nebus galima naudoti visiems trims tikslams, taigi, jei šiuos du kaiščius naudojame ADC, negalėsime atlikti nuoseklaus ryšio. Kitas svarbias STM8S103P36 ADC charakteristikas galite rasti žemiau esančioje lentelėje , paimtoje iš duomenų lapo.
Aukščiau pateiktoje lentelėje Vdd reiškia darbinę įtampą, o Vss - žemę. Taigi mūsų kūrimo plokštėje mikrovaldiklis veikia 3.3V įtampa. Galite patikrinti kūrimo plokštės grandinės schemą nuo pat pradžių su STM8S pamoka. Kai darbinė įtampa yra 3,3 V, mūsų ADC laikrodžio dažnį galima nustatyti nuo 1 iki 4 MHz, o konversijos įtampos diapazonas yra nuo 0 V iki 3,3 V. Tai reiškia, kad mūsų 10 bitų ADC rodys 0, kai teikiama 0 V (Vss), ir maksimaliai 1024, kai bus pateikta 3,3 V (Vdd). Mes galime lengvai pakeisti šį 0-5V, jei reikia, pakeisdami MCU darbinę įtampą.
Grandinės schema, skirta skaityti ADC vertes STM8S ir ekrane
Visa šiame projekte naudojama grandinės schema pateikta žemiau, ji yra labai panaši į anksčiau aptartą STM8S LCD pamoką.
Kaip matote, vieninteliai papildomi komponentai be LCD yra du potenciometrai POT_1 ir POT_2 . Šie puodai yra prijungti prie prievadų PC4 ir PD6, kurie yra ANI2 ir ANI6 kaiščiai, kaip aptarta anksčiau esančiame vaizde.
Potenciometrai yra sujungti taip, kad jį keisdami gausime 0-5 V ant savo analoginių kaiščių. Programuosime savo valdiklį, kad jis nuskaitytų šią analoginę įtampą skaitmenine verte (nuo 0 iki 1024) ir parodytų ją LCD ekrane. Tada mes taip pat apskaičiuosime ekvivalentinę įtampos vertę ir parodysime ją skystųjų kristalų ekrane, nepamirškite, kad mūsų valdiklį maitina 3,3 V, taigi, net jei mes tiekiame 5 V į ADC kaištį, jis galės nuskaityti tik nuo 0 V iki 3,3 V.
Atlikus ryšius, mano aparatūra atrodo taip, kaip parodyta žemiau. Dešinėje galite pamatyti du potenciometrus, o kairėje - „ST-link“ programuotoją.
ADC biblioteka, skirta STM8S103F3P6
Norėdami programuoti ADC funkcijas STM8S, naudosime „Cosmic C“ kompiliatorių kartu su SPL bibliotekomis. Tačiau norėdamas palengvinti procesus, padariau kitą antraštės failą, kurį galima rasti „GitHub“ su žemiau esančia nuoroda.
ADC biblioteka, skirta STM8S103F3P6
Jei žinote, ką darote, galite sukurti antraštės failą naudodami aukščiau nurodytą kodą ir pridėti jį prie projekto „“ įtraukti failus “katalogo. Kitu atveju sekite darbo su STM8S pradžia, kad sužinotumėte, kaip nustatyti savo programavimo aplinką ir kompiliatorių. Kai sąranka bus parengta, jūsų IDE turėtų turėti šiuos antraštės failus, bent jau tuos, kurie apjuosti raudonai.
Pirmiau pateiktą antraštės failą sudaro funkcija, vadinama ADC_Read () . Šią funkciją galima iškviesti pagrindinėje programoje, kad gautumėte ADC reikšmę bet kuriame smeigtuke. Pavyzdžiui, ADC_Read (AN2) grąžins ADC vertę ant smeigtuko AN2. Funkcija parodyta žemiau.
nepasirašytas int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {nepasirašytas int rezultatas = 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 (ĮJUNGTI); ADC1_StartConversion (); o (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == NETIESA); rezultatas = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Kaip matote, šiai funkcijai galime perduoti aštuonis parametrus ir tai apibrėžia, kaip konfigūruojamas ADC. Aukščiau esančiame bibliotekos kode mes nustatėme konversijos režimą į tęstinį ir tada, kai kanalo numeris perdavė parametrą. Tada mes turime nustatyti savo valdiklio procesoriaus dažnį, pagal numatytuosius nustatymus (jei neprijungėte išorinio kristalo), jūsų STM8S veiks su 16Mhz vidiniu osciliatoriumi. Taigi paminėjome „ ADC1_PRESSEL_FCPU_D18 “ kaip išankstinio mastelio reikšmę. Šios funkcijos viduje mes naudojame kitus metodus, apibrėžtus SPL stm8s_adc1.h antraštės faile. Pradedame iš naujo inicializuodami ADC kaiščius ir tada ADC1_Init (), kad inicijuotume ADC periferinį įrenginį . Šios funkcijos apibrėžimas iš SPL vartotojo vadovo pateiktas žemiau.
Tada nustatome išorinį trigerį naudodami laikmatį ir išjungiame išorinį trigerį, nes jo čia nenaudosime. Tada nustatysime lygiuotę į dešinę, o paskutiniai du parametrai naudojami nustatant „Schmitt“ trigerį, tačiau mes jį išjungsime šioje pamokoje. Taigi, trumpai tariant, mes ADC dirbsime nepertraukiamo keitimo režimu reikalingu ADC kaiščiu su išoriniu paleidikliu ir Schmitt trigeriu. Galite patikrinti duomenų lapą, jei jums reikia daugiau informacijos, kaip naudoti išorinį paleidiklį arba „Schmitt“ trigerio parinktį, mes to neaptarsime šioje pamokoje.
STM8S programa, skirta nuskaityti analoginę įtampą ir ekraną LCD ekrane
Visą kodą, naudojamą faile main.c, rasite šio puslapio apačioje. Pridėję reikiamus antraštės failus ir šaltinio failus, turėtumėte galėti tiesiogiai sukompiliuoti pagrindinį failą. Pagrindiniame faile pateiktas kodas paaiškinamas taip. Aš nepaaiškinsiu STM8S LCD programos, nes mes tai jau aptarėme ankstesnėje pamokoje.
Kodo tikslas bus nuskaityti ADC reikšmes iš dviejų kaiščių ir paversti jį įtampos verte. Taip pat LCD ekrane rodysime ir ADC vertę, ir įtampos vertę. Taigi, aš naudojau funkciją, vadinamą LCD_Print Var, kuri įgyja kintamąjį sveiko skaičiaus formatu ir paverčia jį simboliu taip, kad būtų rodomas LCD. Mes naudojome paprastus modulio (%) ir padalijimo (/) operatorius, kad gautume kiekvieną skaičių iš kintamojo ir įdėtume tokius kintamuosius kaip d1, d2, d3 ir d4, kaip parodyta žemiau. Tada galime naudoti funkciją LCD_Print_Char, kad šie simboliai būtų rodomi LCD.
negaliojantis 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); }
Toliau pagal pagrindinę funkciją turime keturis kintamuosius. Du iš jų naudojami ADC vertei išsaugoti (nuo 0 iki 1024), o kiti du naudojami faktinei įtampos vertei gauti.
nepasirašytas int ADC_value_1 = 0; nepasirašytas int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_įtampa_2 = 0;
Tada turime paruošti GPIO kaiščius ir laikrodžio konfigūraciją, kad galėtume nuskaityti analoginę įtampą. Čia mes nuskaitysime analoginę įtampą iš kaiščių AIN2 ir AIN6, kurie yra atitinkamai kaiščiai PC4 ir PD6. Mes turime apibrėžti šiuos kaiščius plaukiojančioje būsenoje, kaip parodyta žemiau. Mes taip pat įgalinsime laikrodžio periferinį įrenginį ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Įgalinti periferinį laikrodį ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Dabar, kai kaiščiai yra paruošti, mes turime patekti į begalinį ciklą, kad galėtume nuskaityti analoginę įtampą. Kadangi mes turime savo antraštės failą, mes galime lengvai nuskaityti analoginę įtampą iš kaiščių AIN2 ir AIN 6, naudodami toliau pateiktas eilutes.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Kitas žingsnis yra konvertuoti šį ADC rodmenį (nuo 0 iki 1023) į analoginę įtampą. Tokiu būdu galime parodyti tikslią įtampos vertę, nurodytą kaiščiams AIN2 ir AIN6. Analoginės įtampos apskaičiavimo formules galima pateikti pagal
Analoginė įtampa = ADC rodmuo * (3300/1023)
Mūsų atveju naudojant STM8S103F3 valdiklius, mes turime ADC su 10 bitų skiriamąja geba, todėl mes panaudojome 1023 (2 ^ 10) . Taip pat dėl mūsų plėtros galia valdiklis su 3,3 V, kuris yra 3300, todėl aukščiau pateiktose formulėse mes padalijome 3300 iš 1023. Maždaug 3300/1023 suteiks mums 3,226, taigi pagal savo programą turime šias eilutes, kad galėtume išmatuoti faktinę ADC įtampą naudodami ADC įtampą.
ADC_voltage_1 = ADC_value_1 * (3,226); // (3300/1023 = ~ 3,226) konvertuoti 1 ADC vertę į 0 į 3300mV ADC_voltage_2 = ADC_value_2 * (3,226); // konvertuoti 1 ADC vertę į 0 į 3300mV
Likusi kodo dalis naudojama tik šioms keturioms vertėms rodyti LCD ekrane. Mes taip pat turime 500 ms vėlavimą, kad LCD ekranas būtų atnaujinamas kas 500 mS. Jei norite greičiau atnaujinti, galite tai dar labiau sumažinti.
Analoginės įtampos nuskaitymas iš dviejų potenciometrų naudojant STM8S
Sudarykite kodą ir įkelkite jį į savo kūrimo lentą. Jei gausite kompiliavimo klaidą, įsitikinkite, kad pridėjote visus antraštės failus ir šaltinio failus, kaip aptarta anksčiau. Įkėlus kodą, turėtumėte pamatyti mažą pasveikinimo pranešimą su užrašu „ADC on STM8S“, tada turėtumėte pamatyti žemiau esantį ekraną.
D1 ir D2 reikšmės nurodo ADC vertę atitinkamai iš kaiščių Ain2 ir AIN6. Dešinėje pusėje taip pat rodomos lygiavertės įtampos vertės. Ši vertė turėtų būti lygi įtampai, atsirandančiai atitinkamai ant kaiščių AIN2 ir AIN6. Tą patį galime patikrinti naudodami multimetrą, taip pat galime keisti potenciometrus, kad patikrintume, ar įtampos vertė taip pat keičiasi.
Pilną darbą taip pat galite rasti žemiau esančiame vaizdo įraše. Tikiuosi, kad jums patiko pamoka ir sužinojote ką nors naudingo, jei turite klausimų, palikite juos toliau pateiktame komentarų skyriuje. Taip pat galite naudoti mūsų forumus diskusijoms pradėti ar kitiems techniniams klausimams paskelbti.