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



Teraz jest 10 lip 2026, o 07:06


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 6 cze 2016, o 10:23 
Offline
Nowy

Dołączył(a): 05 cze 2016
Posty: 12
Pomógł: 0

Witam. Kontynuując wątek (topic15524.html) pomiarów za pomocą przetwornika ADC chciałem odczytać wartości z kilku fotorezystorów. Z jednego jak na załączonym schemacie dałem radę odczytywać wartości. Problem jest w przypadku podłączenia drugiego elementu.

Stosuję zamianę na liczby całkowite jak w przypadku książki o zapisie najpierw części dziesiętnej a następnie ułamkowej.

[ a kolega to nie może sięgnąć do instrukcji topic7402.html jak się wstawia listingi na forum? proszę to poprawić - mirekk36 ]

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

Pytanie brzmi czy istnieje jakaś szybsza możliwość odczytywania pomiaru z kilku wejść za pomocą jednej stałej funkcji. pomiar(5)|pomiar(4)?? Istnieje pewnie szybszy sposób niż tworzenie następnej zmiennej do odczytywania wartości z kolejnego pinu i podstawianie nowej wartości do wzorów. Mozolne tworzenie następnych zmiennych zwiększy rozmiar programu a chciałbym do niego dodać jeszcze kilka rzeczy. Czas trwania pomiaru nie jest dla mnie ważny i może być nawet co kilka sekund(wiem o prędkości pomiarów w przetworniku,o tym że jednocześnie nie można korzystać z dwóch wejść i wiem, że delay ms to zło :D)

Obrazek
Pozdrawiam ;)
EDIT. ZROBIONE PANIE MIROSŁAWIE :)



Ostatnio edytowano 6 cze 2016, o 16:50 przez pablo22, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2016, o 11:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 mar 2015
Posty: 116
Pomógł: 16

Z tym delay ms to nie demonizuj. Nie jest to zło o ile wiesz po co i dlaczego go stosujesz ;) . Wnioskuję, że chcesz dokonać pomiarów ADC ,obrobić surowe wyniki a następnie wysłać "w świat" przez UART. To może zrobić to w taki sposób ? :
- organizujesz tablicę na wyniki pomiarów (tyle elementów ile fotorezystorów),
- zapełniasz tablicę wynikami pomiaru,
- obrabiasz wyniki pomiarów stosując do każdego elementu tablicy funkcję ,która Ci policzy co tam sobie życzysz,
- obrobione wyniki wysyłasz przez UART.
- procesor podejmuje inne ważne zadania....


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2016, o 16:49 
Offline
Nowy

Dołączył(a): 05 cze 2016
Posty: 12
Pomógł: 0

Dzięki za odpowiedź. Właśnie chciałbym uniknąć, żeby do każdego wyniku w tablicy robić osobną funkcję.

same wyniki w rozdzielczości 10-bitowej mógłbym wpisać za pomocą kilku zmiennych np z powyższego
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kombinuję tak, aby skalibrować (na ile to możliwe) dokładnie wszystkie potencjometry aby w momencie nie naświetlania fotorezystorów wartości odczytywanej rozdzielczości były w miarę przybliżone(rozrzut powiedzmy 8-10 czyli niewiele jak na 1024 kroki) i zapisać w programie wartość napięcia dla danej rozdzielczości np. 810->2V. Program miałby pamiętać ten pomiar i w momencie zmiany naświetlenia dla każdego z 3 czujników liczyłaby się 1 proporcja z powyższej zależności bez długich linijek kodu.

Liczę na pomoc, każda pomysł się przyda jak można to rozwiązać



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2016, o 19:03 
Offline
Użytkownik
Avatar użytkownika

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

Witam
pablo22 napisał(a):
Kontynuując wątek (topic15524.html) pomiarów za pomocą przetwornika ADC chciałem odczytać wartości z kilku fotorezystorów.

...mogłeś zostać przy starym, jeśli jest to cd. tematu - ale ja nie o tym.
Czy mierząc napięcia na poszcz. wejściach uC z fotorezystorów potrzebujesz znać napięcie ( nieoświetlony - częściowo ośw. - ciemność ) czy tylko dwustanowo - bo jeśli to drugie to przy odpowiedniej konfiguracji możesz odczytywać stan całego portu wejściowego.

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2016, o 06:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 mar 2015
Posty: 116
Pomógł: 16

Miałem na myśli taki sposób;

wynik[i] = TwojaFunkcjaObrabiajacaPomiar ( pomiar[i]); // gdzie i przyjmuje warości 0,1,2 (wspomniałeś o 3 fotorezystorach).

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2016, o 17:33 
Offline
Nowy

Dołączył(a): 05 cze 2016
Posty: 12
Pomógł: 0

