Może się komuś przyda taki gotowiec do pomiaru wyższych napięć. Do samochodu, albo czegokolwiek bo wartość zmierzona nie musi być wyświetlana a np. użyta do porównania z założoną. Będę upraszczał jak tylko się da :D
Na początku..jak wiadomo mikrokontroler może mieć w sobie ADC (zamienia wartośc analogową na cyfrową wartość). ADC może mierzyć do wartości zasilania mikrokontrolera czyli max. 5V
Żeby wiedzieć jak sie odnieść do przyłożonego napięcia potrzebuje wzorca - punktu odniesienia (tak jak waga odważnika na szali). Tym punktem jest AREF - jego nóżka jest wyprowadzona na zewnątrz mikrokontrolera. Są różne metody ustalenia punktu odniesienia, ale w przykładzie wybrałem porównanie do napięcia zasilania. Wybiera sie je konfigurujac ADC w programie. Jeśli tak wybierzemy to napięcie już na tej nóżce tam jest i nie trzeba go podłączać do zasilania a jedynie kondensatorem "pomóc" w lepszym ustabilizowaniu.
Teraz pomiar do 20V :D Sprawa jest nieskomplikowana. Jeśli mikrokontroler może mierzyć do 5V to jeśli weźmiemy cztery TAKIE SAME rezystory to na pierwszym z odczepów patrząc od strony masy będziemy mieli 1 /4 przyłożonego napięcia. Czyli mozemy mierzyć do 20V i napięcie będzie się tam proporcjonalnie zmieniać od 5V do 0V.
"Sposób z jednakowymi rezystorami" jest szerzej stosowany i jak się przyjrzycie niektórym schematom to zobaczycie ;) i może być narysowany tak jak przykład na schemacie w ramce.
Każdy kolejny TAKI SAM rezystor to wielokrotność 5V.
PROSZĘ JEDNAK ZAWSZE UWAŻAĆ BY NIE PRZEKROCZYĆ 5V PRZYKŁADANYCH DO MIKROKONTROLERA!
Teraz już z górki
V=odczyt*(napięcie_odniesienia/1024)
To co w nawiasie to nasze AREF czyli 5V / preskaler i daje 0,0048828125 (to widać w programie jako 0,0049)
Jako że mamy podzielone napięcie przez 4 to teraz mnożymy wynik razy 4. Dla innej konfiguracji trzeba działać analogicznie :D
Tu mamy gotową wartośc napięcia która możemy użyć. Żeby ją tylko wyświetlić w przykładzie przekształciłem ją na tekst przy użyciu polecenia Fusing. Zachęcam do lektury polskiego Helpa do Bascom.
Jeszcze kilka słów o programie.
Najpierw konfiguruje porty. Dla odczytu z ADC ważne jest by ustawić dany pin jako wejśćie. Tu ważne jest PINC.0 o który będzie pytał program. ADC(0) jest na tym pinie np. w ATmega8. Dla Twojego procesora sprawdź w nocie katalogowej. Timer0 jest tak ustawiony że po odliczeniu do 124 sam sie zeruje i liczy od nowa . Zajmuje mu to 4ms i co te 4ms skacze do podprogramu Int_4ms. Tam program już dodaje te 4ms oraz dokonuje pomiaru z ADC. Pomiarów jest więcej by je uśrednić. Wyjasnia to prosty przykład.
Pierwszy odczyt 14,2 a drugi 14,8 bo napięcie delikatnie "pływa" w zalezności od tego jak je filtrujemy. Jesli dodamy wyniki do siebie i podzielimy przez ich ilośc to wyjdzie 29/2=14,5
W przykładzie pomiarów jest 16. Program z poniższego listingu przetestowałem przed chwilą osobiście więc działa :P. Skróciłem go na potrzeby prezentacji tak by wynik był odświeżany co sekunde.
$crystal = 8000000
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111110 : Portc = &B00000000 'PINC.0 ustawiony jako wejście
Config Portd = &B11000011 : Portd = &B01111111
Config Lcd = 16 * 2
Cursor Off Noblink
Cls
Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Zrodlem odniesienia bedzie napiecie zasilania
Start Adc ' dla urzadzen bateryjnych mozna ADC wlaczyc na czas pomiaru,
' tu wlaczamy odrazu
Config Timer0 = Timer , Prescale = 256 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1
Enable Compare0a : On Compare0a Int_4ms : Compare0a = 124 'mina akurat 4ms gdy zliczy 124
Dim 4ms As Byte 'licznik dla 4ms i przy 250 x 4ms bedzie sekunda
Dim P As Byte 'licznik dla ilosci pomiarow
Dim Probka As Word 'wartosc odczytana z przylozonego do ADC
Dim Napiecie As Word 'dodaje do siebie kolejne odczyty
Dim Napiecie_u As Single 'napiecie usrednione single bo z przecinkiem
Dim Hsingle As Single 'pomocnicza zmienna
Dim Volt As String * 5 'zmienna "tekstowa" 5 znakow ksztaltowana przez "fusing"
Const P_max = 16 'ilosc pomiarow do usredniania
Lcd "Zasilanie:" 'wyswietlamy tylko raz na potrzeby testu
'*************
'*** START ***
'*************
Do
'---------------------co 1s--------
If 4ms >= 250 Then 'po odliczeniu 250 bedzie sekunda
4ms = 0 'zerowanie licznika dla nastepnej sekundy
Hsingle = Napiecie_u * 0.0049
Hsingle = Hsingle * 4
Volt = Fusing(hsingle , "#.&")
Locate 1 , 11 : Lcd Volt ; "V " 'ustawienie kursora na 11 miejscu pierwszej linii
End If
'----------------------------------
Loop
'**************
'*** KONIEC ***
'**************
'==================================
Int_4ms: 'tu co 4ms "skacze" program
Incr 4ms 'zwiekszanie licznika dla sekund
Incr P 'zwiekszanie licznika dla pomiarow
Probka = Getadc(0) 'zmierz na Pinie 0 ADC
Napiecie = Napiecie + Probka 'dodaj kolejne pomiary
If P >= P_max Then 'gdy pomiarow 16
P = 0
Napiecie_u = Napiecie / P_max 'podziel cala sume przez ilosc pomiarow (usrednij)
Napiecie = 0 'zeruj zmienna by dodawac nowe
End If
Return
'=================================
Jak zwykle życzę miłego dnia ;)
hd44780plus2Xds18b20plusCzasplusNapięcie
Mój program na bazie powyższego , ale dodatkowo pomiar na dwóch dallasach 18b20 , oraz zegarek ustawialny dwoma klawiszami PC2 i PC3.
O czym zapomniałem ? ano właśnie :)
Po linijkach
warto dopisać
Jakieś pomysły ktoś ma do istniejącego stanu rzeczy , by było bateryjne podtrzymanie zegarka , by nie trzeba było go ustawiać ponownie przy każdym załączeniu zasilania?
Nie potrzebne jeszcze...
Dolutowany kwarc zegarkowy do XTAL0 i 1
Klawisze zwierają do masy , podlutowane są poprzez rezystory 4k7 do Vcc.
Ech , roztrzepany jestem dziś .Przepraszam.
Kolejna wersja tego kodu , ale z obsługą baterii (odtrzymanie)
A jak sprawić by zasilanie bateryjne było podtrzymujące działanie samego układu (zliczanie czasu - czyli zegara) ?
Czy taki kod finalnie z procedurą pomiaru napięcia (jego spadku) jest możliwy ?
ADC przykład pomiaru
Witam, kombinuję z pomiarem prądu za pomocą ACS713-20AT, 185mV/A i jakoś topornie to działa, ma ktoś jakiś przykład jak to napisać? Z ACS przy zerowym prądzie wychodzi napięcie 0,51V które należy jeszcze odjąć od pomiaru aby wynik był 0,0A (inaczej pokazuje 2,7A na starcie), może jakiś sposób na auto-kalibrację lub za pomocą przycisku?
ADC przykład pomiaru
nie wiem co lepsze i prawidłowe , ale działa w obu przypadkach