{"id":3520,"date":"2020-02-23T20:49:46","date_gmt":"2020-02-23T19:49:46","guid":{"rendered":"http:\/\/arduino.net.pl\/?p=3520"},"modified":"2020-02-24T23:40:59","modified_gmt":"2020-02-24T22:40:59","slug":"mierzymy-napiecie-zasilajace-atmega328p","status":"publish","type":"post","link":"https:\/\/arduino.net.pl\/index.php\/mierzymy-napiecie-zasilajace-atmega328p\/","title":{"rendered":"Mierzymy napi\u0119cie zasilaj\u0105ce ATmega328P"},"content":{"rendered":"\n<p>Jak sprawdzi\u0107 czy bateria zasilaj\u0105ca nasz\u0105 ATmeg\u0119328P wymaga do\u0142adowania, zw\u0142aszcza gdy czujnik z procesorem jest poza domem? Najlepiej, \u017ceby sprawdza\u0142 co jaki\u015b czas napi\u0119cie baterii i przesy\u0142a\u0142 dane (na przyk\u0142ad przez sie\u0107 opart\u0105 o <a href=\"http:\/\/arduino.net.pl\/index.php\/siec-radiowa-nrf24l01\/\">nRF24l01<\/a>) do bazy. Aby tego dokona\u0107 potrzebujemy programu, kt\u00f3ry odczyta warto\u015b\u0107 napi\u0119cia, odnosz\u0105c je do wewn\u0119trzego napi\u0119cia ~1.1V.  Jak okre\u015bli\u0107 dok\u0142adn\u0105 warto\u015b\u0107 napi\u0119cia referencyjnego pokazywa\u0142em w <a href=\"http:\/\/arduino.net.pl\/index.php\/mierzenie-napiecia-zasilania-w-stosunku-do-wewnetrznego-napiecia-odniesienia-aref-11v\/\">tym artykule<\/a>.<\/p>\n\n\n\n<p><br>\u017br\u00f3d\u0142o-&gt; <a href=\"https:\/\/arduino.stackexchange.com\/questions\/16352\/measure-vcc-using-1-1v-bandgap\">https:\/\/arduino.stackexchange.com\/questions\/16352\/measure-vcc-using-1-1v-bandgap<\/a><br>Skecz poni\u017cej nie podaje dok\u0142adnych warto\u015bci napi\u0119cia, u mnie napi\u0119cie z baterii mierzone na wej\u015bciu, kt\u00f3re wynosi 3.95 V program odczytuje jako 3.06, a graniczne dla dzia\u0142ania ATmega328P 2.77 V jako 2.71. Nie w czym tkwi b\u0142\u0105d, ale dla sprawdzenia niebezpiecznego dla ogniwa spadku napi\u0119cia to absolutnie wystarczy.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: cpp; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\nint readBandGap() {\n  ADMUX = (B01 &lt;&lt; REFS0)    \/\/ VCC\n        | (0 &lt;&lt; ADLAR)      \/\/ right-adjusted result\n        | (B011110 &lt;&lt; MUX0) \/\/ 1.1V\n        ;\n  \/\/ switch off any ADC conversion\n  ADCSRA &amp;= ~(1 &lt;&lt; ADEN);\n  \/\/ enable ADC\n  ADCSRA |= 1 &lt;&lt; ADEN;\n  \/\/ start ADC\n  ADCSRA |= 1 &lt;&lt; ADSC;\n  \/\/ wait until finished\n  while (bit_is_set(ADCSRA, ADSC));\n  \/\/ first read low, then high!\n  uint8_t low = ADCL;\n  uint8_t high = ADCH;\n  \/\/ switch off any ADC conversion\n  ADCSRA &amp;= ~(1 &lt;&lt; ADEN);\n  return (high &lt;&lt; 8) | low;\n}\n\nvoid setup() {\n  Serial.begin(9600);\n}\n\nvoid loop() {\n  int value = readBandGap();\n  float vcc = 1.1 * 1023 \/ value;\n  Serial.print(value);\n  Serial.print(&quot;  &quot;);\n  Serial.println(vcc);\n\n  delay(1000);\n}\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/arduino.stackexchange.com\/questions\/16352\/measure-vcc-using-1-1v-bandgap\">https:\/\/arduino.stackexchange.com\/questions\/16352\/measure-vcc-using-1-1v-bandgap<\/a><\/li><li><a href=\"https:\/\/jeelabs.org\/2012\/05\/12\/improved-vcc-measurement\/\">https:\/\/jeelabs.org\/2012\/05\/12\/improved-vcc-measurement\/<\/a><\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Mierzenie analogowe<\/h4>\n\n\n\n<p><strong>\u0179r\u00f3d\u0142o -&gt; <a href=\"https:\/\/books.google.pl\/books?id=aE9jAgAAQBAJ&amp;pg=PA99&amp;lpg=PA99&amp;dq=jak+mierzy\u0107+bateri\u0119+arduino&amp;source=bl&amp;ots=IR87JrYeYO&amp;sig=ACfU3U2O4MBVuKqN8m5jcfQ2jjnGQ2HElA&amp;hl=en&amp;sa=X&amp;ved=2ahUKEwjS-P3p0-jnAhXnyKYKHXEVCog4ChDoATAAegQICRAB#v=onepage&amp;q=jak%20mierzy\u0107%20bateri\u0119%20arduino&amp;f=false\">Arduino. 65 praktycznych projekt\u00f3w &#8211; John Boxhall<\/a><\/strong><br>Napi\u0119cie dostarczane przez typow\u0105 now\u0105 bateri\u0119 AA zwykle wynosi oko\u0142o 1,6 V&nbsp;i z czasem spada wraz ze zu\u017cyciem baterii. System budowany w ramach tego&nbsp;projektu b\u0119dzie mierzy\u0142 napi\u0119cie i prezentowa\u0142 stan baterii za pomoc\u0105 diod&nbsp;LED. Stan baterii b\u0119dzie odczytywany za pomoc\u0105 funkcji analogRead() i konwertowany&nbsp;na warto\u015b\u0107 wyra\u017con\u0105 w woltach. Poniewa\u017c maksymalne napi\u0119cie obs\u0142ugiwane&nbsp;przez analogowy pin wej\u015bciowy wynosi 5 V, nale\u017cy podzieli\u0107 5 przez&nbsp;1024 (czyli liczb\u0119 mo\u017cliwych warto\u015bci) \u2014 w ten spos\u00f3b otrzymujemy warto\u015b\u0107&nbsp;0,0048. Oznacza to, \u017ce je\u015bli funkcja analogRead() zwr\u00f3ci na przyk\u0142ad warto\u015b\u0107&nbsp;512, nale\u017cy pomno\u017cy\u0107 t\u0119 liczb\u0119 przez 0,0048, zatem wskazanie pinu analogowego&nbsp;wyniesie 2,4576 V.<br><strong>Szkic<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; light: false; title: Kod:; toolbar: true; notranslate\" title=\"Kod:\">\nvoid setup(){\nanalogReference(INTERNAL); \/\/ wskazuje wewn\u0119trzne \u017ar\u00f3d\u0142o napi\u0119cia 1,1 V jako napi\u0119cie referencyjne\nSerial.begin(9600);\n}\nvoid loop()\n{\nint analogValue = analogRead(0);\nfloat voltage = 0.0048*analogValue;\nSerial.println(voltage);\ndelay(3000);\n}\n<\/pre><\/div>\n\n\n<p><strong>Poprawa precyzji pomiar\u00f3w sygna\u0142u analogowego za pomoc\u0105 napi\u0119cia referencyjnego<\/strong><br><br>Jak wspomnia\u0142em przy okazji omawiania projektu nr 6, funkcja analogRead() zwraca warto\u015b\u0107 proporcjonaln\u0105 do odczytanego napi\u0119cia, kt\u00f3re mo\u017ce wynosi\u0107 od 0 do 5 V. G\u00f3rna granica (5 V) to tzw. napi\u0119cie referencyjne (ang. reference voltage), czyli maksymalne napi\u0119cie akceptowane na pinie analogowym p\u0142ytki Arduino, dla kt\u00f3rego funkcja analogRead() zwraca najwy\u017csz\u0105 mo\u017cliw\u0105 warto\u015b\u0107 (r\u00f3wn\u0105 1023).<br><br>Aby podnie\u015b\u0107 precyzj\u0119 pomiar\u00f3w ni\u017cszych napi\u0119\u0107, nale\u017cy obni\u017cy\u0107 napi\u0119cie referencyjne. Je\u015bli napi\u0119cie referencyjne wynosi 5 V, funkcja analogRead() reprezentuje odczytany poziom za pomoc\u0105 warto\u015bci od 0 do 1023. Gdyby jednak budowany system mia\u0142 s\u0142u\u017cy\u0107 na przyk\u0142ad do mierzenia napi\u0119cia, kt\u00f3re nie przekracza 2 V, i gdyby tak\u017ce ten przedzia\u0142 napi\u0119cia by\u0142 reprezentowany przez warto\u015bci z przedzia\u0142u od 0 do 1023, precyzja pomiar\u00f3w by\u0142aby du\u017co wy\u017csza.<br>Okazuje si\u0119, \u017ce mo\u017cna to osi\u0105gn\u0105\u0107, stosuj\u0105c zewn\u0119trzne lub wewn\u0119trzne napi\u0119cie referencyjne (obie techniki zostan\u0105 om\u00f3wione w poni\u017cszych punktach).<br><br><strong>Stosowanie zewn\u0119trznego napi\u0119cia\u00a0referencyjnego<\/strong><br>Pierwsza metoda stosowania napi\u0119cia referencyjnego polega na u\u017cyciu pinu analogowego AREF (od ang. analog reference);<br>Nowe napi\u0119cie referencyjne mo\u017cna wprowadzi\u0107, \u0142\u0105cz\u0105c odpowiednie \u017ar\u00f3d\u0142o napi\u0119cia z pinami AREF i GND na p\u0142ytce Arduino. W ten spos\u00f3b mo\u017cna obni\u017cy\u0107 napi\u0119cie referencyjne, ale nie mo\u017cna go podnie\u015b\u0107, poniewa\u017c napi\u0119cie referencyjne pod\u0142\u0105czone do p\u0142ytki Arduino Uno nigdy nie mo\u017ce przekracza\u0107 5 V. Jednym z najprostszych sposob\u00f3w obni\u017cenia napi\u0119cia referencyjnego jest utworzenie dzielnika napi\u0119cia z\u0142o\u017conego z dw\u00f3ch rezystor\u00f3w<br><br>Najprostszym sposobem dzielenia napi\u0119cia jest dwukrotne obni\u017cenie Vwe poprzez zastosowanie dw\u00f3ch takich samych opornik\u00f3w R1 i R2, na przyk\u0142ad o warto\u015bci 10k\u03a9 ka\u017cdy. W takim przypadku warto zastosowa\u0107 rezystory z mo\u017cliwie najni\u017cszym poziomem tolerancji (na przyk\u0142ad 1%) oraz sprawdzi\u0107 rzeczywiste warto\u015bci rezystancji przy u\u017cyciu multimetru, a nast\u0119pnie potwierdzi\u0107 wszystkie parametry za pomoc\u0105 przytoczonego wzoru. Warto te\u017c umie\u015bci\u0107 kondensator 100 nF pomi\u0119dzy pinami AREF i GND, aby unikn\u0105\u0107 zak\u0142\u00f3ce\u0144 na pinie AREF, kt\u00f3re mog\u0105 powodowa\u0107 niestabilne wskazania analogowego pinu wej\u015bciowego.<br><br>W przypadku zastosowania zewn\u0119trznego napi\u0119cia referencyjnego nale\u017cy umie\u015bci\u0107 w funkcji void setup() w szkicu nast\u0119puj\u0105cy wiersz:<br><br>analogReference(EXTERNAL); \/\/ wskazuje pin AREF jako \u017ar\u00f3d\u0142o napi\u0119cia referencyjnego<br><br><strong>Stosowanie wewn\u0119trznego napi\u0119cia referencyjnego<\/strong><br>P\u0142ytka Arduino Uno oferuje tak\u017ce wewn\u0119trzne napi\u0119cie referencyjne na poziomie 1,1 V. Je\u015bli ten poziom napi\u0119cia jest wystarczaj\u0105cy, nie ma potrzeby stosowania \u017cadnych dodatkowych urz\u0105dze\u0144. Wystarczy umie\u015bci\u0107 w ciele funkcji void setup() nast\u0119puj\u0105cy kod:<br><br>analogReference(INTERNAL); \/\/ wskazuje wewn\u0119trzne \u017ar\u00f3d\u0142o napi\u0119cia 1,1 V jako napi\u0119cie referencyjne<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jak sprawdzi\u0107 czy bateria zasilaj\u0105ca nasz\u0105 ATmeg\u0119328P wymaga do\u0142adowania, zw\u0142aszcza gdy czujnik z procesorem jest poza domem? Najlepiej, \u017ceby sprawdza\u0142 co jaki\u015b czas napi\u0119cie baterii i przesy\u0142a\u0142 dane (na przyk\u0142ad&#8230;<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[2,3],"tags":[],"class_list":["post-3520","post","type-post","status-publish","format-standard","hentry","category-arduino","category-atmega328"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/3520","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/comments?post=3520"}],"version-history":[{"count":11,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/3520\/revisions"}],"predecessor-version":[{"id":3536,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/posts\/3520\/revisions\/3536"}],"wp:attachment":[{"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/media?parent=3520"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/categories?post=3520"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arduino.net.pl\/index.php\/wp-json\/wp\/v2\/tags?post=3520"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}