Pojawił się w międzyczasie innego typu problem. Dodałem na chwilę obecną do układu tylko 2 fotorezystory więc korzystam cały czas z powyższego wyliczenia zamiana rozdzielczości na część dziesiętną i ułamkową. Tak ustawiłem potencjometry przy fotorezystorze, że pokazuję na ekranie wartości w przybliżeniu takie same, które później są zamieniane na napięcie.

W momencie całkowitego przykrycia jednego fotorezystora dostaje właściwe wartości czyli 0 w przypadku rozdzielczosci przez więc napięcie płynące również 0V, niestety w przypadku przykrycia drugiego dostaje wartość różniące się od 0 i nie mówię tutaj o 10-20 krokach w rozdzielczości 10-bitowej ale nawet 100-120 przy jakimś napięciu.

Rozumiem, że jest to błąd wynikający z nieprawidłowego ustawienia rejestru, w przypadku odczytywania kilku danych z przetwornika ADC?


Na chwilę obecną ustawiona inicjalizacja ADC wygląda następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Pominąłem ustawienie jakiegoś bitu w rejestrze? Próbowałem po pierwszym pomiarze odczekać delayem :D 1sekunde a nastepnie odczytac drugi pomiar ale to nic nie daje.

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

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2016, o 20:17 
Offline
Użytkownik
Avatar użytkownika

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

Witam
Nie wiem, czy nie za mało zer masz w masce:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

MUX'ów jest cztery.

Pozdr.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2016, o 20:58 
Offline
Nowy

Dołączył(a): 05 cze 2016
Posty: 12
Pomógł: 0

No rzeczywiście zrobiłem babola, jednak problemu po zmianie bitu to nadal nie rozwiązuje;/ Operacje na bitach w rejestrach są wystarczające? Jak ustawiłem je na taką samą wartość to przecież powinny zachowywać się identycznie i zmiany po 0,2V(przy zakrywaniu) są niedopuszczalne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2016, o 21:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Witam,

Kolego pablo22

