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



Teraz jest 9 wrz 2025, o 10:46


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 23 sie 2014, o 17:46 
Offline
Nowy

Dołączył(a): 01 mar 2014
Posty: 14
Pomógł: 0

Witam,

Napisałem program, który zmienia częstotliwość mrugania diody w zależności od położenia potencjometru.
Program polega na tym, że dioda nieregularnie gaśnie co jakiś czas(wygląda jakby procek się zacinał).

Wydawało mi się że wiąże się to z priorytetami przerwań ale ADC ma mniejszy priorytet niż TIMER1.



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


Filmik przedstawiający działanie powyższego kodu:
[youtube]rxUeT1Y8rnI&feature=youtu.be[/youtube]
https://www.youtube.com/watch?v=rxUeT1Y ... e=youtu.be

Dodam, że działam na Atmega32 i taktowanie 16MHz.
Proszę o pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2014, o 18:14 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

1. Wynik mnóż x256 wtedy będziesz miał pełny zakres timera
2. Dodaj w pętli if(OCR1A >= 65536) OCR1A = 65535;
3. W pętli wyłącz diodę a w przerwaniu ją włączaj - przez LED_TOG mogą dziać się te cyrki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2014, o 18:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Może powodowane jest to brakiem atomowości dostępu do zmiennej "wynik". Można ten problem obejść za pomocą makra "ATOMIC_BLOCK", albo w poniższy sposób, usuwając całą zawartość pętli głównej "while" i zamieniając ciało funkcji obsługi przerwania na:

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: 23 sie 2014, o 19:55 
Offline
Nowy

Dołączył(a): 01 mar 2014
Posty: 14
Pomógł: 0

Dziękuje za odpowiedź, ale niestety nic się nie poprawiło :(

Czy są jakieś inne sposoby generowania częstotliwości w zależności od pomiaru napięcia?
Docelowo program ma obsługiwać sterownik silnika krokowego.



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

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

W pełni sprzętowo:
http://www.tme.eu/pl/katalog/#id_catego ... th_stock=1
https://www.google.pl/url?sa=t&rct=j&q= ... 2k&cad=rja



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

Dołączył(a): 01 mar 2014
Posty: 14
Pomógł: 0

Taki przetwornik jest to jakaś opcja ale w moim przypadku wprowadza spore ograniczenia.

Może ktoś wie jak to rozwiązać programowo?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2014, o 22:05 
Offline
Użytkownik

Dołączył(a): 22 gru 2013
Posty: 296
Lokalizacja: Szczecin
Pomógł: 47

Rejestr OCR1A jest 16-bitowy.
Wykonując operację:
OCR1A=wynik*100;
przepełniasz ten rejestr dla pewnych wartości zmiennej "wynik" ( możesz to sobie obliczyć).
W ADCW będzie maksymalnie liczba 1023 ( rozdzielczość 10 bitowa ADC)
czyli 1023*100=1 023 000
a rejestr OCR1A mieści tylko liczbę 65 535.
jeżeli chcesz wykorzystać "cały rejestr" to można zmienną "wynik" pomnożyć maksymalnie przez:
np.
maksymalny wynik z ADC rozpisany binarnie:
0000 0011 1111 1111 << 6
co wyniesie:
1111 1111 1100 0000=0xFFC0

Wniosek- wypróbuj operację:
OCR1A=wynik<<6;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2014, o 22:44 
Offline
Użytkownik
Avatar użytkownika

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

Witam
ALEKS napisał(a):
Czy są jakieś inne sposoby generowania częstotliwości w zależności od pomiaru napięcia?

Można np.: porównywać w Timerze programowym ADC do jakiegoś "m"
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

...napisałem tak poglądowo, tak jak ja bym się za to zabierał.

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 sie 2014, o 22:45 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

ALEKS napisał(a):
.....Może ktoś wie jak to rozwiązać programowo?


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


Priorytety przerwań w AVR-ach: umówmy się że ich nie ma ;-). Zresztą, ja w tego typu operacjach zawsze stosuję jakieś uzależnienia czasowe i ciągi zdarzeń typu -> pomiar, interpretacja... coś tam. Tu zastosowałem najprostsze z możliwych rozwiązań: Kolejny pomiar ADC na pewno wykona się szybciej, niż nastąpi następne przerwanie od Compare MatchTimera 1. Z przepełnieniem zakresu już Ci kolega powyżej napisał.

Pozdrawiam serdecznie, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 09:40 
Offline
Nowy

Dołączył(a): 01 mar 2014
Posty: 14
Pomógł: 0

Serdecznie dziękuje wszystkim,

Po wprowadzeniu zmian QuadMan-a i krish-a wszstko płynnie śmiga aczkolwiek przy potencjometrze ustawionym na krańcową wartość, program się zacinał(nie reagował na zmiane polozenia potencjometru).
Teraz wiem jaka jest przyczyna :)

Wystarczy dodać odpowiednio dużą wartość w rejestrze OCR1A w obsłudze przerwania od ADC:

OCR1A = ADCW*9+35;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sie 2014, o 11:12 
Offline
Użytkownik

Dołączył(a): 15 lut 2012
Posty: 224
Lokalizacja: Opole
Pomógł: 24

Mała poprawka do kodu kolegi QuadMan:

// Nie moze byc *100, jesli nie chcesz przekroczyc zakresu uint16_t

Może być *255 (nawet *256 wystarczy dodać if`a aby nie przekroczyć wartości) -zakres uint16_t to 0-65 535

http://pl.wikipedia.org/wiki/Liczba_ca% ... _danych%29



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