Przetwornik analog-cyfra program

Tutaj mozesz poruszać tematy ogólne powiązane z elektroniką, np. dyskusje na temat podzespołów, układów, zasad ich działania. Czyli można pisać o wszystkim czego nie da się przyporządkować do innych działów.
ODPOWIEDZ
cristof_w
-
Posty: 66
Rejestracja: 24 sie 2006, 5:09

Przetwornik analog-cyfra program

Post autor: cristof_w » 30 wrz 2007, 9:02

Witam.
Chciałbym napisać program w języku C, obsługujący przetwornik analog-cyfra wbudowany w procek ADuC832. Przeczytałem data od procka, ale nie wiem jak się do tego w ogóle zabrać. Nie pisałem takich programów wcześniej.
Czy ktoś mógłby przedstawić podejście do problemu? Tzn. jak się zabrać do tego, co powinny zawierać funkcje, schemat blokowy postępowania mile widziany, kroki co należy wykonać kolejno...ewentualnie dobra literatura.
Za pomoc będę wdzięczny.
Pozdrawiam.

muldi
-
Posty: 9
Rejestracja: 10 wrz 2007, 14:50
Lokalizacja: Chełmno

Post autor: muldi » 04 paź 2007, 12:03

musiałbyś sobie specyfikację tego procka poczytać.

Ja to rozumiem w następujący sposób. Jeśli jest tam np. 12-bitowy przetwornik-> 2^12=4096
Czyli możesz odczytać 4096 kolejnych wartości napięcia.
Jeśli teraz np. przetwornik AC łyka powiedzmy do 10V, to 10V/4069=0.0024414.
Czyli znasz wartość o jaką zmienia się napięcie jeśli wartość twojej odczytanej wartości zmieni sie o 1 (zakres 0..4096).
Więc pozostaje Ci napisać programik, który tą twoją przeczytaną wartość z binarnej zamieni na wartość napięcia.
W zasadzie sprowadzi się to do zamiany liczby binarnej na dziesiętną i przemnożeniu przez wyliczoną wcześniej najmniejszą odczuwalną przez przetwornik zmianę napięcia.

Kwestia oczywiście co masz zamiar dalej z takim wynikiem robić.
Można przecież zostawić w spokoju odczytaną wartość a przeliczyć na wartość binarną tą zmianą napięcia i przemnożyć na liczbach binarnych.

Mam nadzieję, że choć trochę pomogłem.

cristof_w
-
Posty: 66
Rejestracja: 24 sie 2006, 5:09

Post autor: cristof_w » 05 paź 2007, 6:47

Witaj. Dziękuję za zainteresowanie tematem.
Trochę rzeczy mnie się już rozjaśniło, jednakże dalej mam pytania.Więc tak.
Przetwornik jest 12-bitowy.
Czyli tak, jak napisałeś jest to 4096. Przetwornik jest od 0V do Vref (tutaj dokumentacja zaleca 2,5V), czyli byłoby, że 1 stopień to 0,61mV (2,5/4096).
Jednakże jak to będzie w stytuacji, gdy badany sygnał mienia się w zakresie 0-5V ? Jak to sie ma do Vref 2,5 V?
Napisałeś, że program sprowadzi się zamiany wartości binarnej na dziesiętną, dalszym przemnożeniu itp. itd. Ok.
Do tej pory sprawdzenie wartości portu to było sprawdzenie czy jest to "0" bądź "1" i następnie podjęta odpowiednia akcja. Natomiast jak zrealizować programo teraz sprawdzenie portu, gdzie wartość zmienia się w zakresie 0-4096 (tyle jest kolejnych wartości napięcia) ? Jeżeli uda się to wyjaśnić, to już chyba będę wiedzieć o co chodzi.
Pozdrawiam.
Ostatnio zmieniony 01 sty 1970, 1:00 przez cristof_w, łącznie zmieniany 1 raz.

