Multichannel voltmeter sa arduino uno na may PC. Digital voltmeter sa Arduino na may koneksyon sa PC sa pamamagitan ng serial port

Hello, Habr! Ngayon gusto kong ipagpatuloy ang paksa ng "pagtawid" sa arduino at android. SA nakaraang publikasyon Napag-usapan ko ang tungkol sa bluetooth machine, at ngayon ay pag-uusapan natin ang tungkol sa DIY bluetooth voltmeter. Ang isa pang ganoong aparato ay maaaring tawaging isang matalinong voltmeter, isang "matalinong" voltmeter, o isang matalinong voltmeter lamang, nang walang mga panipi. Ang apelyido ay hindi tama mula sa punto ng view ng Russian grammar, gayunpaman, ito ay madalas na matatagpuan sa media. Magkakaroon ng boto sa paksang ito sa dulo ng artikulo, ngunit iminumungkahi kong magsimula sa isang pagpapakita ng pagpapatakbo ng device upang maunawaan kung tungkol saan ang artikulo.


Disclaimer: ang artikulo ay inilaan para sa karaniwang mahilig sa arduino na karaniwang hindi pamilyar sa programming para sa Android, samakatuwid, tulad ng sa nakaraang artikulo, gagawa kami ng isang application para sa isang smartphone gamit ang isang visual development environment. android application App Imbentor 2.
Upang makagawa ng isang DIY bluetooth voltmeter, kailangan nating magsulat ng dalawang medyo independiyenteng mga programa: isang sketch para sa Arduino at isang application para sa Android Magsimula tayo sa isang sketch.
Una, dapat mong malaman na mayroong tatlong pangunahing mga opsyon para sa pagsukat ng boltahe gamit ang Arduino, hindi alintana kung saan mo kailangan i-output ang impormasyon: sa com port, sa isang screen na konektado sa Arduino, o sa isang smartphone.
Unang kaso: mga sukat ng boltahe hanggang 5 volts. Dito, sapat na ang isa o dalawang linya ng code, at ang boltahe ay direktang ibinibigay sa pin A0:
int value = analogRead(0); // basahin ang mga pagbabasa mula sa A0
boltahe = (halaga / 1023.0) * 5; // true lang kung Vcc = 5.0 volts
Pangalawang kaso: upang sukatin ang mga boltahe na higit sa 5 volts, ginagamit ang isang divider ng boltahe. Ang circuit ay napaka-simple, at gayon din ang code.

Sketch

int analogInput = A0;
float val = 0.0;
float boltahe = 0.0;
lumutang R1 = 100000.0; //Baterya Vin-> 100K -> A0
lumutang R2 = 10000.0; //Baterya Gnd -> Arduino Gnd at Arduino Gnd -> 10K -> A0
int value = 0;

Void setup() (
Serial.begin(9600);
pinMode(analogInput, INPUT);
}

Void loop() (
halaga = analogRead(analogInput);
val = (value * 4.7) / 1024.0;
boltahe = val / (R2/(R1+R2));
Serial.println(boltahe);
pagkaantala(500);
}


Arduino Uno
Bluetooth module
Pangatlong kaso. Kapag kailangan mong makakuha ng mas tumpak na impormasyon tungkol sa boltahe, dapat mong gamitin bilang isang reference na boltahe hindi ang supply ng boltahe, na maaaring bahagyang mag-iba kapag pinalakas ng isang baterya, halimbawa, ngunit ang boltahe ng panloob na Arduino stabilizer na 1.1 volts Ang circuit ay pareho dito, ngunit ang code ay medyo mas mahaba. Hindi ko susuriin nang detalyado ang pagpipiliang ito, dahil ito ay mahusay na inilarawan sa mga pampakay na artikulo, ngunit ang pangalawang paraan ay sapat na para sa akin, dahil ang aking power supply ay matatag, mula sa USB port ng laptop.
Kaya't inayos namin ang pagsukat ng boltahe, ngayon ay lumipat tayo sa ikalawang kalahati ng proyekto: paglikha ng isang Android application. Gagawin namin ang application nang direkta mula sa browser sa visual development environment para sa mga Android application App Inventor 2. Pumunta sa website appinventor.mit.edu/explore, mag-log in gamit ang iyong Google account, i-click ang button na gumawa, bagong proyekto, at sa pamamagitan ng simpleng drag at drop mga elemento na nilikha namin ng isang bagay tulad ng disenyo na ito:

Ginawa kong napakasimple ang mga graphics, kung may gustong mas kawili-wiling mga graphics, hayaan mong ipaalala ko sa iyo na para dito kailangan mong gumamit ng mga .png file na may transparent na background sa halip na .jpeg file.
Pumunta ngayon sa tab na Blocks at lumikha ng logic ng application doon tulad nito:


Kung gumagana ang lahat, maaari mong i-click ang pindutang Bumuo at i-save ang .apk sa aking computer, at pagkatapos ay i-download at i-install ang application sa iyong smartphone, bagama't may iba pang mga paraan upang i-upload ang application. dito ito ay mas maginhawa para sa sinuman. Bilang resulta, natapos ko ang application na ito:


Naiintindihan ko na kakaunti ang gumagamit ng App Inventor 2 visual development environment para sa mga Android application sa kanilang mga proyekto, kaya maraming tanong ang maaaring lumabas tungkol sa pagtatrabaho dito. Upang alisin ang ilan sa mga tanong na ito, ginawa ko detalyadong video, tungkol sa kung paano gumawa ng naturang application "mula sa simula" (upang matingnan ito kailangan mong pumunta sa YouTube):

P.S. Isang koleksyon ng higit sa 100 mga materyal na pang-edukasyon sa Arduino para sa mga nagsisimula at propesyonal

Inilarawan kung paano mag-assemble ng isang homemade double voltmeter batay sa platform Arduino UNO gamit ang 1602A LCD display. Sa ilang mga kaso, kinakailangan upang sukatin ang dalawang pare-parehong boltahe nang sabay-sabay at ihambing ang mga ito. Maaaring kailanganin ito, halimbawa, kapag nag-aayos o nag-aayos ng stabilizer DC boltahe upang sukatin ang boltahe sa input at output nito, o sa iba pang mga kaso.

Diagram ng eskematiko

Gamit ang unibersal na microcontroller module na ARDUINO UNO at isang two-line na LCD display type 1602A (batay sa HD44780 controller), madali kang makakagawa ng ganoong device. Sa isang linya ipapakita nito ang boltahe U1, sa kabilang linya - ang boltahe U2.

kanin. 1. Diagram ng eskematiko dobleng voltmeter na may 1602A display sa Arduino UNO.

Ngunit, una sa lahat, nais kong ipaalala sa iyo na ang ARDUINO UNO ay isang medyo murang handa na module - isang maliit na PCB, kung saan matatagpuan ang ATMEGA328 microcontroller, pati na rin ang lahat ng "harness" nito na kinakailangan para sa operasyon nito, kabilang ang isang USB programmer at power supply.

Para sa mga hindi pamilyar sa ARDUINO UNO, ipinapayo ko sa inyo na basahin muna ang mga artikulong L.1 at L.2. Ang circuit ng isang double voltmeter ay ipinapakita sa Fig. 1. Ito ay dinisenyo upang sukatin ang dalawang boltahe mula 0 hanggang 100V (halos hanggang 90V).

Tulad ng makikita mula sa diagram, hanggang sa mga digital port na D2-D7 ARDUINO boards Ang UNO ay konektado sa liquid crystal display module H1 type 1602A. Ang LCD indicator ay pinapagana ng isang 5V voltage stabilizer na matatagpuan sa 5V voltage stabilizer board.

Ang mga sinusukat na boltahe ay ibinibigay sa dalawang analog input na A1 at A2. Mayroong anim na analog input sa kabuuan, A0-A5, maaari kang pumili ng alinman sa dalawa sa mga ito. SA sa kasong ito, A1 at A2 ang napili. Ang boltahe sa mga analog port ay maaari lamang maging positibo at nasa hanay lamang mula sa zero hanggang sa boltahe ng supply ng microcontroller, iyon ay, sa nominal, hanggang sa 5V.

Ang output ng analog port ay na-convert sa digital form ng ADC ng microcontroller. Upang makuha ang resulta sa mga yunit ng volts, kailangan mong i-multiply ito ng 5 (sa pamamagitan ng reference na boltahe, iyon ay, sa pamamagitan ng supply boltahe ng microcontroller) at hatiin ng 1024.

Upang masusukat ang mga boltahe na mas malaki kaysa sa 5V, o sa halip, mas malaki kaysa sa boltahe ng supply ng microcontroller, dahil ang aktwal na boltahe sa output ng 5-volt stabilizer sa board ng ARDUINO UNO ay maaaring mag-iba sa 5V, at karaniwan ay isang maliit na mas mababa, kailangan mong gumamit ng maginoo resistive divider sa input. Narito ang mga ito ay boltahe dividers sa mga resistors R1, R3 at R2, R4.

Sa kasong ito, upang dalhin ang mga pagbabasa ng aparato sa tunay na halaga ng boltahe ng input, kailangan mong itakda sa programa ang paghahati ng resulta ng pagsukat sa pamamagitan ng division coefficient ng resistive divider. At ang division coefficient, sabihin nating "K," ay maaaring kalkulahin gamit ang sumusunod na formula:

K = R3 / (R1+R3) o K = R4 / (R2+R4),

ayon sa pagkakabanggit para sa iba't ibang pasukan dobleng voltmeter.

