Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 15 mar 2025, o 00:10


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 4 cze 2015, o 23:23 
Offline
Użytkownik

Dołączył(a): 14 gru 2014
Posty: 30
Zbananowany użytkownik

Pomógł: 0

Dzień dobry! Dzisiaj postanowiłem zabrać się za temat ADC i zabrałem się do oglądania poradnika o ADC. Kiedyś obejrzałem całość, a teraz dobrnąłem do 3 części.
Niestety mój problem jest taki, że ADC zwraca mi wartość 0.
Może zacznę od schematu:
Obrazek
Program:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wykonana płytka:
Obrazek

Dzielnik napięcia podłączam do nóżki PA7 (atmega32).

Jak bym się nie starał zawsze dostaje wynik 0. Sprawdzałem nóżki od PA0 do PA7 i na każdym dostaje wartość zero.
Jeżeli nie mam błędu w kodzie programu, to może macie jakieś pomysły, gdzie mogę mieć zwarcie, może AREF AVCC daje takie efekty? Każde wyjście mikrokontrolera sprawdzałem na pasku magicLED i wszystkie działały.

Bardzo proszę o pomoc.



Ostatnio edytowano 5 cze 2015, o 08:03 przez Rzeczek, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2015, o 23:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Popraw zanim usuną albo bana dostaniesz: topic7402.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2015, o 23:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 02 sty 2014
Posty: 39
Lokalizacja: Pszczyna
Pomógł: 4

W BB jak i w nocie procka pisze, że dla 10-bit pomiaru ADC częstotliwość próbkowania powinna wynosić od 50 do 200kHz. W Twoim przypadku preskaler ustawiony na 16 daje częstotliwość próbkowania 1000kHz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2015, o 08:28 
Offline
Użytkownik

Dołączył(a): 14 gru 2014
Posty: 30
Zbananowany użytkownik

Pomógł: 0

Zmieniłem dzielnik na:
ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // preskaler=128
i dalej nie działa.

Dodatkowo od dłuższego czasu zastanawiał mnie wzór użyty w książce. Na zajęciach na Politechnice Poznańskiej w skrypcie miałem podane coś takiego:
Cytuj:
Dobór taktowania jest ważną rzeczą, jego wartość powinna się zawierać pomiędzy 50kHz a 200kHz. Częstotliwość taktowania zegara ADC oblicze się ze wzoru:

taktowanieADC=F_CPU/(N*14,5)

Gdzie: F_CPU – częstotliwość głównego zegara, N –prescaler ADC.
Uwaga, zaznajomić się z tabelą 95 oraz informacjami na stronach 233-235. We wzorze uwzględ-niono czas trwania konwersji w cyklach (14,5 cykla).

Pytałem się także profesora na wykładzie czy dzielnik 14,5 w mianowniku tam występuje i powiedział, że tak.

Nie wiem, może w fusebitach można wyłączyć ADC, pamiętam że wyłączyłem jtaga, może coś jeszcze tam przeskrobałem ;)
Może ktoś z was ma doświadczenie z takim problemem, mogę mieć coś nie tak polutowane, może dławik jest popsuty i nie przewodzi, albo odwrotnie przewodzi. Może po południu będę miał multimetr, to spróbuję poszukać błędu.

Dodatkowo wcześniej na układzie robiłem obsługę dwóch żyroskopów i dane wysyłałem do kompa i było ok. Po wgraniu tego kodu często putty nie może się połączyć do COM2 bo jest zajęty. Czy dławik przy AVCC może powodować prąd wsteczny przy rozłączaniu zasilania? Może trzeba gdzieś wpiąć diodę podłączoną zaporowo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2015, o 08:31 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3219
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

A co podłączasz do ADC, bo na schemacie tego nie ma.

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2015, o 08:39 
Offline
Użytkownik

Dołączył(a): 14 gru 2014
Posty: 30
Zbananowany użytkownik

Pomógł: 0

Dzielnik napięcia
Obrazek
Smutny terminal
Obrazek
Układ
Obrazek

Wydaje mi się, że nawet jak bym nic nie podłączył na tej nóżce to powinien być stan nieustalony.

Podłączałem wyjście z dzielnika na nóżkę z diodą i mogłem regulować jasność świecenia, więc dzielnik działa.



Ostatnio edytowano 5 cze 2015, o 09:13 przez Rzeczek, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2015, o 09:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

A może brak :!: w tym wyrażeniu " while( ADCSRA & (1<<ADSC) );".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 cze 2015, o 10:47 
Offline
Użytkownik

Dołączył(a): 14 gru 2014
Posty: 30
Zbananowany użytkownik

Pomógł: 0

Free running mode mi ładnie działa
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Więc błąd jest gdzieś w kodzie dla pojedynczego wyzwalania. Ktoś ma jakiś pomysł? :)

