jak wykryć zmianę na wejściu ADC ?

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

jak wykryć zmianę na wejściu ADC ?

Post autor: matrix » 13 paź 2010, 16:08

jak w temacie.
jak wykryć zmianę na wejściu ADC ?
powiedzmy piszę sobie taki kawałek kodu:

Kod: Zaznacz cały

x = getadc(0)
i jak do tego napisać procedurę żeby przeskakiwało do odpowiedniego podprogramu tylko wtedy gdy to ADC się zmieni?
napisanie:

Kod: Zaznacz cały

if x <> x then
 gosub jakieadc
end if
wywala ciągle do podprogramu jakieadc, bo ciągle się to zmienia. na wejście ADC podpięty mam zwykły pr'ek.

wprowadzenie nowej zmiennej, dajmy na to Y i porównanie:

Kod: Zaznacz cały

if x <> y then
 gosub jakieadc
end if
też niczego nie daje bo zmienia się to dość dynamicznie, a nie chcę wprowadzać jeszcze jednej zmiennej bo to zmienne typu word.

jakieś pomysły?

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 13 paź 2010, 16:48

Trzy rzeczy:
- zakłócenia w linii podpiętej do ADC
- niedokładność ADC (błędy pomiarów)
- kwantyzacja
Powoduje to, że na wyjściu ADC masz zmianę o jeden, czy dwa, co powoduje skok do podprogramu. Wprowadź histerezę i będziesz miał to z głowy. Nie podam Ci gotowego kodu, bo nie programuje w BASCOMie. Najprościej można to zrobić, sprawdzając, czy wartość z ADC jest większa lub mniejsza o jakąś stałą wartość (np. 5) od poprzedniego pomiaru.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 13 paź 2010, 17:51

Jak się zaczniesz odwoływać do rejestrów przetwornika AC a nie używać procedur BASCOMa to możesz używać rozdzielczości 8 bitów.
Porównywania powinno się dać zrobić na jednej zmiennej, tylko musiał byś porównywać wartość rejestru wyniku przetwornika AC z zmienną z ostatniego odczytu, Taka kolejka FIFO z porównaniem argumentów. Oczywiście taka procedura w BASCOM nie istnieje, więc musiał byś zrobić sobie ją sam.
No ale musiał byś napisać dokładniej co twój komputerek pokładowy do samochodu ma robić ?

alaris
Użytkownik
Posty: 530
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 13 paź 2010, 18:46

kayron pisze:możesz używać rozdzielczości 8 bitów.
Albo podzielić wartość zwracaną przez BASCOMa przez 4. Tez jest to jakieś wyjście.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 13 paź 2010, 18:53

To zależy co komputerek kolegi ma robić, na razie jest to takie chaotyczne pytanie się jak uruchomić graficzny LCD, nadzorować przetwornik A/C itd. łatwiej było by doradzić gdyby kolega Matrix napisał trochę konkretniej co buduje i jakie tam chce mieć funkcje np. mam procesor ATMEGa 16, do tego RTC PCF8583, taki wyświetlacz graficzny, i chcę zrobić na tym to a to.
Akurat obsługę przetwornika A/C można napisać na kilka sposobów, to dobrze było by wiedzieć czy wystarczy rozdzielczość 8 bitów, czy pomiar ma być raz na sek, czy 10x, czy może 100x (chaotyczny :?:), no i do czego ma służyć ten pomiar, nap.Akumulatora, temperatura ?

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 13 paź 2010, 19:38

kayron, a skąd wiesz że to komputerek do samochodu? pisałem gdzieś o tym?

w miejscu gdzie reguluje się intensywność nadmuchu mam zamiar wstawić potencjometr i odczytywać jego wartość, następnie w procku odczytywać sobie w jakim miejscu ustawiona jest dmuchawa. z czasem zamiast rezystorowego dzielnika bo jest zawodny, dać regulację PWM.

planowałem zrobić na atmega168, bo mam płytkę testową PROPOX która obsługuje mega8, mega48 i mega168 i było by łatwiej testować, ale chyba będę musiał użyć czegoś z większą ilością portów, bo mi będzie za mało po podpięciu lcd.