Napaka-interesante na ang mga resistors sa mga divider ay hindi kinakailangang maging mataas ang katumpakan. Maaari kang kumuha ng mga ordinaryong resistor, pagkatapos ay sukatin ang kanilang aktwal na paglaban sa isang tumpak na ohmmeter, at palitan ang mga sinusukat na halaga sa formula. Makukuha mo ang value na "K" para sa isang partikular na divisor, na kakailanganing i-substitute sa formula.

Programa ng Voltmeter

Ang C++ program ay ipinapakita sa Figure 2.

kanin. 2. Source code mga programa.

Para makontrol ang LCD indicator, napagpasyahan na gumamit ng mga port D2 hanggang D7 ng ARDUINO UNO board. Sa prinsipyo, ang iba pang mga port ay posible, ngunit ito ay kung paano ako nagpasya na gamitin ang mga ito.

Para makipag-ugnayan ang indicator sa ARDUINO UNO, kailangan mong mag-load ng subroutine sa program para makontrol ito. Ang ganitong mga gawain ay tinatawag na "mga aklatan", at mayroong maraming iba't ibang "mga aklatan" sa ARDUINO UNO software package. Upang gumana sa isang LCD indicator batay sa HD44780, kailangan mo ang LiquidCrystal library. Samakatuwid, ang programa (Talahanayan 1) ay nagsisimula sa pamamagitan ng pag-load sa library na ito:

Ang linyang ito ay nagbibigay ng utos na mag-load sa ARDUINO UNO aklatang ito. Susunod, kailangan mong magtalaga ng mga port ng ARDUINO UNO na gagana sa indicator ng LCD. Pinili ko ang mga port D2 hanggang D7. Maaari kang pumili ng iba. Ang mga port na ito ay itinalaga ng linya:

LiquidCrystal led(2, 3, 4, 5, 6, 7);

Pagkatapos nito, ang programa ay nagpapatuloy sa aktwal na operasyon ng voltmeter. Upang sukatin ang boltahe, napagpasyahan na gumamit ng mga analog input na A1 at A2. Ang mga input na ito ay ibinibigay sa mga linya:

int analogInput=1;

int analogInput1=2;

Upang basahin ang data mula sa mga analog port, gamitin ang analogRead function. Ang pagbabasa ng data mula sa mga analog port ay nangyayari sa mga linya:

vout=analogRead(analogInput);

voutl=analogRead(analoglnput1);

Pagkatapos, ang aktwal na boltahe ay kinakalkula na isinasaalang-alang ang dibisyon ratio ng input boltahe divider:

volt=vout*5.0/1024.0/0.048 ;

volt1=vout1*5.0/1024.0/0.048;

Sa mga linyang ito, ang bilang na 5.0 ay ang boltahe sa output ng stabilizer ng ARDUINO UNO board. Sa isip, ito ay dapat na 5V, ngunit para sa voltmeter upang gumana nang tumpak, ang boltahe na ito ay dapat munang masukat. Ikonekta ang power source at sukatin ang +5V boltahe sa POWER connector ng board gamit ang isang medyo tumpak na voltmeter. Ano ang mangyayari, pagkatapos ay ipasok ang mga linyang ito sa halip na 5.0, halimbawa, kung mayroong 4.85V, ang mga linya ay magiging ganito:

volt=vout*4.85/1024.0/0.048;

volt1=vout1*4.85/1024.0/0.048;

Sa susunod na yugto, kakailanganin mong sukatin ang aktwal na mga paglaban ng mga resistors R1-R4 at tukuyin ang K coefficients (ipinahiwatig bilang 0.048) para sa mga linyang ito gamit ang mga formula:

K1 = R3 / (R1+R3) at K2 = R4 / (R2+R4)

Sabihin nating K1 = 0.046, at K2 = 0.051, kaya isusulat namin:

volt=vout*4.85/1024.0/0.046 ;

volt1=vout1*4.85/1024.0/0.051;

Kaya, dapat gawin ang mga pagbabago sa teksto ng programa ayon sa aktwal na boltahe sa output ng 5-volt stabilizer ng ARDUINO UNO board at ayon sa aktwal na division coefficient ng resistive divider. Pagkatapos nito, gagana nang tumpak ang device at hindi mangangailangan ng anumang pagsasaayos o pagkakalibrate.

Sa pamamagitan ng pagpapalit ng mga division coefficient ng mga resistive divider (at, nang naaayon, ang "K" coefficients), maaari kang gumawa ng iba pang mga limitasyon sa pagsukat, at hindi palaging pareho para sa parehong mga input.

Karavkin V. RK-2017-01.

Panitikan:

  1. Karavkin V. - Flasher ng Christmas tree sa ARDUINO bilang isang lunas sa takot sa mga microcontroller. RK-11-2016.
  2. Karavkin V. - Frequency meter sa ARDUINO. RK-12-2016.

Ideya

