Przetwornik analog-cyfra program
Przetwornik analog-cyfra program
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.
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.
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.
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.
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.
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.
- Tranzystor
- Użytkownik
- Posty: 889
- Rejestracja: 28 sie 2005, 19:19
- Lokalizacja: Świętochłowice
- Kontakt:
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
Pozdro
Mam nadzieje, że mniej więcej rozumiesz o co mi chodzi. Jak nie to postaram się narysować Ci schemat
Pozdro
-
ZbeeGin
Pytanie dodatkowe, czy chcesz ustalić jakiś próg napięcia po którego przekroczeniu podjęta zostanie akcja?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.
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)
Proponowałbym zwiększyć te rezystancje 100 razy. A zatem 100k i 200k.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
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.
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
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.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.
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
}
Kod: Zaznacz cały
if ((ADC_DATA_L >= (2459 & 0xFF)) && ((ADC_DATA_H >= (2459 >> 8 & 0xFF)))
{
// tu ciąg instrukcji do wykonania
}
ps. Kody mogą nie być poprawne. Nie pamiętam już dużo z języka C.
W drugim przypadku powinno być
Ew. można to zrzucić do jednej zmiennej unsigned short
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
}
Kod: Zaznacz cały
unsigned short adc;
adc = (ADC_DATA_H << 8) | ADC_DATA_L;
if(adc >= 2459)
{
// blabla
}
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.
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
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ą.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).