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



Teraz jest 13 sty 2025, o 17:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
 Tytuł: przetwornik ADC
PostNapisane: 21 sie 2016, o 15:32 
Offline
Nowy

Dołączył(a): 30 lip 2016
Posty: 16
Pomógł: 0

Witam,

Chcę wykonać pomiar napięcia na pinie PC3 i w zależności od tego ustawić odpowiednie wypełnienie PWM. Ustawiłem za punkt odniesienia napięcie zasilania. Wiem, że może jest to niedokładne, ale na razie mi na tym nie zależy. Pin AREEF mam podłączony przez kondensator do masy, AVCC do zasilania +5V, równolegle także podłączyłem kondensator. Diodę LED podłączam anodą do pinu PC6 (OC0A), a katodą przez rezystor do masy.

Mój kod:

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


Niestety dioda jak martwa, pomimo zmiany podawanego napięcia na pin PC3, nie chce się zapalić. Zmianę napięcia ustalam potencjometrem 10k i najprostszym dzielnikiem napięcia, zmierzyłem woltomierzem i układ ten działa prawidłowo. Nie do końca wiem czy potrzebuję uruchamiać tryb Free Running Mode i zmieniać rejestry ADATE i ADCSRB. Tak czy siak program i tak nie chce działać prawidłowo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2016, o 16:35 
Offline
Nowy

Dołączył(a): 12 lut 2014
Posty: 10
Pomógł: 1

Proponował bym na początek sprawdzić czy PWM działa prawidłowo. Jesli dziala to dalej szukac przyczyny w ADC. Jaki to procek?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2016, o 18:19 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

matiase napisał(a):
Diodę LED podłączam anodą do pinu PC6 (OC0A), a katodą przez rezystor do masy.
OC0A to pin wyjściowy PWM timera 0, a w programie konfigurujesz timer 2. PC6 to pin portu C, a w programie jako wyjścia konfigurujesz piny portu D. Nie napisałeś jaki mikrokontroler, więc nie powiem jak to powinno wyglądać, ale coś tu jest ewidentnie nie tak.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2016, o 19:50 
Offline
Nowy

Dołączył(a): 30 lip 2016
Posty: 16
Pomógł: 0

Przepraszam Panowie, trochę pogmatwałem. Jest to mikrokontroler Atmega328p.
Po naniesionych poprawkach, widzę że PWM działa. Problem polega natomiast na tym, że aby zmienić jasność świecenia, muszę przekręcić potencjometr i na nowo wgrać program. Wygląda na to że przetwornik odczytuje jeden raz wartość napięcia i się zatrzymuje. Ja natomiast chciałbym aby odczytywał w sposób ciągły.

Poprawiony kod:

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


Pin PD6 (OC0A) ustawiam jako wyjście, bo to moje PWM i to do tego pinu podłączam diodę LED, PC3 ustawiam jako wejście, z którego przetwornik mierzy wartość napięcia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2016, o 20:22 
Offline
Użytkownik

Dołączył(a): 26 lut 2014
Posty: 227
Lokalizacja: LDZ
Pomógł: 22

Spójrz na linię 18. Masz ustawione jednokrotne wywołanie konwersji. Albo ustaw na free running, albo po każdym odczycie startuj ponownie konwersję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2016, o 20:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 sty 2013
Posty: 1760
Pomógł: 196

Witam
Zamiast
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
(?)
wystarczy ADC_wynik = ADC;
Po drugie, takie kaskadowe sprawdzanie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

- pomyśl ile if'ów się wykona gdy ADC_wynik>(np.)700 ?

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2016, o 20:42 
Offline
Nowy

Dołączył(a): 30 lip 2016
Posty: 16
Pomógł: 0

ryba84 napisał(a):
Spójrz na linię 18. Masz ustawione jednokrotne wywołanie konwersji. Albo ustaw na free running, albo po każdym odczycie startuj ponownie konwersję.


Ok, ale właśnie takie ustawienie bitów:

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


niestety sprawia, że dioda w ogóle nie zmienia swojej jasności. I nie rozumiem dlaczego.
Co do if'ów wiem, że trochę bez sensu, ale chodzi mi tylko o to aby widzieć efekt działania programu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2016, o 10:44 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

matiase napisał(a):
dioda w ogóle nie zmienia swojej jasności. I nie rozumiem dlaczego.

Jeśli ustawisz bit ADATE w rejestrze ADCSRA z wyzerowanymi bitami ADTS2:0, ADC pracuje w trybie Free Runnig.
W tej sytuacji konwersję startujesz tylko raz ustawiając bit ADSC w rejestrze ADCSRA (np. w Twoim przypadku przed pętlą while(1)). Nie sprawdzasz później zakończenia konwersji poprzez sprawdzenie bitu ADSC:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ponieważ jest on cały czas w stanie wysokim i program Ci się w tym miejscu zapętli. Rejestr ADC jest aktualizowany na bieżąco automatycznie, wystarczy go po prostu odczytywać.

Jak już wspomniał kolega kicajek nie kombinuj z konstrukcjami typu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i nie chodzi tu tylko o estetykę kodu.
Rejestr ADC jest rejestrem dwubajtowym i jest bardzo istotne, aby jego bajty były odczytywane w odpowiedniej kolejności (poczytaj w datasheet o Accessing 16-bit Registers). Taki odczyt, jak zrobiłeś, może spowodować, że kompilator odczyta najpierw rejestr ADCH, a powinien odczytać ADCL. W drugim przypadku nie będzie miał takich wątpliwości.

Zamiast trybu Free Running zalecałbym startowanie konwersji w równych odstępach czasowych za pomocą jakiegoś timera.
Nie zaszkodziło by też zastosowanie jakiegoś uśredniania wartości odczytywanych z ADC, bo na granicach zakresów możesz uzyskać "mrużenie" diod.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2016, o 13:39 
Offline
Nowy

Dołączył(a): 30 lip 2016
Posty: 16
Pomógł: 0

Aaaa, ok. Już rozumiem jak z tego korzystać.
Po poprawkach wszystko hula.

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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

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