Ideya Ang mga aparato para sa pagsukat ng boltahe, kasalukuyang, kapasidad, paglabas, at maaaring pagsingil ay lumitaw nang matagal na ang nakalipas at hindi lamang para sa akin. Makakahanap ka ng maraming laruan na tinatawag na USB Tester (Doktor) para sa pagsusuri iba't ibang mga aparato mula sa USB. Medyo mas interesado ako unibersal na aparato, independiyente sa interface, ngunit idinisenyo lamang para sa ilang partikular na boltahe at agos. Halimbawa, 0 - 20.00v, 0 - 5.00a, 0 - 99.99Ah. Tulad ng para sa mga pag-andar, nakikita ko itong ganito

  • Nagpapakita ng kasalukuyang boltahe at kasalukuyang, iyon ay, isang volt-ampere meter. Sa prinsipyo, maaari mong agad na ipakita ang kapangyarihan.
  • Pagbibilang at pagpapakita ng naipon na kapasidad. Sa ampere hours at malamang sa watt hours.
  • Pagpapakita ng oras ng proseso
  • At, malamang, adjustable lower at upper voltage cut-off thresholds (discharge at charge limits)

Pag-unlad

Upang ipatupad ang mga kalkulasyon at mga sukat kailangan namin ng isang controller. Naalala ko ang ideyang ito bilang bahagi ng aking kakilala sa Arduino, kaya ang controller ay magiging isang simpleng sikat na Atmega328 at ito ay mai-program sa kapaligiran Arduino. Mula sa isang pananaw sa engineering, ang pagpipilian ay malamang na hindi ang pinakamahusay - ang controller ay medyo taba para sa gawain, at ang ADC nito ay hindi matatawag na pagsukat, ngunit... susubukan namin.

  • Hindi kami maghihinang masyado sa proyektong ito. Bilang batayan, kukuha kami ng isang handa na Module ng Arduino Pro Mini, buti na lang at handa ang mga Chinese na i-supply ang mga ito sa $1.5 retail.
  • Ang display device ay magiging isang 1602 display - isa pang $1.5. Mayroon akong opsyon na may I2C interface module, ngunit sa proyektong ito ay hindi talaga ito kailangan ($0.7).
  • Para sa kaunlaran kailangan natin development board. Sa aking kaso, ito ay isang maliit na BreadBoard para sa $1.
  • Siyempre, kakailanganin mo ang mga wire at isang bilang ng mga resistors ng iba't ibang mga halaga. Para sa isang 1602 display na walang I2C, kailangan mo ring piliin ang kaibahan - ginagawa ito sa isang variable na risistor na 2 - 20 kOhm.
  • Upang ipatupad ang isang ammeter kakailanganin mo ng shunt. Sa unang pagtatantya, maaaring ito ay isang 0.1 Ohm, 5 W risistor.
  • Upang ipatupad ang awtomatikong pag-shutdown, kakailanganin mo ng relay na may mga contact na idinisenyo para sa pinakamataas na kasalukuyang aparato at boltahe na katumbas ng boltahe ng supply. Upang makontrol ang relay kailangan mo ng isang NPN transistor at isang protective diode.
  • Papaganahin ang device mula sa isang panlabas na pinagmumulan ng kuryente, malinaw na hindi bababa sa 5 V. Kung ang suplay ng kuryente ay lubhang nag-iiba, kung gayon ang isang pinagsama-samang uri ng stabilizer 7805 ay kinakailangan din - ito ay matukoy ang boltahe ng relay.
  • Kung sakali Ang Arduino Pro Mini ay nangangailangan ng USB-TTL converter upang i-upload ang firmware.
  • Para sa pag-setup kakailanganin mo ng multimeter.

Voltmeter

Nagpapatupad ako ng isang simpleng voltmeter na may isang saklaw na humigit-kumulang 0 - 20V. Mahalaga ang tala na ito, dahil ang ADC ng aming controller ay may 10-bit na kapasidad (1024 discrete values), kaya ang error ay hindi bababa sa 0.02 V (20 / 1024). Upang ipatupad ang hardware, kailangan namin ng analog input ng controller, isang divider na gawa sa isang pares ng resistors at ilang uri ng output (isang display sa tapos na bersyon, isang serial port ay maaaring gamitin para sa pag-debug).

Ang prinsipyo ng pagsukat ng ADC ay upang ihambing ang boltahe sa analog input sa reference na VRef. Ang output ng ADC ay palaging integer - 0 ay tumutugma sa 0V, 1023 ay tumutugma sa boltahe VRef. Ang pagsukat ay ipinatupad sa pamamagitan ng pagkuha ng isang serye ng mga sunud-sunod na pagbabasa ng boltahe at pag-average sa pagitan ng mga pag-update ng halaga sa screen. Ang pagpili ng reference na boltahe ay mahalaga dahil ito ay nagde-default sa supply boltahe, na maaaring hindi stable. Hindi ito angkop sa amin - kukuha kami bilang batayan ng isang matatag na panloob na mapagkukunan ng sanggunian na may boltahe na 1.1V, na sinisimulan ito sa pamamagitan ng pagtawag sa analogReference(INTERNAL). Pagkatapos ay i-calibrate natin ang halaga nito gamit ang mga pagbabasa ng multimeter.

Ang diagram sa kaliwa ay nagpapakita ng isang variant na may direktang kontrol sa display (ito ay kontrolado lamang - tingnan ang karaniwang LiquidCrystal\HelloWorld sketch). Sa kanan ay ang opsyon na I2C, na gagamitin ko pa. Pinapayagan ka ng I2C na makatipid sa mga wire (kung saan mayroong 10 sa karaniwang bersyon, hindi binibilang ang backlight). Ngunit nangangailangan ito ng karagdagang module at mas kumplikadong pagsisimula. Sa anumang kaso, ang pagpapakita ng mga character sa module ay dapat munang suriin at ang kaibahan ay nababagay - upang gawin ito, kailangan mo lamang ipakita ang anumang teksto pagkatapos ng pagsisimula. Ang kaibahan ay inaayos ng risistor R1, o isang katulad na risistor ng module ng I2C.

Ang input ay isang 1:19 divider, na nagpapahintulot sa iyo na makakuha pinakamataas na boltahe tungkol sa 20V (karaniwang isang kapasitor + zener diode ay inilalagay parallel sa input para sa proteksyon, ngunit ito ay hindi mahalaga sa amin sa ngayon). Ang mga resistors ay may spread, at gayon din ang reference na Vref ng controller, kaya pagkatapos ng pagpupulong kailangan nating sukatin ang boltahe (hindi bababa sa supply) na kahanay sa aming device at isang reference multimeter at piliin ang Vref sa code hanggang sa tumugma ang mga pagbabasa. Kapansin-pansin din na ang anumang ADC ay may zero offset na boltahe (na sumisira sa mga pagbabasa sa simula ng hanay), ngunit hindi muna kami pupunta doon sa ngayon.

Mahalaga rin na paghiwalayin ang supply at sukatan ng lupa. Ang aming ADC ay may resolution na bahagyang mas malala kaysa sa 1mV, na maaaring lumikha ng mga problema kung ang mga wiring ay hindi tama, lalo na sa isang breadboard. Dahil ang layout ng module board ay tapos na at kailangan lang nating piliin ang mga pin. Ang module ay may ilang "ground" pin, kaya dapat nating tiyakin na ang kapangyarihan ay pumapasok sa module sa pamamagitan ng isang "ground", at mga sukat sa isa pa. Sa katunayan, para gumawa ng mga pagbabago, palagi kong ginagamit ang ground pin na pinakamalapit sa mga analog input.

