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



Teraz jest 14 wrz 2025, o 21:58


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 29 mar 2014, o 12:21 
Offline
Nowy

Dołączył(a): 29 mar 2014
Posty: 11
Pomógł: 0

Witam zajmuję się obecnie projektem "Zewnętrzny sterownik wentylatora do komputera PC", mam już zaprogramowaną prawię większość między innymi pomiar temperatury przez cyfrowy czujnik, obsługa wyświetlacza znakowego, sterowanie PWM wentylatorem, ale stoję na jednej sprawie. Nie potrafię do końca dobrze napisać programu który zliczał by impulsy podawane przez wentylator ( żółty kabel), dwa impulsy na obrót. Czytam czytam dattashet ATmega32 bo taki mikrokontroler używam i w ostateczności jak już programuję to nie działa tak jak chce. Dlatego proszę o wskazówki bądź pomoc. Do pomiaru prędkości obrotowej chciałem użyć timer1 i wejścia ICP1. Jeżeli macie inny pomysł to proszę napisać. Chcąc sprawdzić czy dobrze konfiguruję rejestry napisałem program który zliczał by pojedyncze impulsy program poniżej.

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


Wkleiłem tylko urywek konfiguracji rejestrów i przerwanie. Cały układ mam na płytce stykowej, gdy podaję napięcie (+5V) na wejście ICP1 stan nie zwiększa się. Gdy układ jest blisko komputera bądź innego urządzenia zaczyna zliczać. Sądzę że to przez zakłócenia, ale tak też nie powinno być. Proszę o jakieś sugestie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2014, o 13:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

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

Przypatrz się :)

Czy zmienna stan jest volatile?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2014, o 19:27 
Offline
Nowy

Dołączył(a): 29 mar 2014
Posty: 11
Pomógł: 0

Tak zmienna stan jest volatile. Odnośnie tego co napisałem to patrzę i dalej nie wiem co może być źle. Rozumiem że chodzi o bit ICES1:

ICES1 = 0 przechwytywanie podczas zbocza opadającego na pinie ICP1, natomiast ICES1 = 1 podczas zbocza narastającego. Skopiowanie zawartości licznika do rejestru ICR1 następuje podczas wyzwolenie przechwycenia, równocześnie zostaje ustawiona flaga przerwania ICF1 i wykonanie przerwania, o ile system przerwań jest aktywny. Chyba wiem o co Ci chodzi , ale też testowałem przechwytywanie w taki sposób:

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


i też nie działał tak ja powinien, bo rozumiem że podczas podania zbocza narastającego aktualna wartość licznika jest wpisywana do rejestru ICR1 w przerwaniu o wektorze TIMER1_CAPT_vect), czyli na wyświetlaczu powinien jakoś zliczać te impulsy a wszystko dzieje się chaotycznie albo nie zlicza wogóle.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2014, o 19:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

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

Porównaj ze swoim zapisem ;)

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2014, o 20:09 
Offline
Nowy

Dołączył(a): 29 mar 2014
Posty: 11
Pomógł: 0

Ok widzę :P ale to chyba nie miało wpływu, bo w programie pojawił by mi się błąd przy kompilacji , a pewnie ja tutaj źle przepisałem (CS10) ---> (1<<CS10).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2014, o 20:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

cyber90 napisał(a):
Ok widzę ale to chyba nie miało wpływu, bo w programie pojawił by mi się błąd przy kompilacji , a pewnie ja tutaj źle przepisałem (CS10) ---> (1<<CS10).

tutaj i tu TCCR1B |=

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 mar 2014, o 23:52 
Offline
Nowy

Dołączył(a): 29 mar 2014
Posty: 11
Pomógł: 0

Ok widzę jutro przetestuję czy to działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 mar 2014, o 18:33 
Offline
Nowy

Dołączył(a): 29 mar 2014
Posty: 11
Pomógł: 0

Poprawiłem kod teraz część odnośnie inicjalizacji timer1 i sposób wyświetlania wygląda tak:

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


Na wyświetlaczu pojawiają się przypadkowe cyfry raz maleją raz rosną. Dodałem do konfiguracji bit odpowiedzialny za filtrowanie wejścia. Nie wiem co może być źle wektor przerwania jest raczej dobrze z tego co wyczytałem i jak zrozumiałem z instrukcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 mar 2014, o 18:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

cyber90 napisał(a):
DDRD=(0<<PORTD6);

a to nie ma być czasem tak
DDRD |= (1<<PORTD6);

------------------------ [ Dodano po: 5 minutach ]

a może raczej tak
PORTD |= (1<<PD6);

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 mar 2014, o 18:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Może to nie jest błędem i nie poprawi programu ale na pewno lepiej wygląda
jak funkcję sei() wywołasz w głównej funkcji programu main () gdzieś przed
główną pętlą niż w innej funkcji.

