Skocz do zawartości

[c++] odczyt napiecia baterii z ADC


expiredmind

Pomocna odpowiedź

Witam,

Chciałbym za pomocą ADC MCP3008 odczytać wartość napięcia baterii podłączonej do kanału 0 (wcześniej zmniejszyłem jej napięcie do 2.5V ). Korzystałem z poradnika na stronie http://www.hertaville.com/interfacing-an-spi-adc-mcp3008-chip-to-the-raspberry-pi-using-c.html . Stworzyłem sobie układ z potencjometrem i wszystko jest ok, jednak gdy wpinam baterie result wypisuje cały czas 0. Sprawdziłem za pomocą miernika czy napięcie faktycznie dochodzi do kanału. Czy mam modyfikować sposób odczytu transmisji? (tablica data i odnoszenie się do adresu w pamięci, niestety nie wiem w jaki sposób to działa)

Nie wiem czy dobrze zrozumiałem ale ADC działa tak, że odczytuje napięcie analogowe i zamienia je na cyfrowe (z dokładnością zależna od tego ilu bitowy jest), także czy w układzie jest potencjometr,czujnik czy napięcie z baterii nie powinno mieć tu różnicy ?

Przewertowałem już mnóstwo internetowych poradników i dalej nie jestem co do tego pewny

Link do komentarza
Share on other sites

Czy mam modyfikować sposób odczytu transmisji?

Jeżeli działa Ci z potencjometrem, to możesz chyba założyć, że program jest ok.

wcześniej zmniejszyłem jej napięcie do 2.5V

W jaki sposób? Jak podłączasz baterię do układu pomiarowego?

Link do komentarza
Share on other sites

Paskudny schemat, bez sensu jest ta moda na kolorowanki.

Schemat wydaje się być ok. Nie napisałeś co to za bateria.

Sprawdziłem za pomocą miernika czy napięcie faktycznie dochodzi do kanału.

I...?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

chyba to jednak była wina układu. Pozmieniałem, ale oczywiście z głupoty spaliłem ADC (pokazuje cały czas stan 1). Jutro kupie nowy ADC i napisze czy działa. A co do pytania, to tak, napięcie dochodzi

Link do komentarza
Share on other sites

Kupiłem inny przetwornik ADC (tego konkretnego nie było a potrzebowałem akurat, żeby kanały były również różnicowe a nie pseudo) Podpiąłem do urządzenia analogicznie do instrukcji podanej w pierwszym poście i uzyskuje dziwne wyniki: dla 0 i maksa pokazuje prawidłowe wartości, jesli kręce potencjometrem to odczytuje albo wcześniejszą wartość albo w miare poprawną albo totalnie z dupy. Wydawało mi się, że dzięki temu, że dalej komunikuje się poprzez SPI nie musze zmieniać nic w kodzie (nie wazne jaki to ADC), czy tak jest?

Wysyłam schemat mojego nowego ADC i wyniki po kręceniu potencjometrem cały czas w jedna strone od 0 do 1008.

problem.jpg

I zdjęcie układu z potencjometrem

Uklad.jpg

Jestem totalnie świeży w temacie więc może źle zrozumiałem tą komunikacje.

__________

Komentarz dodany przez: Sabre

Link do komentarza
Share on other sites

Wydawało mi się, że dzięki temu, że dalej komunikuje się poprzez SPI nie musze zmieniać nic w kodzie (nie wazne jaki to ADC), czy tak jest?

????

Czyli co, zmieniłeś układ scalony a kod zostawiłeś taki jaki był? Skąd masz pewność że rejestry mają takie samo znaczenie w obu układach?

  • Lubię! 1
Link do komentarza
Share on other sites

Tak jak mowiłem, jestem kompletnie nowy w tej dziedzinie i myślałem, że jak łącze się przez ten sam interfejs to kod jest uniwesalny dla każdego urządzenia ale z twojej odpowiedzi wnioskuje, że nie jest. Czyli powinienem zmienić ten fragment kodu?

 data[0] = 1;  //  first byte transmitted -> start bit
       data[1] = 0b10000000 |( ((a2dChannel & 7) << 4)); // second byte transmitted -> (SGL/DIF = 1, D2=D1=D0=0)
       data[2] = 0; // third byte transmitted....don't care

       a2d.spiWriteRead(data, sizeof(data) );

       a2dVal = 0;
               a2dVal = (data[1]<< 8) & 0b1100000000; //merge data[1] & data[2] to get result
               a2dVal |=  (data[2] & 0xff);

Czy mógłbyś mi doradzić gdzie znalazłbym wytłumaczenie lub sam wytłumaczyłbyś jak sprawdzić które rejestry są poprawne?

Link do komentarza
Share on other sites

Dzięki za wskazówki, jednak mógłby mi ktoś wytłumaczyć lub wskazać źródło skąd mam się dowiedzieć jak zakodzić te rejestry? Z tego co wiem to schemat wysyłania dla przetwornika mcp 3008 jest taki:

a w kodzie miejsca w pamięcie to np.

 0b10000000 |( ((a2dChannel & 7) << 4))

Jak się w tym połapać? Teraz mam ADC0832CCN i nota katalogowa różni się od poprzedniej:

http://www.jameco.com/Jameco/Products/ProdDS/831200.pdf

czy strony z nagłówkiem timing to to czego szukam?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.