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
kayron
Użytkownik
Posty: 2088
Rejestracja: 21 wrz 2008, 12:53
Lokalizacja: Poland
Kontakt:

Post autor: kayron » 14 paź 2010, 16:53

Nie testowałem tego, ale coś takiego z wykorzystaniem timera1 (15,25 próbki/sek).

Kod: Zaznacz cały

Dim Znacznik_ruchu As Bit
Dim Napiecie As Word At $70       'Taka ciekawa sztuczka aby z worda, mozna kozystać jakby to był Byte.
Dim Lsb_nap As Byte At $70 Overlay
Dim Msb_nap As Byte At $71 Overlay
Dim Buf_pom As Byte
Dim Odchylka_plus As Byte
Dim Odchylka_minus As Byte

Const Odchylka = 10

Enable Interrupts
Enable Compare1a

On Compare1a Adc_test
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1


Compare1a = 512
start timer1
Buf_pom = Odchylka + 5
Odchylka_plus = Buf_pom + Odchylka
Odchylka_minus = Buf_pom - Odchylka
Reset Znacznik_ruchu
Do
   If Znacznik_ruchu = 1 Then
      'wywołanie programu aktualizacji LCD
      Reset Znacznik_ruchu
   End If
Loop

Adc_test:
   Napiecie = Getadc(0)
   If Lsb_nap < Odchylka_minus Then
      Set Znacznik_ruchu
      Odchylka_minus = Lsb_nap - Odchylka
      Odchylka_plus = Lsb_nap + Odchylka
   End If
   If Lsb_nap > Odchylka_plus Then
      Set Znacznik_ruchu
      Odchylka_minus = Lsb_nap - Odchylka
      Odchylka_plus = Lsb_nap + Odchylka
   End If
Return
Jak to działa :?:
Timer1 15 razy na sek dokonuje pomiaru z ADC, i jeżeli wynik jest większy lub mniejszy niż zdefiniowana odchyłka, to ustawia Znacznik_ruchu. Teraz pętla główna sprawdza czy znacznik ruchu jest ustawiony na 1, jeżeli tak to wywołuje procedurę aktualizacji danych na wyświetlaczu.
PS. program to tylko ogólna idea, a nie gotowiec.
Ostatnio zmieniony 14 paź 2010, 19:17 przez kayron, łącznie zmieniany 1 raz.

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

Post autor: matrix » 14 paź 2010, 18:47

spoko, jestem wdzięczny. będzie się testować.
w jakiej roli użyłeś tu compare1a ?

ogólnie głównym założeniem dla mnie jest zbudowanie czegoś na wzór climatronica. chcę żeby procesor sam utrzymywał mi temperaturę w aucie na zadanym przeze mnie poziomie.

wiem że jest w ofercie avt coś w tym stylu, ale ja chcę zrobić swoje bo nie ma to jak popracować nad czymś i uda się to coś osiągnąć, a dwa chcę trochę więcej wsadzić niż tylko utrzymywanie temperatury.

samo utrzymywanie temperatury można sobie zrobić na wzmacniaczu operacyjnym.

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

Post autor: kayron » 14 paź 2010, 19:05

Tzn. ja to pisałem z HELPem Bascoma w ręku więc trzeba to dokładnie jeszcze sprawdzić dla ATMEGa32. Compare1a wykorzystałem w ten sposób że jak licznik Timera1 osiągnie wartość 512 to przerwanie od komparatora powinno go zrestartować i jednocześnie zgłosić przerwanie.
Ale powtarzam to nie jest testowanie i pisane na szybciora więc mogłem nie ustrzec się jakiegoś błędu, ale skompilować się skompilowało. No i jest to jedno z kilku możliwych podejść bo mamy jeszcze przerwania od przetwornika A/C, ale akurat nie wiem czy były by tu przydatne.
Teraz tak jak chcesz tym sterować PWM to należało by jeszcze zaprzęgnąć do tego Timer2, no chyba że jakoś da się zrobić 2 in 1, i Timer1 będzie robił 2 rzeczy naraz generował PWM i odliczał czas próbek z A/C. To możliwe bo ma 2 komparatory, które mogą pracować niezależnie, ale musiał bym się wgłębić w notę katalogowa Megi32.
I nie ruszaj Timera0 w swojej aplikacji, bo dekodowanie kodu RC5 komendę GetRC5 go używa.

keruseykaryu

Post autor: keruseykaryu » 14 paź 2010, 19:33

kayron pisze:Enable Interrupts
Enable Compare1a

On Compare1a Adc_test
Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1


Compare1a = 512
Ło matko i córko. Co to jest? Ty wiesz, że możesz być zasypany przerwaniami wtedy?
Zawsze: konfiguracje potem przerwania.
Ostatnio zmieniony 14 paź 2010, 19:43 przez keruseykaryu, łącznie zmieniany 1 raz.

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

Post autor: kayron » 14 paź 2010, 19:38

Bo.. :?: Masz aktywne tylko przerwanie od komparatora, który je zgłosi po 1024(preskaler)x512 czyli po 524288 cykli zegara. To niby skąd ci się weźmie ta masa przerwań ?
Chodzi mi o to że napisałeś coś, ale nie uzasadniłeś dla czego niby tak by się miało stać ?
Symulacja nie wykazała mi przynajmniej nagłej lawiny przerwań, wywołanej jakimś czynnikiem którego niby się doszukujesz w tych kilku linijkach kodu?
Linijka On comparate1a adc_test, to tylko deklaracja podprogramu dla kompilatora, a nie aktywowanie przerwań. Chyba że kompilator BASCOMa to by źle zinterpretował.
Ostatnio zmieniony 14 paź 2010, 19:47 przez kayron, łącznie zmieniany 1 raz.

keruseykaryu

Post autor: keruseykaryu » 14 paź 2010, 19:47

No problem. Włączamy przerwania. Włączamy z porównania. Licznik = 0, Compare1a = 0. Równe są? Są równe. Przerwanie już może być zgłoszone. Dochodzi do CONFIG, ale co to? Rejestry dalej są równe! Reset licznika, przerwanie. Core wykonuje LDS, a rejestry dalej równe. Pisać dalej?

[ Dodano: 2010-10-14, 20:48 ]
kayron pisze:Linijka On comparate1a adc_test, to tylko deklaracja podprogramu dla kompilatora, a nie aktywowanie przerwań.
Yezu! Przerwania są aktywne! Sam je włączyłeś przed On Compare1a. Nie widzisz tego?

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

Post autor: kayron » 14 paź 2010, 19:50

Źle sobie to interpretujesz linijka On comparate1a adc_test to nie instrukcja procesora, to tylko etykieta, która jest tłumaczona przez kompilator na adres z pod którego ma się zaczynać procedura (właściwie adres skoku do procedury) ADC_test, nic więcej.
Ostatnio zmieniony 14 paź 2010, 20:03 przez kayron, łącznie zmieniany 2 razy.

keruseykaryu

Post autor: keruseykaryu » 14 paź 2010, 19:52

Kontaktujesz? On przerwanie się nie wykona. Wykonają się Enable, potem może Config jakieś parę naście rozkazów później. Ale flaga OCF1A już będzie na maszcie. Przerwanie zgłoszone!

[ Dodano: 2010-10-14, 20:53 ]
I co z tym wspólnego ma ON.GOTO, albo ON.GOSUB? Mieszasz pojęcia.

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

Post autor: kayron » 14 paź 2010, 20:03

Nie chce mi się kłócić, trzeba by skompilować i wrzucić do jakiegokolwiek porcesora z podobnym Timerem1 i sprawdzić czy ocipieje. Jedyne wytłumaczenie że BASCOM jest wrażliwy na kolejność linii Config i on w kodzie, a o to sie nie będę spierać bo możliwe, BASCOM już nie raz zrobił mnie w bambuko, i pisałem kawałki kodu z not ATMELA w ASM, bo inaczej nie szło.

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

Post autor: matrix » 14 paź 2010, 20:42

wrzuciłem do procka i przerwanie od Compare1a na pewno jest wywoływane. co dalej mam sprawdzić?

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

Post autor: kayron » 15 paź 2010, 18:10

A jaką częstotliwość powinien mieć PWM, bo można by uzyskach ok 244Hz lub 1,9KHz oczywiście przy 8 bitowym PWM ?
Pytam bo nie wiem jaka częstotliwość PWM próbować dobrać do sterowania wentylatorem.

keruseykaryu

Post autor: keruseykaryu » 15 paź 2010, 19:45

kayron pisze:A jaką częstotliwość powinien mieć PWM, bo można by uzyskach ok 244Hz lub 1,9KHz oczywiście przy 8 bitowym PWM ?
Jaki zegarek?

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

Post autor: kayron » 15 paź 2010, 19:57

To było raczej pytanie do Matrixa bo to on buduje urządzenie, i z tego co wiem to ma tam być 8MHz, ale mnie chodzi o to jak jest zalecana częstotliwość PWM dla silnika DC na 12V (popularny wentylator). A pytam z 2 powodów, bo "kombinuję" nad tym timerem T1 pracującym jednocześnie jako generator próbkowania dla ADC i generator PWM dla silnika wentylatora. Powinno się dać, a z drugiej strony sam muszę zbudować PWMa na NE556 do sterowania dmuchawą z auta i chciałbym wiedzieć jaka jest właśnie zalecana czy ogólnie przyjęta częstotliwość ?

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

Post autor: matrix » 15 paź 2010, 22:37

kayron pisze:A jaką częstotliwość powinien mieć PWM, bo można by uzyskach ok 244Hz lub 1,9KHz
tu mi trudno cokolwiek rzec. żeby to się nigdzie tam nie udzielało w żadnym urządzeniu typu komputer sterowania wtryskiem czy od sekwencji, czy też w najlepszym razie radio.

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

Post autor: kayron » 16 paź 2010, 12:59

Tzn tak. z tego co wyczytałem to fachmany, to twierdzą że częstotliwość waha się w granicach od 500Hz do 30KHz, znalazłem nawet wzór do obliczenie Fpwm, ale trzeba znać obroty maksymalne i liczbę uzwojeń, więc nie będziemy się w to bawić.
Natomiast stwierdzili oni że im mniejsze Fpwm tym bardziej piszczy silnik (charakterystyczny pisk we wkrętarkach czy wiertarkach z regulacją obrotów). Ponieważ my nie chcemy aby w aucie piszczał nam wentylator to proponuję taki kompromis.
Preskaler na 8 x rozdzielczość PWM czyli 8b da ok 2KHz, co powinno być dobrym lekarstwem, nie najlepszym, ale do przyjęcia. Ostatecznie preskaler x1 i mamy ~16KHz.
EDIT
A bo zapomniałem. Matrix jak ma reagować ten potencjometr ? Tzn. co się ma dziać przy skrajnym położeniu na Minimum, wentylator ma się kręcić np. na 20%, czy zatrzymać całkowicie (czyli wyłączyć się ma dmuchawa). Bo nie wiem czy jest jakiś dodatkowy wyłącznik w samochodzie do niego, czy robi to potencjometr ?
Ja osobiście zrobił bym to na obydwa sposoby bo wygodniejsze.

ODPOWIEDZ