Awatar użytkownika
Tranzystor
Użytkownik
Posty: 889
Rejestracja: 28 sie 2005, 19:19
Lokalizacja: Świętochłowice
Kontakt:

Post autor: Tranzystor » 05 paź 2007, 7:20

Jeżeli Vref na przetworniku ma być 2,56V, a Ty chcesz mierzyć napięcie z zakresu 0-5,12V, to musiałbyś zrobić dzielnik na rezystorach. Proponuję 1k podłączony względem wejścia do przetwornika, a masą i 2k podłączone do wejścia przetwornika oraz do lini, na której chcesz mierzyć napięcie ;)

Mam nadzieje, że mniej więcej rozumiesz o co mi chodzi. Jak nie to postaram się narysować Ci schemat :D

Pozdro ;)

ZbeeGin

Post autor: ZbeeGin » 06 paź 2007, 7:49

cristof_w pisze:Do tej pory sprawdzenie wartości portu to było sprawdzenie czy jest to "0" bądź "1" i następnie podjęta odpowiednia akcja. Natomiast jak zrealizować programo teraz sprawdzenie portu, gdzie wartość zmienia się w zakresie 0-4096 (tyle jest kolejnych wartości napięcia) ? Jeżeli uda się to wyjaśnić, to już chyba będę wiedzieć o co chodzi.
Pytanie dodatkowe, czy chcesz ustalić jakiś próg napięcia po którego przekroczeniu podjęta zostanie akcja?
Przykład: Jeśli napięcie na wejściu przekroczy 1,5V to włączony zostanie wentylator. Przy Vref = 2,5V.
Realizacja: Należy sprawdzić czy wartość odczytana z rejestru danych przetwornika będzie większa niż 2459. (w przybliżeniu 1,5V / 0,00061V = 2459,0)
Tranzystor pisze:Proponuję 1k podłączony względem wejścia do przetwornika, a masą i 2k podłączone do wejścia przetwornika oraz do lini, na której chcesz mierzyć napięcie
Proponowałbym zwiększyć te rezystancje 100 razy. A zatem 100k i 200k.

cristof_w
-
Posty: 66
Rejestracja: 24 sie 2006, 5:09

Post autor: cristof_w » 09 paź 2007, 18:54

Dzięki za odpowiedzi.
Co do dzielnika napięcia to chyba wiem o co chodzi, chodzi pewnie oto aby do wejscia ADC nie dochodziło napięcie max 5V tylko 2,5V.
Natomiast co tego co napisał Kolega ZbeeGin. Właśnie o coś takiego mnie chodzi, np.
wykrywa próg napięcia 1,5V wtedy jest podejmowana akcja i wysterowywany inny port.
Do tej pory nie miałem problemu, gdyż sprawdzałem czy też port jest "0" bądź "1" za pomocą np. funkcji if. Natomiast w tym przypadku kompletnie nie wiem jak to sprawdzić, że chodzi o wartość np. 2459,0. Należy sprawdzić zawratość rejestru? O to chodzi? Jeżeli tak, to nadal nie wiem jak ten kawałek kodu zrealizować programowo. W tej chwili byłby to już chyba jedyny problem.
Pozdrawiam.

ZbeeGin

Post autor: ZbeeGin » 09 paź 2007, 20:01

cristof_w pisze:Natomiast w tym przypadku kompletnie nie wiem jak to sprawdzić, że chodzi o wartość np. 2459,0. Należy sprawdzić zawratość rejestru? O to chodzi? Jeżeli tak, to nadal nie wiem jak ten kawałek kodu zrealizować programowo. W tej chwili byłby to już chyba jedyny problem.
Nie wiem niestety jak to jest dokładnie w układach ADuC, ale przetwornik na pewno posiada rejestr do którego trafia wartość po przetworzeniu. Może to być jeden rejestr 16-bitowy, albo dwa rejestry ośmiobitowe.

