Witam,
Zabrałem się w końcu za moduł ADC w prockach AVR przy wykorzystaniu C.
Okazało się, że nie jest to takie skomlikowane ale...
mam dziwne problemy (hmmm chyba muszę sobie jakoś skalibrować) z odczytem czy może prawidłowym wskazywaniem wartości mierzonego napięcia.
Prób dokonuję na procku ATtiny26. Poniżej schemat.
do procka mam podpięty jeszcze wyświetlacz LCD a w zasadzie PLED - pobiera b.mało prądu i nie korzysta z podświetlenia - więc nie powinien wprowadzać jakichś specjalnych zakłóceń. Całość zmontowana jest na razie na płytce stykowej a zasilanie leci sobie z USBASP i jak mierzę je dwoma multimerami to wynosi ono +4,92V
Programowo korzystam z wewnętrznego źródła odniesienia 2,56V
jak widać napięcie podaję mierzę przez dzielnik R1/R2 - rezystory tak dobrałem prawie idealnie jeśli chodzi o wartości. Tylko ten 10K ma tak na prawdę 10,01K
I teraz mój problem - polega na tym, że za nic w świecie nie wychodzą mi po obliczeniach napięcia dokładnie tak samo jak na dwóch różnych zewnętrznych miernikach, które tak samo wskazują +4,92V. U mnie wychodzi +4,52V
(problem z tzw "skaczącym" napięciem rozwiązałem sobie poprzez np 100 pomiarów w pętli i obliczanie zwykłej średniej z tych 100 pomiarów. Więc wyświetlane napięcie jest w zasadzie stabilne - ale średnio o kilka mV niższe niż te które widać gdy mierzę miernikiem na dzielniku. Oczywiście dochodzi tu jeszcze jakaś nieliniowość bo gdy napięcie ustawię sobie na wejściu +1,02V i widzę je na LCD - to mierniki pokazują +1,17V
Generalnie docelowo chciałem sobie zrobić w miarę dokładny Woltomierz w zakresie 0 - 32V - stąd taki dzielnik
no ale to odczytywane napięcie jest zwykle niższe. Używam preskalera 128 - a jak dam najmniejszy = 2 - to odczytywane i przeliczane napięcie jest jeszcze ciut niższe
a programowo próbuję robić to mniej więcej tak:
może ktoś ma jakieś spostrzeżenia gdzie robię błąd albo co powinienem jeszcze zrobić? poprawić itp ?
za wszystkie sugestie z góry dziękuję
Dodano po 3 [minuty]:
dodam tylko, że próbowałem sobie dodawać jakąś stałą wartość do zmiennej w od razu po wykonaniu pętli - tak aby "sztucznie" otrzymać wartość +4,92V (czyli taką jak pokazują mierniki sprzętowe) - ale jak zmniejszam napięcie np do 1V - to oczywiście nieliniowość jakaś tam powoduje że i tak to się rozjeżdża
Zabrałem się w końcu za moduł ADC w prockach AVR przy wykorzystaniu C.
Okazało się, że nie jest to takie skomlikowane ale...
mam dziwne problemy (hmmm chyba muszę sobie jakoś skalibrować) z odczytem czy może prawidłowym wskazywaniem wartości mierzonego napięcia.
Prób dokonuję na procku ATtiny26. Poniżej schemat.
do procka mam podpięty jeszcze wyświetlacz LCD a w zasadzie PLED - pobiera b.mało prądu i nie korzysta z podświetlenia - więc nie powinien wprowadzać jakichś specjalnych zakłóceń. Całość zmontowana jest na razie na płytce stykowej a zasilanie leci sobie z USBASP i jak mierzę je dwoma multimerami to wynosi ono +4,92V
Programowo korzystam z wewnętrznego źródła odniesienia 2,56V
jak widać napięcie podaję mierzę przez dzielnik R1/R2 - rezystory tak dobrałem prawie idealnie jeśli chodzi o wartości. Tylko ten 10K ma tak na prawdę 10,01K
I teraz mój problem - polega na tym, że za nic w świecie nie wychodzą mi po obliczeniach napięcia dokładnie tak samo jak na dwóch różnych zewnętrznych miernikach, które tak samo wskazują +4,92V. U mnie wychodzi +4,52V
(problem z tzw "skaczącym" napięciem rozwiązałem sobie poprzez np 100 pomiarów w pętli i obliczanie zwykłej średniej z tych 100 pomiarów. Więc wyświetlane napięcie jest w zasadzie stabilne - ale średnio o kilka mV niższe niż te które widać gdy mierzę miernikiem na dzielniku. Oczywiście dochodzi tu jeszcze jakaś nieliniowość bo gdy napięcie ustawię sobie na wejściu +1,02V i widzę je na LCD - to mierniki pokazują +1,17V
Generalnie docelowo chciałem sobie zrobić w miarę dokładny Woltomierz w zakresie 0 - 32V - stąd taki dzielnik
no ale to odczytywane napięcie jest zwykle niższe. Używam preskalera 128 - a jak dam najmniejszy = 2 - to odczytywane i przeliczane napięcie jest jeszcze ciut niższe
a programowo próbuję robić to mniej więcej tak:
#define idmax 100
w=0;
// w pętli robione jest 100 pomiarów
for(i=0;i<idmax;i++)
{
a = a2dConvert10bit(2);
w += a;
_delay_ms(3);
}
// tu obliczana jest średnia (w/idmax)
// wynik mnożony jest przez 0,0025 - tylko razy 10tys
// i jeszcze wynik mnożony jest przez współczynnik dzielnika rezystorowego
h = (w/idmax)*25*13;
v1 = (h/10000UL); // tu mam wynik przed przecinkiem
v2 = (h/1000UL)%10UL; // tu mam pierwszą liczbę po przecinku
v3 = (h/10UL)%10UL; // tu mam drugą liczbę po przecinku
// te dziwne obliczenia powyżej są po to żeby nie korzystać z liczb typu float
może ktoś ma jakieś spostrzeżenia gdzie robię błąd albo co powinienem jeszcze zrobić? poprawić itp ?
za wszystkie sugestie z góry dziękuję
Dodano po 3 [minuty]:
dodam tylko, że próbowałem sobie dodawać jakąś stałą wartość do zmiennej w od razu po wykonaniu pętli - tak aby "sztucznie" otrzymać wartość +4,92V (czyli taką jak pokazują mierniki sprzętowe) - ale jak zmniejszam napięcie np do 1V - to oczywiście nieliniowość jakaś tam powoduje że i tak to się rozjeżdża