Upang kontrolin ang I2C, isang bersyon ng LiquidCrystal_I2C library ang ginagamit - sa aking kaso, ang partikular na pinout ng I2C module ay ipinahiwatig (ang mga Chinese ay gumagawa ng mga module na may iba't ibang mga kontrol). Mapapansin ko rin na ang I2C sa Arduino ay nagsasangkot ng paggamit ng mga pin A4, A5 - on Pro board Mini, hindi sila matatagpuan sa gilid, na hindi maginhawa para sa prototyping sa BreadBoard.

Source code

#isama #isama // Simpleng voltmeter na may i2c display 1602. V 16.11 // Mga setting para sa i2c display 1602 na may hindi karaniwang pinout #define LCD_I2C_ADDR 0x27 #define BACKLIGHT 3 #define LCD_EN 2 #define LCD_RW 1 #define LCD_RS 0 #define LCD_RS 0 #define LCD_RS 0 #define 5 #define LCD_D6 6 #define LCD_D7 7 LiquidCrystal_I2C lcd(LCD_I2C_ADDR,LCD_EN,LCD_RW,LCD_RS,LCD_D4,LCD_D5,LCD_D6,LCD_D7); // Reading update time, ms (200-2000) #define REFRESH_TIME 330 // Analog input #define PIN_VOLT A0 // Internal reference voltage (piliin) const float Vref = 1.10; // Input resistive divider coefficient (Rh + Rl) / Rl. SA<-[ Rh ]--(analogInPin)--[ Rl ]--|GND const float VoltMult = (180.0 + 10.0) / 10.0; float InVolt, Volt; void setup() { analogReference(INTERNAL); // Инициализация дисплея lcd.begin (16, 2); lcd.setBacklightPin(BACKLIGHT, POSITIVE); lcd.setBacklight(HIGH); // включить подсветку lcd.clear(); // очистить дисплей lcd.print("Voltage"); } void loop() { unsigned long CalcStart = millis(); int ReadCnt = 0; InVolt = 0; // Чтение из порта с усреднением while ((millis() - CalcStart) < REFRESH_TIME) { InVolt += analogRead(PIN_VOLT); ReadCnt++; } InVolt = InVolt / ReadCnt; // Смещение 0 для конкретного ADC (подобрать или отключить) if (InVolt >0.2) InVolt += 3;

// Convert to volts (Value: 0..1023 -> (0..VRef) scaled by Mult) Volt = InVolt * VoltMult * VRef / 1023;

// Output data lcd.setCursor (0, 1); lcd.print(Volt); lcd.print("V "); ) Sa ilang mga karagdagan. Ang isang maliit na kilalang tampok ng Arduino at marami pang ibang AVR chips ay ang kakayahang sukatin ang panloob na 1.1 V reference na boltahe. Ang function na ito ay maaaring karaniwang boltahe ng sanggunian na 5 V (sa mga platform na may boltahe ng supply na 5 V) o 3.3 V (sa mga platform na may boltahe ng supply na 3.3 V).Maaaring siya rin ginagamit sa pagsukat Inilapat ang Vcc sa chip, na nagbibigay paraan ng kontrol boltahe ng baterya nang hindi gumagamit mahalagang mga analog na pin.

Pagganyak

At least meron hindi bababa sa dalawang dahilan para sa pagsukat supply ng boltahe aming Arduino (Vcc). Isa sa mga ito ay ang aming proyektong pinapagana ng baterya kung gusto naming bantayan ang antas ng boltahe ng baterya. Bilang karagdagan, kapag ang lakas ng baterya (Vcc) ay hindi maaaring maging 5.0 volts (halimbawa, ang kapangyarihan mula sa 3 mga cell ay 1.5 V), at gusto naming gawin mga sukat ng analog mas tumpak - dapat nating gamitin ang alinman sa panloob na 1.1 V na sanggunian o panlabas na pinagmulan reference na boltahe. Bakit?

Karaniwang ipagpalagay kapag gumagamit ng analogRead() na ang analog supply ng boltahe ng controller ay 5.0 volts, kapag sa katotohanan ay maaaring hindi ito ang kaso sa lahat (halimbawa, isang power supply mula sa 3 elemento ay 1.5 V). Ang opisyal na dokumentasyon ng Arduino ay maaaring humantong sa amin sa maling palagay na ito. Ang punto ay ang kapangyarihan ay hindi kinakailangang 5.0 volts, anuman ang kasalukuyang antas ang kapangyarihang ito ay inilalapat sa Vcc ng chip. Kung ang aming power supply ay hindi na-stabilize o kung kami ay tumatakbo sa lakas ng baterya, ang boltahe na ito ay maaaring mag-iba nang kaunti. Narito ang isang halimbawa ng code na naglalarawan ng problemang ito:

Dobleng Vcc = 5.0; // not necessarily true int value = analogRead(0); / basahin ang mga pagbabasa mula sa A0 double volt = (value / 1023.0) * Vcc; // true lang kung Vcc = 5.0 volts Upang tumpak na masukat ang boltahe, kailangan ng tumpak na reference na boltahe. Karamihan sa mga AVR chip ay nagbibigay ng tatlong sanggunian sa boltahe:

  • 1.1 in mula sa panloob na pinagmulan, sa dokumentasyon ito ay pumasa bilang isang bandgap reference (ang ilan sa mga ito ay 2.56 V, halimbawa ATMega 2560). Ang pagpili ay ginawa ng analogReference() function na may INTERNAL parameter: analogReference(INTERNAL) ;
  • panlabas na pinagmumulan ng reference na boltahe, na may label na AREF sa arduino. Piliin ang: analogReference(EXTERNAL);
  • Ang Vcc ay ang power supply ng controller mismo. Piliin ang: analogReference(DEFAULT).

Sa Arduino hindi mo lang makokonekta ang Vcc sa analog pin nang direkta - bilang default, ang AREF ay konektado sa Vcc at palagi kang makakakuha ng maximum na halaga na 1023, kahit anong boltahe ang iyong ginagamit. Ang pagkonekta sa AREF sa isang mapagkukunan ng boltahe na may dating kilala, matatag na boltahe ay nakakatulong, ngunit ito ay dagdag na elemento sa diagram.

Maaari mo ring ikonekta ang Vcc sa AREF sa pamamagitan ng diode: Ang pagbaba ng boltahe sa diode ay alam nang maaga, kaya ang pagkalkula ng Vcc ay hindi mahirap. Gayunpaman, na may tulad na isang circuit sa pamamagitan ng isang diode patuloy na dumadaloy ang kasalukuyang, nagpapaikli sa buhay ng baterya, na hindi rin masyadong maganda.

Ang isang panlabas na sanggunian ng boltahe ay ang pinakatumpak, ngunit nangangailangan ng karagdagang hardware. Ang panloob na ION ay stable ngunit hindi tumpak +/- 10% deviation. Ang Vcc ay ganap na hindi maaasahan sa karamihan ng mga kaso. Ang pagpili ng panloob na sanggunian ng boltahe ay mura at matatag, ngunit kadalasan, gusto naming sukatin ang higit pang boltahe kaysa sa 1.1V, kaya ang paggamit ng Vcc ay ang pinakapraktikal, ngunit posibleng hindi gaanong tumpak. Sa ilang mga kaso maaari itong maging lubhang hindi mapagkakatiwalaan!

Paano ito gagawin

Maraming AVR chips kabilang ang ATmega at ATtiny series ang nagbibigay ng paraan ng pagsukat ng internal reference voltage. Bakit kailangan ito? Ang dahilan ay simple - sa pamamagitan ng pagsukat ng panloob na boltahe, matutukoy natin ang halaga ng Vcc. Ganito:

  1. Itakda ang default na sanggunian ng boltahe: analogReference(DEFAULT); . Ginagamit namin ang Vcc bilang mapagkukunan.
  2. Kumuha ng mga pagbabasa ng ADC para sa panloob na 1.1 V na pinagmulan.
  3. Kalkulahin ang halaga ng Vcc batay sa 1.1 V na pagsukat gamit ang formula:

Vcc * (pagbabasa ng ADC) / 1023 = 1.1 V

Ano ang sumusunod:

Vcc = 1.1 V * 1023 / (pagbabasa ng ADC)

Pagsasama-sama ng lahat at makuha namin ang code:

mahabang readVcc() ( // Basahin ang 1.1V reference laban sa AVcc // itakda ang reference sa Vcc at ang pagsukat sa panloob na 1.1V reference #if tinukoy(__AVR_ATmega32U4__) || tinukoy(__AVR_ATmega1280__) || tinukoy(__AVR_ATmega2560__) ADMUX = . (REFS0) |. _BV(MUX3) |. _BV(MUX1); else ADMUX = _BV(MUX3) |. _BV(MUX1); #endif delay(75); ); ADCL; // dapat basahin muna ang ADCL - pagkatapos ay i-lock ang ADCH uint8_t high = ADCH;<<8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts }

Paggamit

Sinusuri ang Vcc o Boltahe ng Baterya

Maaari mong tawagan ang function na ito readVcc() kung gusto mong subaybayan ang Vcc. Ang isang halimbawa ay ang pagsuri sa antas ng singil ng baterya. Magagamit mo rin ito upang matukoy kung nakakonekta ka sa pinagmumulan ng kuryente o tumatakbo sa lakas ng baterya.

Pagsukat ng Vcc para sa reference na boltahe

Maaari mo ring gamitin ito upang makuha ang tamang halaga ng Vcc para magamit sa analogRead() kapag ginagamit mo ang reference na boltahe (Vcc). Maliban kung gagamit ka ng regulated power supply, hindi ka makatitiyak na Vcc = 5.0 volts. Binibigyang-daan ka ng function na ito na makuha ang tamang halaga. May isang caveat bagaman...

Sa isa sa mga artikulo gumawa ako ng isang pahayag na ang function na ito ay maaaring gamitin upang mapabuti ang katumpakan ng mga analog na sukat sa mga kaso kung saan ang Vcc ay hindi masyadong 5.0 volts. Sa kasamaang palad, ang pamamaraang ito ay hindi magbibigay ng tumpak na resulta. Bakit? Depende ito sa katumpakan ng sanggunian ng panloob na boltahe. Ang pagtutukoy ay nagbibigay ng nominal na boltahe na 1.1 volts, ngunit nagsasabing maaari itong mag-iba ng hanggang 10%. Ang ganitong mga sukat ay maaaring hindi gaanong tumpak kaysa sa aming Arduino power supply!

Ang pagtaas ng katumpakan

Habang ang malalaking tolerance ng panloob na 1.1V power supply ay makabuluhang nililimitahan ang katumpakan ng pagsukat kapag ginamit sa mass production, makakamit natin ang higit na katumpakan para sa mga custom na proyekto. Ito ay madaling gawin sa pamamagitan lamang ng pagsukat ng Vcc gamit ang isang voltmeter at ang aming readVcc() function. Susunod, palitan ang constant 1125300L ng bagong variable:

scale_constant = panloob1.1Ref * 1023 * 1000

panloob1.1Ref = 1.1 * Vcc1 (voltmeter_readings) / Vcc2 (readVcc_function_readings)

Ang naka-calibrate na value na ito ay magiging isang magandang indicator para sa mga sukat ng AVR chip, ngunit maaaring maapektuhan ng mga pagbabago sa temperatura. Huwag mag-atubiling mag-eksperimento sa iyong sariling mga sukat.

Konklusyon

Marami kang magagawa sa maliit na feature na ito. Maaari kang gumamit ng stable na reference na boltahe na malapit sa 5.0V nang hindi aktwal na mayroong 5.0V sa Vcc. Maaari mong sukatin ang boltahe ng iyong baterya o kahit na makita kung tumatakbo ka sa lakas ng baterya o nakatigil na kapangyarihan.

Sa wakas, susuportahan ng code ang lahat ng Arduinos, kabilang ang bagong Leonardo, pati na rin ang ATtinyX4 at ATtinyX5 series chips.

Isang kapaki-pakinabang na diagram ang ipinakita para sa mga gustong mag-eksperimento sa Arduino. Ito ay isang simpleng digital voltmeter na mapagkakatiwalaang sukatin ang boltahe ng DC sa hanay na 0 - 30V. Ang Arduino board, gaya ng dati, ay maaaring paandarin ng 9V na baterya.

Tulad ng malamang na alam mo, ang mga analog input ng Arduino ay maaaring gamitin upang sukatin ang boltahe ng DC sa hanay ng 0 - 5V at ang saklaw na ito ay maaaring tumaas,
gamit ang dalawang resistors bilang boltahe divider. Babawasan ng divider ang sinusukat na boltahe sa antas ng mga Arduino analog input. At pagkatapos ay kalkulahin ng programa ang tunay na halaga ng boltahe.

Nakikita ng analog sensor sa Arduino board ang pagkakaroon ng boltahe sa analog input at kino-convert ito sa digital form para sa karagdagang pagproseso ng microcontroller. Sa figure, ang boltahe ay ibinibigay sa analog input (A0) sa pamamagitan ng isang simpleng boltahe divider na binubuo ng mga resistors R1 (100 kOhm) at R2 (10 kOhm).

Sa mga halaga ng divider na ito, ang Arduino board ay maaaring bigyan ng boltahe mula 0 hanggang
55V. Sa input A0 mayroon kaming sinusukat na boltahe na hinati sa 11, ibig sabihin, 55V / 11=5V. Sa madaling salita, kapag nagsusukat ng 55V sa Arduino input, mayroon kaming maximum na pinahihintulutang halaga na 5V. Sa pagsasagawa, mas mainam na isulat ang saklaw na "0 - ​​30V" sa voltmeter na ito upang manatili ito
Safety margin!

Mga Tala

Kung ang mga pagbabasa ng display ay hindi tumutugma sa mga pagbabasa ng isang pang-industriya (laboratory) voltmeter, kung gayon kinakailangan upang sukatin ang halaga ng mga resistensya R1 at R2 gamit ang isang tumpak na instrumento at ipasok ang mga halagang ito sa halip na R1=100000.0 at R2=10000.0 sa program code. Pagkatapos ay dapat mong sukatin ang tunay na boltahe sa pagitan ng 5V at "Ground" na mga pin ng Arduino board gamit ang isang voltmeter ng laboratoryo. Ang resulta ay magiging isang halaga na mas mababa sa 5V, halimbawa, ito ay magiging 4.95V. Ang tunay na halaga na ito ay dapat na maipasok sa linya ng code
vout = (value * 5.0) / 1024.0 sa halip na 5.0.
Gayundin, subukang gumamit ng precision resistors na may 1% tolerance.

Ang mga resistors R1 at R2 ay nagbibigay ng ilang proteksyon laban sa tumaas na mga boltahe ng input, gayunpaman, tandaan na ang anumang mga boltahe sa itaas ng 55V ay maaaring makapinsala sa Arduino board. Bilang karagdagan, ang disenyo na ito ay hindi nagbibigay ng iba pang mga uri ng proteksyon (laban sa boltahe surge, polarity reversal o overvoltage).

Programa ng digital voltmeter

/*
DC Voltmeter
Isang Arduino DVM batay sa konsepto ng divider ng boltahe
T.K.Hareendran
*/
#isama
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
lumutang R1 = 100000.0; // paglaban ng R1 (100K) -tingnan ang teksto!
lumutang R2 = 10000.0; // paglaban ng R2 (10K) - tingnan ang teksto!
int value = 0;
void setup())(
pinMode(analogInput, INPUT);
lcd.begin(16, 2);
lcd.print("DC VOLTMETER");
}
void loop()
// basahin ang halaga sa analog input
halaga = analogRead(analogInput);
vout = (value * 5.0) / 1024.0; // tingnan ang teksto
vin = vout / (R2/(R1+R2));
kung (vin<0.09) {
vin=0.0;//statement para iwaksi ang hindi gustong pagbabasa !
}
lcd.setCursor(0, 1);
lcd.print(“INPUT V= “);
lcd.print(vin);
pagkaantala(500);
}

Schematic diagram ng Arduino-voltmeter

Listahan ng mga sangkap

Arduino Uno board
100 kOhm risistor
10 kOhm risistor
100 ohm risistor
10kOhm Trimmer Resistor
LCD display 16?2 (Hitachi HD44780)