Ale na pewno błędem jest to: DDRD=(0<<PORTD6)
przesuwanie zera nie służy do wyzerowania bitu w rejestrze DDR
jeśli chcesz wyzerować ten bit to powinieneś zrobić to np. tak:

DDRD &= ~(1<<PD6);

I uwierz mi nie piszę tego złośliwie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 mar 2014, o 20:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

Witam

Przede wszystkim nie napisałeś jednej ważnej rzeczy. Mianowicie z jakiego napięcia będzie zasilany wentylator PC bo jeżeli z 12V, to należy amplitudę impulsów wyjściowych wentylatora ograniczyć do poziomu akceptowalnego przez mikrokontroler.
Przy wyświetlaniu przydało by się najpierw wykasować starą wartość (albo LCD_CLS() albo nadpisać ją spacjami i z powrotem ustawić lcd_locate() ). Może to powoduje chaotyczne wartości na wyświetlaczu.
Wyświetlając zawartość rejestru ICR1 wyświetlasz przechwyconą wartość licznika, która zawiera ilość zliczonych impulsów zegara wewnętrznego AVR-a z preskalerem do momentu pojawienia się impulsu z wentylatora na pinie ICP1. Nie jest to wartość o jaką Ci chodzi bo nie zliczasz ilości impulsów z wentylatora. Jest to przechwytywanie.
Pomyśl czy nie należałoby w rejestrze TCCR1B ustawić też bitu CS12 co da Ci możliwość "taktowania" rejestru zliczającego sygnałem zewnętrznym "External Clock Source" na końcówce T1 (PB1). To już niestety nie będzie "tryb przechwytywania" i będziesz np. musiał sam zadbać o wyzerowanie rejestru po pomiarze, bramkowanie itp. A przy pomiarze prędkości czas mierzyć drugim timerem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 kwi 2014, o 20:31 
Offline
Użytkownik
Avatar użytkownika

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

A ja nie widzę gdzie bufor Text jest definiowany np
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Podpis...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 kwi 2014, o 13:22 
Offline
Nowy

Dołączył(a): 29 mar 2014
Posty: 11
Pomógł: 0

eMCe2 napisał(a):
A ja nie widzę gdzie bufor Text jest definiowany np
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Buffor jest zdefiniowany, poprostu wrzuciłem najważniejsze fragmenty kodu które dotyczą pomiaru prędkości.

Kuźnia napisał(a):
Witam

Przede wszystkim nie napisałeś jednej ważnej rzeczy. Mianowicie z jakiego napięcia będzie zasilany wentylator PC bo jeżeli z 12V, to należy amplitudę impulsów wyjściowych wentylatora ograniczyć do poziomu akceptowalnego przez mikrokontroler.
Przy wyświetlaniu przydało by się najpierw wykasować starą wartość (albo LCD_CLS() albo nadpisać ją spacjami i z powrotem ustawić lcd_locate() ). Może to powoduje chaotyczne wartości na wyświetlaczu.
Wyświetlając zawartość rejestru ICR1 wyświetlasz przechwyconą wartość licznika, która zawiera ilość zliczonych impulsów zegara wewnętrznego AVR-a z preskalerem do momentu pojawienia się impulsu z wentylatora na pinie ICP1. Nie jest to wartość o jaką Ci chodzi bo nie zliczasz ilości impulsów z wentylatora. Jest to przechwytywanie.
Pomyśl czy nie należałoby w rejestrze TCCR1B ustawić też bitu CS12 co da Ci możliwość "taktowania" rejestru zliczającego sygnałem zewnętrznym "External Clock Source" na końcówce T1 (PB1). To już niestety nie będzie "tryb przechwytywania" i będziesz np. musiał sam zadbać o wyzerowanie rejestru po pomiarze, bramkowanie itp. A przy pomiarze prędkości czas mierzyć drugim timerem.


Wentylator jest zasilany napięciem 12V. Nie znalazłem żadnych wiadomości na temat w jaki sposób czujnik Halla podaje impulsy (RPM). Więc skorzystałem z oscyloskopu. Nie wiem czy pomiar był prawidłowy, ale wyszło że impulsy mają amplitudę 300-400mV. Troszkę się zdziwiłem, no ale tak prawdopodobnie jest. Trzeba będzie zamontować jakis wzmacniacz albo klucz tranzystorowy. Bo rozumiem że ATmega32 wykrywa tylko impulsy o amplitudzie równej napięciu zasilania procka? Odnośnie wyświetlacza mam pomiar temperatury zaprogramowany w podobny sposób bez czyszczenia poprzedniej wyświetlanej wartości i działa, więc chyba nie tutaj jest problem, ale wezmę to pod uwagę.
Odnoście ICP1 tak wiem że jest to wartość licznika, a nie ilość impulsów. I właśnie na podstawie tej wartości chciałbym wyliczyć prędkość. W jakiś sposób zliczać okres tych impulsów, jeszcze nie przemyślałem do końca tej sprawy. Ważne jest to aby wykonać pomiar przy użyciu jednego timera (timer1 16-bitowy) ponieważ dwa pozostałe wykorzystuję w innym celu. Chciałbym się upewnić że wektor przerwania jest prawidłowy i że dobrze rozumiem zasadę działania. Podczas pojawienia się zbocza narastającego (akceptowanego przez procek) do rejestru ICR1 wpisywana jest wartość licznika. Dzieje się to automatycznie nie trzeba ustawiać, bądź sprawdzać flag?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 kwi 2014, o 13:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

