- Paghahambing ng ADC sa Arduino at STM32F103C8
- ADC sa STM32
- Kung paano ang isang Analog Signal ay na-convert sa Digital Format
- Mga ADC Pins sa STM32F103C8T6
- Kinakailangan ang Mga Bahagi
- Circuit Diagram at Paliwanag
- Programming STM32 para sa pagbabasa ng mga halagang ADC
Ang isang karaniwang tampok na ginagamit sa halos bawat naka-embed na application ay ang ADC module (Analog to Digital Converter). Ang Mga Analog na ito sa mga digital na Converter ay maaaring basahin ang boltahe mula sa mga analog sensor tulad ng Temperatura sensor, Ikiling sensor, Kasalukuyang sensor, Flex sensor at marami pa. Kaya sa tutorial na ito matututunan natin kung paano gamitin ang ADC sa STM32F103C8 upang mabasa ang Analog voltages gamit ang Energia IDE. Kami ay interface ng isang maliit na potensyomiter sa STM32 Blue Pill board at magbigay ng isang iba't ibang boltahe sa isang Analog pin, basahin ang boltahe at ipakita ito sa 16x2 LCD screen.
Paghahambing ng ADC sa Arduino at STM32F103C8
Sa Arduino board, naglalaman ito ng isang 6 na channel (8 mga channel sa Mini at Nano, 16 sa Mega), 10-bit ADC na may saklaw na input na boltahe na 0V – 5V. Nangangahulugan ito na mai-map ang mga voltages ng pag-input sa pagitan ng 0 at 5 volts sa mga halaga ng integer sa pagitan ng 0 at 1023. Ngayon sa kaso ng STM32F103C8 mayroon kaming 10 mga channel, 12-Bit ADC na may isang saklaw ng pag-input na 0V -3.3V. Ipapaskil nito ang mga voltages ng pag-input sa pagitan ng 0 at 3.3 volts sa mga halaga ng integer sa pagitan ng 0 at 4095.
ADC sa STM32
Ang ADC na naka-embed sa STM32 microcontrollers ay gumagamit ng prinsipyo ng SAR (sunud-sunod na approximation register), kung saan isinasagawa ang conversion sa maraming mga hakbang. Ang bilang ng mga hakbang sa pag-convert ay katumbas ng bilang ng mga piraso sa converter ng ADC. Ang bawat hakbang ay hinihimok ng orasan ng ADC. Ang bawat orasan ng ADC ay gumagawa ng kaunti mula sa resulta hanggang sa output. Ang panloob na disenyo ng ADC ay batay sa pamamaraan ng switch-capacitor. Kung bago ka sa STM32, pagkatapos ay mag-checkout sa aming Pagsisimula sa tutorial na STM32.
12-bit na Resolusyon
Ang ADC na ito ay isang 10 channel na 12 -bit ADC. Dito ipinapahiwatig ng term na 10 channel na mayroong 10 mga ADC pin gamit ang kung saan maaari naming sukatin ang analog boltahe. Ang term na 12-bit ay nagpapahiwatig ng resolusyon ng ADC. Ang 12-bit ay nangangahulugang 2 sa lakas ng sampu (2 12) na kung saan ay 4096. Ito ang bilang ng mga sample na hakbang para sa aming ADC, kaya ang saklaw ng aming mga halagang ADC ay mula 0 hanggang 4095. Ang halaga ay tataas mula 0 hanggang 4095 batay sa halaga ng boltahe bawat hakbang, na maaaring kalkulahin sa pamamagitan ng formula
VOLTAGE / STEP = REFERENSYA VOLTAGE / 4096 = (3.3 / 4096 = 8.056mV) bawat yunit.
Kung paano ang isang Analog Signal ay na-convert sa Digital Format
Tulad ng pag-iimbak at pagproseso ng mga computer lamang ng mga halagang binary / digital (1 at 0). Kaya't ang mga signal ng analog tulad ng output ng sensor sa volts ay dapat na mai-convert sa mga digital na halaga para sa pagpoproseso at ang pag-convert ay kailangang maging tumpak. Kapag ang isang input analog voltage ay ibinibigay sa STM32 sa mga input ng Analog nito, ang analog na halaga ay nababasa at nakaimbak sa isang integer variable. Ang naimbak na halaga ng Analog (0-3.3V) ay na-convert sa mga halaga ng integers (0-4096) gamit ang formula sa ibaba:
INPUT VOLTAGE = (Halaga ng ADC / Resolusyon ng ADC) * Boltahe ng Sanggunian
Resolusyon = 4096
Sanggunian = 3.3V
Mga ADC Pins sa STM32F103C8T6
Mayroong 10 Mga Analog Pins sa STM32 mula PA0 hanggang PB1.
Suriin din kung paano gamitin ang ADC sa iba pang mga Microcontroller:
- Paano Gumamit ng ADC sa Arduino Uno?
- Ang interfacing ADC0808 sa 8051 Microcontroller
- Paggamit ng ADC Module ng PIC Microcontroller
- Tutorial ng Raspberry Pi ADC
- Paano gamitin ang ADC sa MSP430G2 - Pagsukat ng Boltahe ng Analog
Kinakailangan ang Mga Bahagi
- STM32F103C8
- LCD 16 * 2
- Potensyomiter 100k
- Breadboard
- Mga kumokonekta na mga wire
Circuit Diagram at Paliwanag
Ang circuit diagram upang interface 16 * 2 LCD at Analog Input sa isang STM32F103C8T6 board ay ipinapakita sa ibaba.
Ang mga koneksyon na tapos para sa LCD ay ibinibigay sa ibaba:
LCD Pin Hindi |
Pangalan ng LCD Pin |
Pangalan ng STM32 Pin |
1 |
Lupa (Gnd) |
Lupa (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin mula sa Center of Potentiometer |
4 |
Pagpili ng Rehistro (RS) |
PB11 |
5 |
Basahin / Isulat (RW) |
Lupa (G) |
6 |
Paganahin (EN) |
PB10 |
7 |
Data Bit 0 (DB0) |
Walang Koneksyon (NC) |
8 |
Data Bit 1 (DB1) |
Walang Koneksyon (NC) |
9 |
Data Bit 2 (DB2) |
Walang Koneksyon (NC) |
10 |
Data Bit 3 (DB3) |
Walang Koneksyon (NC) |
11 |
Data Bit 4 (DB4) |
PB0 |
12 |
Data Bit 5 (DB5) |
PB1 |
13 |
Data Bit 6 (DB6) |
PC13 |
14 |
Data Bit 7 (DB7) |
PC14 |
15 |
Positive na LED |
5V |
16 |
Negatibo sa LED |
Lupa (G) |
Ang mga koneksyon ay ginawa ayon sa nabanggit na talahanayan sa itaas. Mayroong dalawang Potentiometers na naroroon sa circuit, ang una ay ginagamit para sa voltage divider na maaaring magamit upang mag-iba ang boltahe at magbigay ng input ng analog sa STM32. Ang kaliwang pin ng potensyomiter na ito ay nakakakuha ng positibong boltahe ng pag-input mula sa STM32 (3.3V) at ang kanang pin ay konektado sa lupa, ang gitnang pin ng potensyomiter ay konektado sa analog input pin (PA7) ng STM32. Ang iba pang potensyomiter ay ginagamit upang ibahin ang kaibahan ng LCD display. Ang mapagkukunan ng kuryente para sa STM32 ay ibinibigay sa pamamagitan ng USB power supply mula sa isang PC o Laptop.
Programming STM32 para sa pagbabasa ng mga halagang ADC
Sa aming nakaraang tutorial, nalaman namin ang tungkol sa Programming STM32F103C8T6 Board gamit ang USB Port. Kaya hindi namin kailangan ang isang programmer ng FTDI ngayon. Ikonekta lamang ito sa PC sa pamamagitan ng USB port ng STM32 at simulan ang programa sa ARDUINO IDE. Ang pagprograma ng iyong STM32 sa ARDUINO IDE upang mabasa ang analog boltahe ay napaka-simple. Ito ay katulad ng board ng arduino. Hindi na kailangang baguhin ang mga jumper pin ng STM32.
Sa program na ito ay basahin ang halaga ng analog at kalkulahin ang boltahe sa halagang iyon at pagkatapos ay ipakita ang pareho, mga analog at digital na halaga, sa LCD screen.
Unang tukuyin out LCD pin. Tinutukoy nito kung aling pin ng STM32 ang mga LCD pin ay konektado. Maaari mong baguhin ayon sa iyong mga kinakailangan.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // banggitin ang mga pangalan ng pin na may LCD ay konektado sa
Susunod, isinasama namin ang header file para sa LCD display. Tinatawag nito ang silid-aklatan na naglalaman ng code para sa kung paano dapat makipag-usap ang STM32 sa LCD. Siguraduhin din na ang function na Liquid Crystal ay tinatawag na may mga pangalan ng pin na tinukoy lamang namin sa itaas.
# isama
Sa loob ng pag- andar ng pag- setup () , bibigyan lamang namin ang isang intro message upang maipakita sa LCD screen. Maaari mong malaman ang tungkol sa interfacing LCD sa STM32.
lcd.begin (16, 2); // Gumagamit kami ng isang 16 * 2 LCD lcd.clear (); // I-clear ang screen lcd.setCursor (0, 0); // Sa unang hilera unang haligi lcd.prin t ("CIRCUITDIGEST"); // Print this lcd.setCursor (0, 1); // Sa secound row first colum n lcd.print ("STM32F103C8"); // I-print ang thi s delay (2000); // wait for two secounds lcd.clear (); // I-clear ang screen lcd.setCursor (0, 0); // Sa unang hilera unang haligi lcd.print ("USING ADC IN"); // I-print ang lcd.setCursor (0,1); // Sa ligaw na hilera unang haligi lcd.print ("STM32F103C8"); // I-print ang pagkaantala na ito (2000); // wait for two secounds lcd.clear (); // I-clear ang screen
Sa wakas, sa loob ng aming walang katapusang pag- andar ng loop () , nagsisimula kaming basahin ang analog boltahe na ibinibigay sa PA7 pin mula sa potensyomiter. Tulad ng tinalakay na namin, ang microcontroller ay isang digital na aparato at hindi nito mabasa nang direkta ang antas ng mga voltages. Gamit ang diskarteng SAR ang antas ng boltahe ay nai-map mula 0 hanggang 4096. Ang mga halagang ito ay tinatawag na mga halaga ng ADC, upang makuha ang halagang ADC na ito, gamitin lamang ang sumusunod na linya
int val = analogRead (A7); // basahin ang halaga ng ADC mula sa pin PA 7
Narito ang pag- andar na analogRead () ay ginagamit upang basahin ang halaga ng analog ng pin. Sa wakas ay nai-save namin ang halagang ito sa isang variable na tinatawag na " val ". Ang uri ng variable na ito ay integer dahil makakakuha lamang kami ng mga halagang mula 0 hanggang 4096 upang maiimbak sa variable na ito.
Ang susunod na hakbang ay upang makalkula ang halaga ng boltahe mula sa halaga ng ADC. Upang magawa ito mayroon kaming mga sumusunod na formula
Boltahe = (Halaga ng ADC / Resolusyon ng ADC) * Sanggunian na Boltahe e
Sa aming kaso alam na namin na ang resolusyon ng ADC ng aming microcontroller ay 4096. Ang halaga ng ADC ay matatagpuan din sa nakaraang linya at naimbak ang variable na tinatawag na val. Ang boltahe ng sanggunian ay katumbas ng boltahe kung saan tumatakbo ang microcontroller. Kapag ang board ng STM32 ay pinalakas sa pamamagitan ng USB cable kung gayon ang operating boltahe ay 3.3V. Maaari mo ring sukatin ang operating boltahe sa pamamagitan ng paggamit ng isang multimeter sa kabuuan ng Vcc at ground pin sa pisara. Kaya ang pormula sa itaas ay umaangkop sa aming kaso tulad ng ipinakita sa ibaba
float boltahe = (float (val) / 4096) * 3.3; // formula upang mai-convert ang halaga ng ADC sa voltag e
Maaaring malito ka sa line float (val). Ginagamit ito upang mai - convert ang variable na "val" mula sa int data type hanggang sa "float" na uri ng data. Kailangan ang conversion na ito dahil lamang kung makuha namin ang resulta ng val / 4096 sa float maaari natin itong i-multiply ng 3.3. Kung ang halaga ay natanggap sa integer palagi itong magiging 0 at ang resulta ay magiging zero din. Kapag nakalkula namin ang halaga ng ADC at boltahe, ang natitira lamang ay upang ipakita ang resulta sa LCD screen na maaaring gawin sa pamamagitan ng paggamit ng mga sumusunod na linya
lcd.setCursor (0, 0); // itakda ang cursor sa haligi 0, linya 0 lcd.print ("ADC Val:"); lcd.print (val); // Ipakita ang halaga ng ADC lcd.setCursor (0, 1); // itakda ang cursor sa haligi 0, linya 1 lcd.print ("Boltahe:"); lcd.print (boltahe); // Display boltahe
Ang kumpletong code at Demonstration Video ay ibinibigay sa ibaba.