--- Dzień później ---
Udało mi się zrobić oscyloskop na podstawie bibliotek jfreechart i rxtx.
Obrazek
Składnia: [ Pobierz ] [ Ukryj ]
język java
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Chyba nie najgorzej wyszło :)

--- Dwa dni później ---
Wesoły terminal wyświetlający napięcie
Obrazek
Następnym razem jak usiądę spróbuję samodzielnie wyzwalać adc :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lip 2015, o 20:47 
Offline
Użytkownik

Dołączył(a): 14 gru 2014
Posty: 30
Zbananowany użytkownik

Pomógł: 0

Powoli skonfigurowałem wywoływany pomiar w takiej kolejności jak przy działającym free running mode i wszystko działa.
Możliwe, że włączenie ADC i późniejsze ustawianie preskalera i reszty powodowało problem.
Wydaje mi się, że w przypadku prostego potencjometru, który jest zasilany tym samym źródłem napięcia co mikroprocesor lepiej użyć napięcia odniesienia 5V, wtedy odczyt waha mi się o 2 punkty, ma to sens, bo wahania napięcia w tym samym czasie występują i na potencjometrze i na mikroprocesorze. Oczywiście, jeżeli użyjemy źródła sygnału o oddzielnym zasilaniu, to wewnętrzne napięcie odniesienia w mikroprocesorze będzie lepsze.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lip 2015, o 00:54 
Offline
Użytkownik

Dołączył(a): 14 gru 2014
Posty: 30
Zbananowany użytkownik

Pomógł: 0

Dokonuje pomiaru dzielnika napięcia z częstotliwością 100Hz i ładnie działa
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Częstotliwość 1000Hz jest to już za dużo, 200Hz także. Czy ktoś może mi powiedzieć jak mogę policzyć z jaką częstotliwością mogę dokonywać pomiarów?
Na mój program składa się:
- odczyt ADC
- wysłanie go po RS232 - ustawiłem go na 1Mbps i ładnie przesyła mi znaczki.

Jak mi się wydaje, że mogę policzyć jaką częstotliwość mogę uzyskać:
Częstotliwość kwarcu / Preskaler ADC
16000000 / 128 = 125000
Na pomiar adc składa się 14,5 taktów zegara, więc pewnie trzeba podzielić dalej
125000/14,5 = 8620
A więc mając 1000Hz uzyskuje tylko kilka wolnych taktów zegara
8620/1000 = 8,62
Nawet przy 200Hz procesor się nie wyrabia
8,62*5 = 43,1

Po pomiarze muszę wysłać wynik przez RS232
Mam 5 znaków
Każdy znak to 2 bity
Wychodzi wysłanie 10 bitów

Funkcja wysyłająca znaki
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Z jaką częstotliwością można wysyłać znaki przez tą funkcję?
Wydaje mi się, że pomiar adc trwa tylko 14,5 taktów, a wysłanie znaków trwa dużo dłużej i to ta funkcja jest tutaj wąskim gardłem.

Czy uda mi się zyskać na wydajności, w funkcji pomiaru ADC
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

pozbędę się while i w programie po wysłaniu znaków będę sprawdzał, czy pomiar się skończył?
<pomiary trwają już jakiś czas>
- <zaczynam pomiar ADC>
- <przeskakuje do wysyłania poprzedniego pomiaru przez RS232>
- <po wysłaniu paczki danych odczytuje ADC>
I tak w kółko te trzy punkty.

Czy coś takiego ma sens?
Gdyby udało mi się uzyskać 200Hz byłbym zadowolony.
Nie jestem pewien jaką część czasu zegara zabiera pomiar ADC bo działa on ze swoim preskalerem i jak to się odnosi do wolnego czasu, który ma reszta mikroprocesora (nie ma ona preskalera).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 lip 2015, o 11:16 
Offline
Użytkownik

Dołączył(a): 14 gru 2014
Posty: 30
Zbananowany użytkownik

Pomógł: 0

main.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


timer.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


adc.c
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Po dodaniu przerwania do ADC udało mi się uzyskać próbkowanie sygnału i przesyłanie do komputera na poziomie 8333Hz przy BAUDRATE 1000000.
Dla BAUDRATE 250000 przesyłanie ograniczone jest do 2500Hz
Sam mikroprocesor jest ograniczony tylko szybkością pracy ADC ok. 125kHz, wartość tą dzielimy przez ilość taktów zegara potrzebnych na całkowanie ja sobie przyjąłem 14,5 i z tego wychodzi 8620Hz gdy ustawimy BAUDRATE na 1000000 bufor UARTA nigdy się nie zatka.

A kod pewnie przyda się tym co zaczynają przygodę a ADC :)
UART obsługuje biblioteka z książki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO