- Mga Materyal na Kinakailangan
- ADC sa STM8S103F3P6
- Circuit Diagram upang Basahin ang Mga Halaga ng ADC sa STM8S at Ipakita sa LCD
- ADC Library para sa STM8S103F3P6
- Programa ng STM8S na Basahin ang Analog Boltahe at Ipakita sa LCD
- Nagbabasa ng Boltahe ng Analog mula sa Dalawang Potensyomiter gamit ang STM8S
Kung ikaw ay isang regular na mambabasa na sumusunod sa aming mga STM8S Microcontroller Tutorials, malalaman mo na sa aming huling tutorial, natutunan namin kung paano i-interface ang isang 16x2 LCD sa STM8s. Ngayon, magpatuloy dito sa tutorial na ito, matututunan namin kung paano gamitin ang tampok na ADC sa aming STM8S103F3P6 Microcontroller. Ang isang ADC ay lubhang kapaki-pakinabang sa paligid ng isang microcontroller na kadalasang ginagamit ng mga naka-embed na programmer upang masukat ang mga yunit na patuloy na nagbabago tulad ng iba't ibang boltahe, kasalukuyang, temperatura, kahalumigmigan, atbp.
Tulad ng alam natin na "Nakatira kami sa isang analog na mundo na may mga digital na aparato", nangangahulugang lahat sa paligid natin tulad ng bilis ng hangin, lakas ng ilaw, temperatura, at lahat ng bagay na makitungo natin tulad ng bilis, tulin, presyon, atbp. Ngunit ang aming mga microcontroller at microprocessor ay mga digital device at hindi nila masusukat ang mga parameter na ito nang walang isang mahalagang paligid na tinatawag na Analog to Digital Converter (ADC). Kaya sa artikulong ito, alamin natin kung paano gamitin ang ADC sa STM8S Microcontroller na may COMIC C compiler.
Mga Materyal na Kinakailangan
Sa artikulong ito, babasahin namin ang dalawang halaga ng analog boltahe mula sa dalawang potentiometers at ipapakita ang halaga ng ADC sa isang 16x2 LCD display. Upang magawa ito, kakailanganin namin ang mga sumusunod na sangkap.
- STM8S103F3P6 Development board
- Programmer ng ST-Link V2
- 16x2 LCD
- Mga Potenometro
- Mga kumokonekta na mga wire
- 1k risistor
ADC sa STM8S103F3P6
Maraming uri ng ADC at ang bawat microcontroller ay may sariling pagtutukoy. Sa STM8S103F3P6, mayroon kaming ADC na may 5 Channel at 10-bit na resolusyon; na may isang resolusyon na 10-bit, masusukat namin ang digital na halaga mula 0 hanggang 1024 at ipinahiwatig ng isang 5 channel na ADC na mayroon kaming 5 mga pin sa Microcontroller na maaaring suportahan ang ADC, ang 5 mga pin na ito ay naka-highlight sa larawan sa ibaba.
Tulad ng nakikita mo, ang lahat ng limang mga pin na ito (AIN2, AIN3, AIN4, AIN5, at AIN6) ay multiplexed sa iba pang mga peripheral, nangangahulugang bukod sa kumikilos lamang bilang isang ADC pin, ang mga pin na ito ay maaari ding magamit para sa pagganap ng iba pang mga komunikasyon tulad ng halimbawa, ang pin 2 at 3 (AIN5 at AIN 6) ay hindi lamang magagamit para sa ADC ngunit maaari ring gamitin para sa mga serial function at GPIO function. Tandaan na hindi posible na gumamit ng parehong pin para sa lahat ng tatlong mga layunin, kaya kung ginagamit namin ang dalawang mga pin para sa ADC, kung gayon hindi namin magagawa ang serial na komunikasyon. Ang iba pang mahahalagang katangian ng ADC para sa STM8S103P36 ay matatagpuan sa talahanayan sa ibaba na kinuha mula sa datasheet.
Sa talahanayan sa itaas, ang Vdd ay kumakatawan sa operating boltahe at ang Vss ay kumakatawan sa lupa. Kaya't sa aming kaso sa aming development board, mayroon kaming microcontroller na tumatakbo sa 3.3V, maaari mong suriin ang diagram ng circuit board ng pag-unlad mula sa pagsisimula sa tutorial na STM8S. Sa pamamagitan ng 3.3V bilang operating boltahe, ang aming dalas ng orasan ng ADC ay maaaring maitakda sa pagitan ng 1 hanggang 4MHz at ang saklaw ng boltahe ng aming conversion ay nasa pagitan ng 0V hanggang 3.3V. Nangangahulugan ito na ang aming 10-bit ADC ay magbabasa ng 0 kapag ibinigay ang 0V (Vss) at magbabasa ng maximum na 1024 kapag ibinigay ang 3.3V (Vdd). Madali nating mababago ang 0-5V na ito sa pamamagitan ng pagbabago ng operating boltahe ng MCU kung kinakailangan.
Circuit Diagram upang Basahin ang Mga Halaga ng ADC sa STM8S at Ipakita sa LCD
Ang kumpletong diagram ng circuit na ginamit sa proyektong ito ay ibinibigay sa ibaba, halos kapareho ito ng STM8S LCD tutorial na tinalakay namin dati.
Tulad ng nakikita mo, ang tanging mga karagdagang bahagi bukod sa LCD ay dalawang potensyom na POT_1 at POT_2 . Ang mga kaldero na ito ay konektado sa mga port ng PC4 at PD6, na kung saan ay ang mga ANI2 at ANI6 na pin tulad ng tinalakay sa pinout na imahe nang mas maaga.
Ang mga potentiometers ay konektado sa isang paraan na kapag binago namin ito, makakakuha kami ng 0-5 V sa aming mga analog na pin. Isusuportahan namin ang aming controller upang mabasa ang analog boltahe na ito sa digital na halaga (0 hanggang 1024) at ipakita ito sa LCD screen. Pagkatapos ay makakalkula din namin ang katumbas na halaga ng boltahe at ipakita ito sa LCD, tandaan na ang aming controller ay pinalakas ng 3.3V, kaya kahit na magbigay kami ng 5V sa ADC pin, makakabasa lamang ito mula 0V hanggang 3.3V.
Kapag tapos na ang mga koneksyon, ganito ang hitsura ng aking hardware tulad ng ipinakita sa ibaba. Maaari mong makita ang dalawang potentiometers sa kanan at ang programmer ng ST-link sa kaliwa.
ADC Library para sa STM8S103F3P6
Upang mai-program para sa mga pagpapaandar ng ADC sa STM8S, gagamitin namin ang tagatala ng Cosmic C kasama ang mga aklatan ng SPL. Ngunit para sa gawing mas madali ang mga proseso, gumawa ako ng isa pang file ng header na maaaring matagpuan sa GitHub na may link sa ibaba.
ADC library para sa STM8S103F3P6
Kung alam mo kung ano ang iyong ginagawa, maaari kang lumikha ng isang header file gamit ang code sa itaas at idagdag ito sa direksyong "isama ang mga file" sa iyong pahina ng proyekto. Sundin pa ang pagsisimula sa tutorial ng STM8S upang malaman kung paano i-set-up ang iyong kapaligiran sa programa at tagatala. Kapag handa na ang iyong pag-set up, ang iyong IDE ay dapat magkaroon ng mga sumusunod na mga file ng header, hindi bababa sa mga na nakapaloob sa pula.
Ang file ng header sa itaas ay binubuo ng isang pagpapaandar na tinatawag na ADC_Read () . Ang pagpapaandar na ito ay maaaring tawagan sa iyong pangunahing programa upang makuha ang halaga ng ADC sa anumang pin. Halimbawa, ibabalik ng ADC_Read (AN2) ang halaga ng ADC sa pin AN2 bilang resulta. Ang pagpapaandar ay ipinapakita sa ibaba.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int resulta = 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 (I-ENABLE); ADC1_StartConversion (); habang (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == MALI); resulta = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Tulad ng nakikita mo, maaari naming ipasa ang walong mga parameter sa pagpapaandar na ito at tinutukoy nito kung paano naka-configure ang ADC. Sa aming code ng library sa itaas, itinakda namin ang mode ng conversion sa tuluy-tuloy at pagkatapos ay maipasa ang isang numero ng channel sa isang parameter. At pagkatapos ay kailangan naming itakda ang dalas ng CPU ng aming controller, bilang default (kung hindi mo nakakonekta ang isang panlabas na kristal), gagana ang iyong STM8S sa isang 16Mhz internal oscillator. Kaya nabanggit namin ang " ADC1_PRESSEL_FCPU_D18 " bilang pre-scaler na halaga. Sa loob ng pagpapaandar na ito, gumagamit kami ng iba pang mga pamamaraan na tinukoy ng SPL stm8s_adc1.h header file. Nagsisimula kami sa pamamagitan ng De-simula ng mga pin ng ADC at pagkatapos ay ADC1_Init () upang simulan ang peripheral ng ADC. Ang kahulugan ng pagpapaandar na ito mula sa manwal ng gumagamit ng SPL ay ipinapakita sa ibaba.
Susunod, itinakda namin ang panlabas na pag-trigger gamit ang isang timer at huwag paganahin ang panlabas na pag-trigger dahil hindi namin ito gagamitin dito. At pagkatapos ay itinakda namin ang pagkakahanay na nakatakda sa kanan at ang huling dalawang mga parameter ay ginagamit upang itakda ang Schmitt gatilyo, ngunit idi-disable namin ito para sa tutorial na ito. Kaya, upang mailagay itong maikli, gagawin namin ang aming ADC na nagtatrabaho sa tuluy-tuloy na mode ng conversion sa kinakailangang ADC pin na may panlabas na pag-trigger at hindi pinagana ang pag-trigger ng Schmitt. Maaari mong suriin ang datasheet kung kailangan mo ng karagdagang impormasyon tungkol sa kung paano gamitin ang panlabas na pag-trigger o pagpipiliang Schmitt trigger, hindi namin tatalakayin ito sa tutorial na ito.
Programa ng STM8S na Basahin ang Analog Boltahe at Ipakita sa LCD
Ang kumpletong code na ginamit sa main.c file ay matatagpuan sa ilalim ng pahinang ito. Matapos idagdag ang kinakailangang mga file ng header at mga mapagkukunan ng file, dapat na direktang maisaayos ang pangunahing file. Ang paliwanag ng code sa pangunahing file ay ang mga sumusunod. Hindi ko ipaliwanag ang programa ng STM8S LCD dahil tinalakay na natin iyon sa nakaraang tutorial.
Ang layunin ng code ay upang basahin ang mga halaga ng ADC mula sa dalawang mga pin at i-convert ito sa isang halaga ng boltahe. Ipapakita rin namin ang parehong halaga ng ADC at halaga ng Boltahe sa LCD. Kaya, gumamit ako ng isang pagpapaandar na tinatawag na LCD_Print Var na tumatagal ng isang variable sa integer format at binago ito sa isang character upang maipakita ito sa LCD. Ginamit namin ang simpleng modulus (%) at hatiin (/) ang mga operator upang makuha ang bawat digit mula sa variable at ilagay sa mga variable tulad ng d1, d2, d3, at d4 tulad ng ipinakita sa ibaba. Pagkatapos ay maaari naming gamitin ang pagpapaandar ng LCD_Print_Char upang ipakita ang mga character na ito sa LCD.
walang bisa ang 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); }
Susunod sa ilalim ng pangunahing pag-andar, mayroon kaming apat na variable na idineklara. Dalawa sa mga ito ang ginagamit upang mai-save ang halaga ng ADC (0 hanggang 1024) at ang dalawa pa ay ginagamit upang makuha ang aktwal na halaga ng boltahe.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Susunod, kailangan naming ihanda ang mga GPIO pin at pagsasaayos ng orasan upang mabasa ang boltahe ng analog. Babasahin namin ang analog boltahe mula sa mga pin na AIN2 at AIN6 na mga pin na PC4 at PD6 ayon sa pagkakabanggit. Kailangan nating tukuyin ang pin na ito sa isang lumulutang na estado tulad ng ipinakita sa ibaba. Papaganahin din namin ang orasan na peripheral para sa ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, I-ENABLE); // Paganahin ang Peripheral Clock para sa ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Ngayon na handa na ang mga pin, kailangan naming makarating sa walang hanggan habang loop upang mabasa ang boltahe ng analog. Dahil mayroon kaming aming header file, madali naming mabasa ang analog boltahe mula sa mga pin na AIN2 at AIN 6 gamit ang mga linya sa ibaba.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Ang susunod na hakbang ay upang baguhin ang pagbabasa ng ADC na ito (0 hanggang 1023) sa isang boltahe ng analog. Sa ganitong paraan, maipapakita natin ang eksaktong halaga ng boltahe na ibinigay upang i-pin ang AIN2 at AIN6. Ang mga formula upang makalkula ang Analog Voltage ay maaaring ibigay ng-
Analog Boltahe = Pagbasa ng ADC * (3300/1023)
Sa aming kaso sa mga Controller ng STM8S103F3, mayroon kaming isang ADC na may 10-bit na resolusyon, kaya ginamit namin ang 1023 (2 ^ 10) . Gayundin sa aming pag-unlad na kapangyarihan ang controller na may 3.3V na kung saan ay 3300, kaya hinati namin ang 3300 ng 1023 sa mga nabanggit na formula. Humigit-kumulang na 3300/1023 ang magbibigay sa amin ng 3.226, kaya sa aming programa, mayroon kaming mga sumusunod na linya upang masukat ang aktwal na boltahe ng ADC gamit ang boltahe ng ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) convert ang halaga ng ADC 1 hanggang 0 hanggang 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // convert ADC value 1 to 0 to 3300mV
Ang natitirang bahagi ng code ay ginagamit lamang upang maipakita ang apat na halagang ito sa LCD screen. Mayroon din kaming pagkaantala ng 500ms upang ang LCD ay nai-update para sa bawat 500mS. Maaari mo itong bawasan pa kung kailangan mo ng mas mabilis na mga pag-update.
Nagbabasa ng Boltahe ng Analog mula sa Dalawang Potensyomiter gamit ang STM8S
Compile ang code at i-upload ito sa iyong development board. Kung nakakuha ka ng anumang error sa pag-iipon, tiyaking naidagdag mo ang lahat ng mga file ng header at mga mapagkukunang file tulad ng tinalakay kanina. Kapag na-upload na ang code, dapat kang makakita ng isang maliit na maligayang mensahe na nagsasabing "ADC sa STM8S" at pagkatapos ay dapat mong makita ang screen sa ibaba.
Ang halagang D1 at D2 ay nagpapahiwatig ng halaga ng ADC mula sa pin Ain2 at AIN6 ayon sa pagkakabanggit. Sa kanang bahagi, mayroon din kaming katumbas na mga halaga ng boltahe na ipinakita. Ang halagang ito ay dapat na katumbas ng boltahe na lumilitaw sa pin AIN2 at AIN6 ayon sa pagkakabanggit. Maaari nating suriin ang pareho gamit ang isang multimeter, maaari din nating iba-iba ang mga potentiometers upang suriin kung ang halaga ng boltahe ay nagbabago din nang naaayon.
Ang kumpletong pagtatrabaho ay matatagpuan din sa video sa ibaba. Inaasahan kong nasiyahan ka sa tutorial at natutunan ang isang bagay na kapaki-pakinabang, kung mayroon kang anumang mga katanungan, iwanan ang mga ito sa seksyon ng komento sa ibaba. Maaari mo ring gamitin ang aming mga forum upang magsimula ng isang talakayan o mag-post ng iba pang mga teknikal na katanungan.