wczytuję się w posty i mam problem ze zrozumieniem podejmowanych kroków. :(
Chodzi mi o chronologię.
Wskazana część kodu wskazuje na przesył odczytu z ADC5;
Natomiast piszesz ze po zakryciu fotorezystora drugiego, wskazania są błędne.
Jeżeli wysyłasz odczyt z ADC5, i zakrycie drugiego fotorezystora zmienia wskazania,
to świadczyłoby o niewłaściwym podłączeniu.
Jeżeli masz możliwość, to sprawdź miernikiem napięcie na ADC5 po ustawianiu na 0.( kalibracja),
i zobacz co się stanie po zakryciu drugiego fotorezystora.
Jeżeli napięcie wzrośnie, bo to sugerują opisy, to znaczy że błąd w podłączeniu.

chyba że źle coś zrozumiałem.( na fotce jest podpięty jeden foto, czy pozostałe mają identyczne podłączenie? czy każdy ma oddzielny PR-do masy).?

Jeżeli chodzi o odczyt z kilku ADC, to przyda się PDF-ka.
ustawiając MUX-y, od żadnego - do 7, ustawiasz aktualny odczyt z jednego z ADC.
Do zapisania w tablicy np. wynik[numer], możesz użyć swojej funkcji pomiar(numer)- i tę zmienną cyklicznie zmieniać. A wysyłając wyniki, przydałoby się je rozdzielić np.

p1 wynik[0] p2 wynik[1]... ...i zaczynasz linijkę od początku.

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

tak poglądowo ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2016, o 21:40 
Offline
Nowy

Dołączył(a): 05 cze 2016
Posty: 12
Pomógł: 0

Rozumiem, że może być problem ze zrozumieniem tego co piszę :P
Rysunek wrzucony wcześniej pokazał podłączenie jednego czujnika do pinu PC5. Robilem pomiary miernikiem i po kreceniu potencjometrem wartosci zmienialy sie tak ja powinny. Następnie w identyczny sposób podłączyłem do pinu PC4 kolejny czujnik i do głownej pętli wrzuciłem oprócz pm = pomiar(5) także pm1 = pomiar(4) (pomiar z kolejnego pinu adc) . Po wgraniu programu do mikrokontrolera 1 czujnik smiga dobrze, drugi takze i po kreceniu potencjometerem wartosci zachowuja sie prawidlowo(0-2.56) tak jak wybralem napiecie odniesienia.

Problem jest w momencie ustawienia przez potencjometry prawie rownych wartosci rozdzieczosci( patrzac na wyswietlacz ) . powiedzmy na czujnik1 jest w zakresie od 0-1023 liczba 800 a na drugim czujniku wartosc 820. jezeli napiecie odniesienia mam 2,56 to blad na 1 kroku to 0,0025 wiec tutaj blad napiecia miedzy dwoma wynikami to 0,05V. W momencie przykrycia 1czujnika dostaje 0 prawidlowe. Jak zrobie tak samo z drugim czujnikem to dostaje wartosc z kosmosu tzn 50 i do tego jakies napiecie 0,2V. Skąd tak duży błąd?

Z tym maskowaniem bitow to czasem pan Mirek nie mowil ze w tym przypadku Atmega8 jest tylko 7 mozliwosci wiec maskujemy tylko 3 bity a nie cztery? (to apropo wczesniejszego posta).

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2016, o 22:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 mar 2015
Posty: 116
Pomógł: 16

A robiłeś następujące ćwiczenie ?;
nie ruszając ustawień potencjometrów, zamień miejscami podawane na wejścia sygnały analogowe, czyli sygnał z dotychczasowego 2 fotorezystora na 1-sze wejście ADC i odwrotnie.

A tak na marginesie ,nie bardzo rozumiem po co Ci w tym konkretnym przypadku znajomość napięcia. Stosujesz fotorezystory ,które zmieniają swoją rezystancję w zależności od natężenia podającego światła.Czyli mierząc R fotorezystora pośrednio mierzysz natężenie światła. Dzielnik napięcia R2 100kOm /fotorezystor (wróciłem do pierwotnego schematu) jest zasilany z Vcc podobnie jak uP. Jak wykorzystasz Vcc jako napięcie odniesienia do konwersji ADC , występuje ono z obu stron równania przetwarzania i się upraszcza. W przeliczeniach istotna jest wartość R2 ! Dlatego zastosowanie PR1 zamiast stałego R2 jest wielce dyskusyjne ( w zależności od położenia ślizgacza wartość rezystancji między zaciskami 2-3 trzeba zmierzyć i wstawić do przeliczeń).
Może spróbuj tak;
- zastosuj R2 100 kOm - możesz je przesortować stosując nawet najprostrzy miernik, różnica między rezytorami rzędu: 1000 Om to 1%, 500 Om - to 0,5 % ,250 Om 0,25% itd. - wybierzesz n (tyle ile chcesz torów pomiarowych) najmniej różniących się,
- zestaw n torów pomiarowych jak poprzedniu R2/fotorezytor podpięty do Vcc,
- zakładam ,że stosujesz fotorezystory tego samego typu,
- umieść fotorezystory jak najbliżej siebie ,a źródło światła na tyle daleko, aby można było przyjąć ,że na każdy z nich pada światło o tym samym natężeniu.
- dokonaj pomiarów dla każdego toru ,
- zwiększ odległość źródła światła (zmniejszasz natężenie światła padajacego),
- dokonaj pomiarów dla nowych warunków oświetleniowych dla każdego toru,
- powtórz powyższe dwa kroki, ile razy tam sobie życzysz - w ten sposób otrzymasz realne krzywe natężenie światła-R dla każdego fotorezystora,
- jak zwizualizujesz wyniki np w OpenOffice czy innym arkuszu kalkulacyjnym, będziesz wiedzał jak różnią się egzemplarze fotorezystorów między sobą,

i to bybyło dzisiaj na tyle.
Pozdr.

P.S Powyższe o upraszczaniu sie Vref obowiązuje oczywiście dla przypadku gdy napięcie odniesienia ADC i zasilania dzielnika są takie same.
Jak stosujesz wewnętrzne Vref 2,56V to uzyskasz większą dokładność w zakresie "ciemniejszym" fotorezystora ale tracisz informację co dzieje się w zakresie "jaśniejszym" ,gdy napięcie na wejściu ADC przykroczy 2,56V. Wypadałoby wtedy też , o ile masz wolne wejście ADC , mierzyć napięcie zasilania dzielnika oporowego R2/fotorezystor po uprzednim zmniejszeniu na dzielniku oporowym np. 1/2 , 2x10kOm.



Ostatnio edytowano 7 cze 2016, o 23:16 przez maverick_as, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2016, o 22:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Kolega dobrze podpowiedzial. :) czyli tylko poczytaj o MUXach.
......................................................................................
Czy próbowałeś zewrzeć czujniki ( nóżki scalaka )? Jeżeli pokażą zbieżne wartości to będzie znaczyło że rozbieżność jest w czujnikach. tzn w charakterystyce przewodzenia pod wpływem światła.
Może zamień czujniki i zobacz czy po wyskalowaniu dziwne zachowanie się podmieniło miejscami.

Co do MUXów,w tym procesorze do ustalenia ADC są 3. :) czwarty jest do " 1,30(VBG) oraz 0V (GND)",
dlatego możesz "czwartego-MUX3" - zamaskować. ;)

0000-ADC0
0001-ADC1
0010-ADC2
0011-ADC3
0100-ADC4
0101-ADC5
0110-ADC6
0111-ADC7
......................................................



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 cze 2016, o 11:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 maja 2013
Posty: 432
Lokalizacja: Gostyń / Poznań
Pomógł: 25

Mi się natomiast odrazu w oczy rzuciło to:

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

pm masz z zakresu 0-65535... mnozysz to razy 25 i razy 13 jeszcze i ma ci to dac liczbe w zakresie od 0-255?

_________________
Podpis...



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: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Baidu [Spider] 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