Ośmiokanałowy system akwizicji danych pomiarowych

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!
ODPOWIEDZ
Awatar użytkownika
mariusz_edw
Użytkownik
Posty: 307
Rejestracja: 22 lip 2005, 13:02
Lokalizacja: Polanica Zdrój
Kontakt:

Ośmiokanałowy system akwizicji danych pomiarowych

Post autor: mariusz_edw » 01 paź 2006, 21:41

Wielokanałowy system akwizycji danych pomiarowych, hmm... Wyobraźmy sobie coś takiego.

Mikrokotroler AVR z ośmioma liniami ADC (z tego co patrzyłem po notach katalogowych - najczęściej realizowane jako jeden multipleksowany przetwornik ADC) mierzy napięcia analogowe i zapisuje wyniki w pamięci lub przesyła je dalej, do późniejszej obróbki.

Nie znam jeszcze wszystkich parametrów urządzenia, którego realizacji mam się podjąć, wiadomo jednak, że operacja pomiaru będzie miała się odbyć parędziesiąt lub paręset razy na sekundę. Nie znam jeszcze również wymaganej rozdzielczości przetwornika ADC.

Ponieważ cała zabawa dopiero przede mną, ciekaw jestem jaki mikrokontroler AVR wybraliby sobie użytkownicy forum. Rzecz jasna ciekawią mnie również powody takiego czy innego wyboru :)

Mile widziane linki i namiary na gotowe rozwiązania podobnego systemu.

Dziękuję pięknie i pozdrawiam :)

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 01 paź 2006, 22:02

Hmmm... Osobiście pozostałbym przy mega8...

Czas konwersji przy dziesięciobitowej dokładności może zająć do 260us (czas maksymalny), taktowanie przetwornika przy takiej dokładności nie powinno być wyższe niż 200kHz.
Pierwsza konwersja po przełączeniu źródła zajmuje 25 cykli zegara ADC (125us przy 200kHz).
Piszesz, że potrzeba kilkuset próbek z kilku kanałów... Przy ośmiu kanałach potrzeba ok. 2,5ms na odebranie danych ze wszystkich wejść, dodać należy oczywiście czas na obsłużenie każdego z nich oraz przełączenie kanału. Przyjmując, że procesor taktowany jest z zegarem 10MHz, pojedyńcza instrukcja trwa 100ns - można więc przyjąć, że potrzebne będzie ok. 2,5us na kanał...

Czyli mamy 3ms - czyli można spokojnie sprawdzać stan wejść kilkusetkrotnie w ciągu sekundy...

Oczywiście - mogłem się pomylić w obliczeniach, ale i tak przyjąłem pewien zapas...

Awatar użytkownika
mariusz_edw
Użytkownik
Posty: 307
Rejestracja: 22 lip 2005, 13:02
Lokalizacja: Polanica Zdrój
Kontakt:

Post autor: mariusz_edw » 29 gru 2006, 13:03

No i przyszedł czas na to, aby zabrać się wreszcie za projekt, a przy tym, poznać w praktyce uP Atmega16 (Atmega8 ma mniej ADC).

To co? Wrzucamy, na dzień dobry, zewnętrzny oscylator o maksymalnej wielkości taktowania dla tego procka, czyli 16 MHz, reset niech sobie na razie wisi w powietrzu (power-On reset), podłączamy ISP i zasilanie, dołączamy MAX232, łączamy z RS-em PC i uruchamiamy systemowy monitor. Na koniec włączamy Bascoma i zaczynamy zabawę :)

Jej, żeby chociaż tak mi się chciało, jak mi się nie chce... ;)

Awatar użytkownika
marcing
Użytkownik
Posty: 868
Rejestracja: 14 lut 2006, 14:13
Lokalizacja: z pociągu...
Kontakt:

Post autor: marcing » 29 gru 2006, 20:45

mariusz_edw pisze:reset niech sobie na razie wisi w powietrzu (power-On reset)
Lepiej podłączyć kondensator (elektrolit) od strony GND, a rezystor do Vcc - zapobiegnie resetowaniu układu przy zakłóceniach...
mariusz_edw pisze:zewnętrzny oscylator o maksymalnej wielkości taktowania dla tego procka, czyli 16 MHz,
Jeżeli musimy oszczędzać każdy mA prądu - lepiej stosowac jak najmniejsze wartości (lub wewnętrzny oscylator RC)
Ale dla prób, oraz dla takiego systemu to raczej nieistotne. Pozostałbym jednak przy "okrągłej" wartości 10MHz - będzie można w miarę łatwo wyliczyć czas wykonywania poszczególnych elementów programu, oraz potrzebny dla działania ADC...

Awatar użytkownika
mariusz_edw
Użytkownik
Posty: 307
Rejestracja: 22 lip 2005, 13:02
Lokalizacja: Polanica Zdrój
Kontakt:

Post autor: mariusz_edw » 29 gru 2006, 21:01

marcing pisze:Pozostałbym jednak przy "okrągłej" wartości 10MHz - będzie można w miarę łatwo wyliczyć czas wykonywania poszczególnych elementów programu, oraz potrzebny dla działania ADC...
Racja. Cenna uwaga :)

[ Dodano: 2007-05-23, 11:34 ]
marcing pisze:Czas konwersji przy dziesięciobitowej dokładności może zająć do 260us (czas maksymalny), taktowanie przetwornika przy takiej dokładności nie powinno być wyższe niż 200kHz.
Pierwsza konwersja po przełączeniu źródła zajmuje 25 cykli zegara ADC (125us przy 200kHz).
Piszesz, że potrzeba kilkuset próbek z kilku kanałów... Przy ośmiu kanałach potrzeba ok. 2,5ms na odebranie danych ze wszystkich wejść, dodać należy oczywiście czas na obsłużenie każdego z nich oraz przełączenie kanału. Przyjmując, że procesor taktowany jest z zegarem 10MHz, pojedyńcza instrukcja trwa 100ns - można więc przyjąć, że potrzebne będzie ok. 2,5us na kanał...

Czyli mamy 3ms - czyli można spokojnie sprawdzać stan wejść kilkusetkrotnie w ciągu sekundy...

Oczywiście - mogłem się pomylić w obliczeniach, ale i tak przyjąłem pewien zapas...
Ostateczny wniosek wydał się rewelacyjny, okazało się jednak, że wąskim gardłem okazała się sama transmisja po RS232. Ale problem i tak jest co najmniej dziwny.

System uruchomiłem na Atmega16 taktowanym zewnętrznym kwarcem 16MHz. Szybkość transmisji ustawiłem na 38400 baud, z względu na minimalny błąd BAUD error w listingu pokompilacyjnym programu Bascom AVR.

Tak na oko 19200 baud to w przybliżeniu 1500 znaków na sekundę. Ponieważ za jednym razem przesyłane są 32 znaki, więc taki ciąg dałoby się przesłać spokojnie nawet 50 razy w ciągu sekundy. A ja mam prędkość nawet 38400 baud!

Tymczasem w praktyce maksymalny osiąg to... 5 razy w ciągu sekundy.


Aplikacja PC wysyła rozkaz TX do urządzenia, urządzenie odsyła zmierzone wartości w postaci ciągu:

dana1:dana2:dana3:dana4:dana5:dana6:dana7:dana8

za pomocą Bascomowej instrukcji Print.

Maksymalna szybkość jaką udaje mi się osiągnąć przy Atega16 i kwarcu 16MHz to około 5Hz. Aplikacja posiada suwak, którą mogę ustawić szybkość pobierania danych z urządzenia. Urządzenie wysyła komendę TX w interwale jaki ustawiam za pomocą suwaka, a następnie szybko odczytuje bufor RS232 i przekazuje dane do zmiennych.

W aplikacji zrobiłem okienko logowania dzięki któremu mogę obserwować cały odbierany string (dana1:dana2:dana3:dana4:dana5:dana6:dana7:dana8)

I widzę, że przy zwiększaniu szybkości powyżej 5Hz string urywa się po 4 czy piątej danej.
Można to zobaczyć na filmie (ostatnie sekundy - w okienku logowania)

Film można pobrać spod adresu: http://rapidshare.com/files/32895888/clip0010.avi.html

Widać - urządzenie nie zdążyło jeszcze wysłać wszystkich danych.



To jest przykładowy string wysłany od urządzenia do PC:

Kod: Zaznacz cały

514:512:512:512:514:515:512:516
łącznie 32 znaki, wysłane za pomocą komendy print
a dokładniej kodu:

Kod: Zaznacz cały

Print Zmienna1 ;
Print ":" ;
Print Zmienna2 ;
Print ":" ;
Print Zmienna3 ;
Print ":" ;
Print Zmienna4 ;
Print ":" ;
Print Zmienna5 ;
Print ":" ;
Print Zmienna6 ;
Print ":" ;
Print Zmienna7 ;
Print ":" ;
Print Zmienna8 ;
Ot cały skomplikowany algorytm.

Najpierw urządzenie czeka na komendę (Input Komenda) a po odebraniu właściwej komendy (słowa TX wysyła printami 8 danych.

Dlaczego maksymalny osiąg do 5Hz, skoro z moich wstępnych obliczeń wynika, że powinno być z 10 razy tyle?

ODPOWIEDZ