całość ma mieć jeszcze odczytywanie rc5 z małego pilota, regulację głośności subwoofera, jego włączanie i wyłączanie, wyświetlenie obrazka jak w załączniku i pokazanie ewentualnie niedomkniętych drzwi. chciałem zrobić sprawdzanie żarówek czy są sprawne, ale nie na raz. płytka ma przewidzieć dużo, ale sam program będzie rozwijany.

do tego chciałem dać touch panel żeby nie bawić się w przyciski. wyświetlacz byłby 192x64 a sam touch panel 128x64 i obejmował by lewą część wyświetlacza, prawa reszta czyli 64x64 była by przeznaczona na zamieszczony w załączniku obrazek.

duże wymagania sobie stawiam? chciałbym wreszcie zrobić coś co mi się przyda i trochę unowocześni mi moją "furę".

aha, ten kawałek kodu czyli podział przez 4 i takie porównanie nadal nic nie daje.

Kod: Zaznacz cały

x = getadc(0)
x = x / 4

if x <> x then
 gosub jakieadc
end if
Załączniki
zamykanie drzwi.gif
(4.3 KiB) Pobrany 6050 razy

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 13 paź 2010, 19:55

kayron, a skąd wiesz że to komputerek do samochodu? pisałem gdzieś o tym?
:lol: no tego akurat mogłeś nie pisać, chyba to oczywiste jak chcesz wyświetlać na LCD rysunek samochodu, no to do motorynki tego nie wstawisz.
Ale po małej dygresji, wracając do tematu.
Zamiast grzebać w desce rozdzielczej i wstawiać potencjometr, nie łatwiej by było mierzyć obroty wentylatora ? Oczywiście nie wiem gdzie konkretnie w twoim samochodzie ten wentylator jest, i czy i tak deski nie trzeba by rozbierać, ale może sie okazać że da się wstawić wentylator komputerowy 120x120 z czujnikiem obrotów i będzie to prostsze rozwiązanie i lepsze, bo masz kontrolę czy wentylator się obraca, i jak szybko, a z tego łatwo obliczyć jaki masz nawiew.
A jak chcesz PWM, to może lepiej tak: na NE555 + Mosfet generator PWM sterowany potencjometrem który jest oryginalnie w desce, z niego przez optotransoptor, mierzyć sobie współczynnik wypełnienia mikroprocesorem i obliczać nawiew.
PS. Uprzedzając trochę. Tak, jasne że się da, wszystko się da zrobić, tylko trzeba mieś w miarę klarowną koncepcje, zazwyczaj najpierw robi się Hardwer, a potem oprogramowanie, nie odwrotnie. A ten pomysł z NE555 weź pod uwagę to nie takie głupie, i rozwiązuje parę problemów.
Ostatnio zmieniony 13 paź 2010, 20:04 przez kayron, łącznie zmieniany 1 raz.

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 13 paź 2010, 20:02

Może tak:

Kod: Zaznacz cały

x1 = getadc(0) 'odczytać adc
if x1 > x2+5 or x1< x2-5 then 'jeśli nowa wartość jest znacząco większa lub mniejsza 
 x2 = x1 'przepisz nowa -> stara
 gosub jakieadc 'procedura 
end if
Albo tak poprostu przepisać
ADC (8-bit) -> PWM (8-bit)
lub
ADC (10-bit) -> PWM (10-bit)

Ewentualnie jeszcze sprawdzanie warunków jeśli mniej jak 10% to wyłącz, jeśli więcej jak 90% to pomiń PWM i włącz na stałe, ...

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 13 paź 2010, 20:03

kayron pisze:Zamiast grzebać w desce rozdzielczej i wstawiać potencjometr, nie łatwiej by było mierzyć obroty wentylatora ?
i tak mam deskę rozebraną bo w moim passacie B3 bo poprzedniemu właścicielowi połamała się ramka od trzymania nadmuchów, radia, przycisków itp
konkretnie chodzi o tą ramkę:

[center]Obrazek[/center]

jest cała połamana i muszę ją wymienić, do tego radio przenoszę w podsufitkę i w miejscu radia zostanie wolne miejsce, więc chciałem sobie tam wkomponować funkcjonalny lcd.

do tego w bagażniku mojego kombi siedzi jeszcze nie podłączony wzmak BLAUPUNKT GTA260, a że w swoim radiu sony mam wyjście na suba to chcę sobie dać oddzielne sterowanie głośnością tego wooferka.

mało tego, w tej chwili mam zegary na linkę i bez obrotomierza, ale czekają do zamontowania wskazówkowe, ale full elektroniczne z MFA więc jest co robić, a że całość nie będzie taką dużą ingerencją w samochód a do tego mój pasek jest z 90 roku to jest w co się bawić.

z tym wywoływaniem tej procedury to chodzi mi o to by skoczyć do podprogramu obsługi tylko wtedy kiedy wartość na potencjometrze się zmieni, czyli kiedy przekręcę pokrętłem od nadmuchów.
M@rek pisze:Może tak:
Kod:
x1 = getadc(0) 'odczytać adc
if x1 > x2+5 or x1< x2-5 then 'jeśli nowa wartość jest znacząco większa lub mniejsza
 x2 = x1 'przepisz nowa -> stara
 gosub jakieadc 'procedura
end if
bascom nie przyjmuje tak złożonych obliczeń.
napisanie czegoś takiego

Kod: Zaznacz cały

if x > y + 5 or x < y -5 then
wywala błąd

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 13 paź 2010, 20:10

A.. czyli taki Tunig przy okazji. fajnie, Przy czym pamiętaj że w samochodzie masz 12V, a właściwie to od 13,5 do 14,5V więc nie możesz tego bezpośrednio mierzyć na procku, musisz mieć wzmacniacz pomiarowy przed A/C, więc wszystko musisz albo przez tranzystory buforwać, albo przez optotransporty jak PC816, a pomiary analogowe przez wzmacniacze (właściwie tłumiki). Układ ci się dosyć ładnie rozrośnie.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 13 paź 2010, 20:16

kayron pisze:Przy czym pamiętaj że w samochodzie masz 12V, a właściwie to od 13,5 do 14,5V
pamiętam, ale jak dam pięciovoltowy stabilizator LDO i napięcie na potencjometr puszczę ze stabilizatora to mam (chyba?) po kłopocie.

nawet napisanie czegoś takiego:

Kod: Zaznacz cały

x = getadc(0)
gorna_histereza = x + 10
dolna_histereza = x - 10
 if x > gorna_histereza or x < dolna_histereza then
  gosub jakieadc
 end if
niczego nie zmienia. nie wyrzuca mnie do poprogramu obsługi jakieadc.

Awatar użytkownika
Ertew
Użytkownik
Posty: 1414
Rejestracja: 03 lip 2005, 10:36
Lokalizacja: Leszno
Kontakt:

Post autor: Ertew » 13 paź 2010, 20:22

Pomyśl.
Odczytałeś ADC do zmiennej X, następnie porównujesz zmienną X z nią samą, a nie z nową wartością ADC.
Musisz odczytać ADC 2 razy i porównać pomiary.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 13 paź 2010, 20:26

M@rek pisze:Odczytałeś ADC do zmiennej X, następnie porównujesz zmienną X z nią samą, a nie z nową wartością ADC.
Musisz odczytać ADC 2 razy i porównać pomiary.
nie do końca. porównuję wartość pobraną z ADC z wartościami o 10 mniejszymi i o 10 większymi i tu jest błąd.

nie błąd samego porównania. zobaczyłem to dopiero po wyświetleniu sobie wszystkich wartości czyli wartości x, wartości gorna_histereza i wartości dolna_histereza.

wartość x nigdy nie będzie większa lub mniejsza od wartości histerez bo histerezy od razu po odczytaniu nowego adc się zmieniają. żeby to się zmieniło trzeba opóźnić lub też wstawić w innym miejscu uzyskiwanie tychże histerez.

Awatar użytkownika
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 13 paź 2010, 20:29

Tzn. nie bardzo wiem po co chcesz na siłę sprawdzać czy napięcie na ADC ci się zmieniło ? Po pierwsze zakłócenia i tak będą powodowały dryf tego napięcia, po drugie dokładnie to samo uzyskasz, robiąc pomiar 10x/sek, i sprawdzając sobie co ci się dzieje z napięciem i uwzględniając histereze.
Ogólnie rzecz biorąc jak dobrze rozumiem to chcesz stwierdzić czy gałka potencjometru została przekręcona i czy należy zmienić obroty wentylatora, ale tego się nie robi w ten sposób, tylko tak jak napisałem.
Wykorzystaj timer do tego, i przepytuj sobie 10x/sek ADC, wtedy nawet na upartego cała procedura obsługi może nawet być w przerwaniu od tego timera.
PS. Jak znajdę jutro trochę czasu to spróbuję ci to napisać w BASCOM, ale podaj częstotliwość CPU jaką to chcesz taktować. Zakładam ze 8MHz bo ten RC5 chcesz.

Awatar użytkownika
matrix
Użytkownik
Posty: 1796
Rejestracja: 15 mar 2006, 5:21
Lokalizacja: Sochaczew
Kontakt:

Post autor: matrix » 13 paź 2010, 21:27

na dole tego posta jest edit
kayron pisze:Tzn. nie bardzo wiem po co chcesz na siłę sprawdzać czy napięcie na ADC ci się zmieniło ?
nie chcę bez powodu wywoływać procedury jakieadc (w programie docelowym inaczej będzie się nazywało).

dajmy na to że cały czas na lcd mam coś (nie wiem co, cokolwiek).
jeśli nie zmieni się położenie potencjometru czyli nie zmieni się wartość adc to nie będę musiał wywoływać podprogramu jakieadc, ponieważ w tymże podprogramie zapewne będzie czyszczenie wyświetlacza i wyświetlanie zupełnie innych wartości niż pętli głównej całego softu. do tego mi potrzebne sprawdzanie czy wartość napięcia zmieniła się.

po części rozgryzłem ten kłopot. pisząc:

Kod: Zaznacz cały

gorna_histereza = x + 10
dolna_histereza = x - 10
x = 0
x = getadc(0)

if x > gorna_histereza or x < dolna_histereza then
  gosub jakieadc
end if
czyli po prostu zmieniając położenie uzyskiwania histerez i do tego dając w podprogramie jakieadc opóźnienie choćby 1s (wait 1) uzyskam to o co mi chodziło.
kayron pisze:PS. Jak znajdę jutro trochę czasu to spróbuję ci to napisać w BASCOM, ale podaj częstotliwość CPU jaką to chcesz taktować. Zakładam ze 8MHz bo ten RC5 chcesz.
możesz coś nakreślić, a o do częstotliwości to zwykle korzystam właśnie z 8MHz i tak zamierzam zrobić też tutaj.

bardzo powolne zmiany na wejściu adc nie wywołują skoku do podprogramu jakieadc, ale wystarczy przekręcić troszeczkę szybciej potencjometrem i natychmiast program skacze do ww etykiety.

zauważyłem że wielkość stałej jaką odejmuje lub dodaję by uzyskać obie histerezy ma wpływ na to jak szybko mam obrócić potencjometr by zmiany przyniosły skok do etykiety.

EDIT:
optymalnym (chyba) dla mnie okazało się napisanie czegoś takiego:
konfiguracja:

Kod: Zaznacz cały

const stala_do_adc = 5
pętla główna:

Kod: Zaznacz cały

gorna_histereza = x + stala_do_adc
dolna_histereza = x - stala_do_adc
x = 0
x = getadc(0)
if x > gorna_histereza or x < dolna_histereza then
  gosub jakieadc
end if
podprogram jakieadc:

Kod: Zaznacz cały

wait 1
x = getadc(0)
wait 1
i dalej to co chcę wyświetlać w tymże podprogramie

ODPOWIEDZ