Jeśli jest to rejestr traktowany przez kompilator jako 16-bitowa (np. unsigned int) zmienna, to sprawa jest myślę dość prosta. Jeden warunek:

Kod: Zaznacz cały

if (ADC_DATA >= 2459)
{ 
  // tu ciąg instrukcji do wykonania
}
Jeśli są to dwa rejestry 8-bitowe (np. unsigned char) traktowane jako zmienne to trzeba połączyć dwa warunki:

Kod: Zaznacz cały

if ((ADC_DATA_L >= (2459 & 0xFF)) && ((ADC_DATA_H >= (2459 >> 8 & 0xFF)))
{ 
  // tu ciąg instrukcji do wykonania
}
Jeśli do odczytania zawartości rejestrów potrzeba użyć jakiejś spacjalnej funkcji (z modułu "adc.h" dla przykładu) to trzeba z niej skorzystać - albo bezpośrednio w warunku, lub po odczytaniu danych do specjalnej zmiennej.

ps. Kody mogą nie być poprawne. Nie pamiętam już dużo z języka C. :cry:

Guzer
Użytkownik
Posty: 167
Rejestracja: 08 lis 2006, 18:36
Lokalizacja: Szczecin
Kontakt:

Post autor: Guzer » 09 paź 2007, 21:07

W drugim przypadku powinno być

Kod: Zaznacz cały

if ((ADC_DATA_L >= (2459 & 0xFF)) && (ADC_DATA_H == (2459 >> 8 & 0xFF)) || (ADC_DATA_H > (2459 >> 8 & 0xFF)))
{
  // tu ciąg instrukcji do wykonania
}
Ew. można to zrzucić do jednej zmiennej unsigned short

Kod: Zaznacz cały

unsigned short adc;
adc = (ADC_DATA_H << 8) | ADC_DATA_L;
if(adc >= 2459)
{
  // blabla
}

cristof_w
-
Posty: 66
Rejestracja: 24 sie 2006, 5:09

Post autor: cristof_w » 11 paź 2007, 18:20

Dzięki za odpowiedzi.
Nurtują mnie dwie kwestie.
Jak się ma powyższy kod źródłowy do danego portu i rejestru? Trzeba przecież określić o którym porcie wejściowym jest mowa i do którego rejestru jest zapisywana dana wartość. Powyżej jest tylko użyta zmienna. Jak uwzględnić w kodzie to, że np. port przetwornika to P1.0 a rejestr to chyba F9H i FAH (jeżeli dobrze odczytałem z data) (jest podzielony na dwa 8-bitowe).
Prosze o wyjaśnienie.
Pozdrawiam.

ZbeeGin

Post autor: ZbeeGin » 11 paź 2007, 18:31

cristof_w pisze:Jak uwzględnić w kodzie to, że np. port przetwornika to P1.0 a rejestr to chyba F9H i FAH (jeżeli dobrze odczytałem z data) (jest podzielony na dwa 8-bitowe).
W przykładach Moich i kol. Guzer używamy pewnych przypuszczeń. To od kompilatora, czy plików nagłówkowych zależy jak nazywają się te rejestry w tym wypadku i jak się do nich rzeczywiście dobrać. Niestety do Ciebie należy skonfrontowanie tych przykładów z rzeczywistością. :sad:

cristof_w
-
Posty: 66
Rejestracja: 24 sie 2006, 5:09

Post autor: cristof_w » 11 paź 2007, 18:55

No właśnie w tym sęk jest, że niezaposiadam takowej wiedzy jak z tym sobie dalej poradzić. Gdybym wiedział, to bym nie pytał :) Według mnie trzeba to uwzględnić w kodzie źródłowym, być może się mylę, ale inaczej to sam uC się niedomyśli :)
Pozdrawiam.
Być może jeszcze ktoś ma dobrą wskazówkę.

ODPOWIEDZ