cyber90 napisał(a):
Nie wiem czy pomiar był prawidłowy, ale wyszło że impulsy mają amplitudę 300-400mV

robiliśmy na kuźni takie pomiary ale nam wychodzilo inaczej. Dzisiaj tam będę , sprawdzę i odpiszę
cyber90 napisał(a):
W jakiś sposób zliczać okres tych impulsów

okres(T) to 1/f, ( f (taktowania timera1)=f_cpu/prescaler).Znając okres zegara taktującego licznik1 oraz wartość ICR - która jest przechwyconą ilością(wartość rejestru ICR1) tych okresów(taktowania timera1) pomiędzy zboczami (np. narastającymi )ustalisz okres pomiędzy zboczami na czujniku Halla. Nie zapomnij o zerowaniu TCNT1 co przerwanie !



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 kwi 2014, o 17:52 
Offline
Nowy

Dołączył(a): 29 mar 2014
Posty: 11
Pomógł: 0

Pomiary powtórzyłem i okazuje się że takie wartości amplitudy są faktycznie. Mój pomysł to użycie wzmacniacza i tranzystor NPN pracyjący jako klucz przełączający napięcie Vcc mikrokontrolera. Sprawa jest trochę trudna bo czujnik Halla przy maksymalnych obrotach pokazuje jakieś dziwaczne przebiegu, przy 90% - 0 % jest ok ale nie do końca. Jak się uda wrzucę screny z oscyloskopu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2014, o 23:08 
Offline
Nowy

Dołączył(a): 29 mar 2014
Posty: 11
Pomógł: 0

Kuźnia napisał(a):
cyber90 napisał(a):
Nie wiem czy pomiar był prawidłowy, ale wyszło że impulsy mają amplitudę 300-400mV

robiliśmy na kuźni takie pomiary ale nam wychodzilo inaczej. Dzisiaj tam będę , sprawdzę i odpiszę
cyber90 napisał(a):
W jakiś sposób zliczać okres tych impulsów

okres(T) to 1/f, ( f (taktowania timera1)=f_cpu/prescaler).Znając okres zegara taktującego licznik1 oraz wartość ICR - która jest przechwyconą ilością(wartość rejestru ICR1) tych okresów(taktowania timera1) pomiędzy zboczami (np. narastającymi )ustalisz okres pomiędzy zboczami na czujniku Halla. Nie zapomnij o zerowaniu TCNT1 co przerwanie !


Z powodu że amplituda impulsów z czujnika Halla jest bardzo mała i różna dla różnych prędkości postanowiłem wzmocnić sygnał przez wzmacniacz i to napięcie porównywać w komparatorze. I zliczać te porównania czyli ilość impulsów. Mój kod wygląda następująco: Niestety nie działa tak jak powinien.

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


Wyświetlam zmienną stan na wyświetlaczu. Coś nie rozumiem do końca. Jaki umieścić kod w przerwaniu od komparatora aby zliczał ilość impulsów (narazie nie istotne czy zbocze narastające czy opadające). Efekty mojego kodu wyglądały tak: gdy napięcie z potencjometru było większe od referencyjnego (1,2V) to cały czas inkrementował zmienną stan, a chodzi mi aby zwiększył ja jeden raz, wtedy napięcie spada i ponownie rośnie i jest większe od ref i wtedy powinien zwiększyć zmienną stan znowu o jeden. A program działa tak że gdy napięcie jest większe od ref cały czas inkrementuje zmienną stan i dopiero przestaje gdy napięcie jest mniejsze. Macie jakieś pomysły?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 kwi 2014, o 07:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

Teraz mi tak przyszło do głowy - Czy podciągnąłeś do Vcc wyjście impulsów. W wentylatorach to jest wyjście typu OC i po podciągnięciu impulsy mają amplitudę 12V. Nie będzie Ci potrzebny wtedy wzmacniacz tylko konwerter poziomów z 12V na 5V. Na płytce prototypowej używam do tego celu konwertera z RS232 na TTL.
Pozdrawiam



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO