logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMega8][C]Woltomierz na adc - błędny przelicznik

Master Dragon 20 Gru 2009 17:37 8884 40
  • #1 7414468
    Master Dragon
    Poziom 12  
    Mam pytanie dlaczego w tym kodzie przy przeliczaniu napięcia musiałem do 5v +2.56 żeby dobrze pokazywał napięcie na wyświetlaczu. Dodam że nóżka vref avcc są podpięte do 5v.


    
    #include <avr/io.h>
    #include <avr/signal.h>
    #include <stdlib.h>
    #include <util/delay.h>
    #include "lcd.h"
    #include "uart.h"
    
    void delay (unsigned short int ms)
    {
    	while(ms)
    	{
    		_delay_ms(1);
    		ms--;
    	}
    }
    
    void ADC_init(void)
    {
    ADMUX |= _BV(REFS0);
    //ADMUX |= _BV(ADLAR); //sposób zapisu wyrównanie do lewej
    ADMUX |= _BV(MUX1)|_BV(MUX0); //wybór kanału 3
    ADCSRA |= _BV(ADEN); //zezwolenie na konwersje
    ADCSRA |= _BV(ADPS0); //częstotliwość
    ADCSRA |= _BV(ADPS1);
    ADCSRA |= _BV(ADPS2);
    }
    
    int main(void)
    {
    char buf[8];
    float pomiar;
    ADC_init();
    UART_init();
    LCD_init();
    
    	for(;;)
    	{
    		ADCSRA |= _BV(ADSC);
    		while(ADCSRA & _BV(ADSC)) {}
    		pomiar =(float)(ADCL | (ADCH<<8))/1024*7.56; //!!!!!!!!!!!!!!!!!!!
    		dtostrf(pomiar,2,2,buf);
    		LCD_clear();
    		LCD_xy(0,0);
    		LCD_putstr(buf);
    		delay(1000);
    	}
    }
    


    Poprawiłem tytuł - tagi.
    [zumek]
  • #2 7414628
    Freddy
    Poziom 43  
    A jak ustawiłeś napięcie referencyjne, wewnętrzne ?
    ADC=Vin*1024/Vref

    [ATMega8][C]Woltomierz na adc - błędny przelicznik
  • #3 7414752
    kamyczek
    Poziom 38  
    Jakie masz źródło napięcia odniesienia chyba nie 7,56V ?. Vref <= VCC 5V to po pierwsze. Wynik to Var_adc* Vref/1024 ew razy odwrotność współczynnika podziału dzielnika wejściowego jeśli taki występuje... Ważna jest też kolejność odczytania rejestrów z wynikiem.
  • #4 7415211
    Konto nie istnieje
    Poziom 1  
  • #5 7415224
    Freddy
    Poziom 43  
    A niby dlaczego przez 1023 ?
    Atmel podaje wzór do obliczeń i tam jest1024.
  • #6 7415257
    Konto nie istnieje
    Poziom 1  
  • #7 7415290
    Freddy
    Poziom 43  
    Atmel liczy od 0 do 1023 tak jak każdy kod binarny.
    Na 10 bitach maksymalna wartość to rzeczywiście jest 1023.
  • #8 7415632
    Fryderyk-PL
    Poziom 11  
    Ale wartości w 10 bitach jest 1024, dlatego sądzę że należy dzielić przez 1024 !
  • #9 7416271
    Konto nie istnieje
    Poziom 1  
  • #10 7416355
    mario06
    Poziom 15  
    Dzielenie przez 1024 jest poprawne, w momencie pomiaru napięcia mierzonego jeśli jego wartość zostanie przekroczona względem napięcia wzorcowego nastąpi ustawienie wszystkich bitów rejestru, w przypadku dzielenia przez 1023 tego już nie wykryjesz. Tak więc właściwie maksymalnego napięcia po prostu się nie mierzy.
  • #11 7416366
    Konto nie istnieje
    Poziom 1  
  • #12 7416444
    mario06
    Poziom 15  
    Nie to, że jakoś jest to wykrywane. Ale przy przekroczeniu zakresu w wyniku pomiaru do rejestru są zapisywane same zera, tak więc wartość 0x3FF w rejestrze zostanie zapisana dla maksymalnej wartości i także dla wartości, która przekroczy napięcie wzorcowe. Więc raczej tej wartości (w tym przypadku 5V) nie powinno się uznawać za pomiar bo wprowadza ona dwuznaczność.

    A to dodatkowa notatka z dokumentacji technicznej Atmegi8:
    Cytat:
    The ADC converts an analog input voltage to a 10-bit digital value through successive approximation.
    The minimum value represents GND and the maximum value represents the voltage on
    the AREF pin minus 1 LSB.
  • #13 7416474
    Konto nie istnieje
    Poziom 1  
  • #14 7416895
    Freddy
    Poziom 43  
    Bij się w piersi ATom,:P:P:P i odszczekaj to co przedtem mówiłeś :P:P:P

    ... a mówiłeś, że Atmel źle robi, .....
  • #15 7417096
    Konto nie istnieje
    Poziom 1  
  • #16 7417533
    mario06
    Poziom 15  
    Fakt faktem, że to są szczegóły i niby wprowadza bardzo małe błędy :D, ale lepiej wiedzieć o tym gdy się chce robić dokładne pomiary przy wykorzystaniu ADC.
  • #17 7417551
    Konto nie istnieje
    Poziom 1  
  • #18 7417591
    Master Dragon
    Poziom 12  
    Proszę o to schemat a to szesnastostopniowe złącze to lcd

    [ATMega8][C]Woltomierz na adc - błędny przelicznik

    Już znalazłem płytka stykowa nie stykała dobrze i temu wariował.

    A mam takie pytanie jak bym dał dzielnik napięcia 10K do 4K7 to przez ile to by było trzeba pomnożyć żeby dobrze pokazywał
  • #19 7420808
    mario06
    Poziom 15  
    1. odnośnie dzielnika napięcia przy łączeniu jak niżej

    o napięcie mierzone
    |
    [] R1 = 10kR
    |
    o pin przetwornika ADC
    |
    [] R2 = 4.7kR
    |
    o GND

    to jeśli na obu odkładać się będzie jakieś napięcie to na R2 masz tylko 4.7/(4.7+10) z tego co odkłada się na całości i to odwracasz i przez to co ci wyszło musisz dodatkowo pomnożyć, powinno wyjść 3,1276595744680851063829787234043 :D ,

    2. odnośnie tego schematu, to co wyżej opisałem z tymi pomiarami przy tym iż właściwie tego maksymalnego napięcia się nie mierzy, dlatego schematu tu to pięknie wychodzi, zmiana napięcia mierzonego spowoduje to iż też zmieni się napięcie na Aref i właściwie w rejestrze będzie zawsze wartość 1023, maksymalna,

    3. części analogowa powinna być oddzielona od części cyfrowej, przykład jest na stronie 203 dokumentacji technicznej Atmegi8 doc2486
  • #20 7420900
    Konto nie istnieje
    Poziom 1  
  • #21 7422180
    Master Dragon
    Poziom 12  
    To był pomiar do testów będzie zastosowany dzielnik tak jak napisałem i będzie on mierzył napięcie bezpośrednio z baterii po zejściu poniżej minimalnego napięcia będzie informował o słabej baterii
  • #22 7422207
    Konto nie istnieje
    Poziom 1  
  • #23 7422255
    Master Dragon
    Poziom 12  
    Spoko działa do GND jest zero a do +5v pokazuje 1.58 troszkę skacze ale to może przez rezystory +/- 5% bo nie miałem innych ale w gotowym układzie będą 1% smd no i te 5v to jest taki 4,99v
  • #24 7422425
    Konto nie istnieje
    Poziom 1  
  • #25 7422461
    Master Dragon
    Poziom 12  
    Napięcie zasilania i to które mierze jest 4.99 - 5 v a pokazuje 1.58 na lcd
  • #26 7422483
    Freddy
    Poziom 43  
    jak poprawisz
    ADCH<<8))/1024*7.56; 
    na *2.56, to akurat będzie 3 razy więcej (to 1,58) czyli tyle co potrzeba :)
  • #27 7422507
    Master Dragon
    Poziom 12  
    no niestety nie bo teraz działa tak jak powinno i przelicznik jest ustawiony na 5 a 7.56
  • #28 7422574
    Freddy
    Poziom 43  
    To przyznaj się co było źle.
  • #29 7422589
    Master Dragon
    Poziom 12  
    Jest napisane wyżej jak by ktoś czytał do końca to by wiedział nie stykała dobrze płytka i wariował. Ale poprawiłem i jest dobrze były blaszki troszkę rozwarte i pod nimi został kawałek drucika i chyba to bo jak dogiąłem i wyciągnąłem ten drucik to teraz dobrze mierzy.
  • #30 7422747
    Freddy
    Poziom 43  
    Czytałem i zapytałem, chodziło mi o to, czy coś jeszcze, czy tylko "drucik"
REKLAMA