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



Teraz jest 9 mar 2025, o 23:09


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 14 maja 2017, o 10:29 
Offline
Nowy

Dołączył(a): 30 kwi 2017
Posty: 13
Zbananowany użytkownik

Pomógł: 0

Witam.

Jest to mój pierwszy post na tym forum. Na starość (mam 59 lat) coś mnie podkusiło aby spróbować programowania mikrokontrolerów AVR. Elektroniką zajmuję się ponad 30 lat ale w większości analogową. W czasach mojej młodości "królowały" komputery typu Commodore i ZX Spectrum, a technika cyfrowa była mało znana. Zakupiłem niebieską książkę Pana M.Kardasia i na jej podstawie próbuję nauczyć się programowania procesorów AVR w języku C. Tak więc proszę o cierpliwość i wyrozumiałość jeżeli moje pytania będą dla was banalnie proste, a czasami może i głupie. Z językiem angielskim też jest u mnie słabo bo w moich czasach młodości "królował" język rosyjski. Obecnie buduję sobie urządzonko na bazie ATTINY13, który to procesor ma na jednym porcie dawać sygnał PWM - częstotliwość około 300Hz -, a na drugim stały sygnał prostokątny o częstotliwości około 3kHz. Sygnał PWM ma być uruchamiany kiedy na jednym z wejść procesora pojawi się "0", a na jednym z wyjść ma być cały czas sygnał prostokątny około 3kHz z wypełnieniem 50%. Poniższy program, który napisałem z pomocą "niebieskiej książki" powoduje, że na wyjściu PB2 jest sygnał prostokątny około 3 kHz z wypełnieniem 50%, a na wyjściach PB0 i PB1 sygnały PWM różnym wypełnieniem w zależności od stanu wejść na pinach PB3 i PB4. Problem jest w tym, że kiedy nacisnę jeden z przycisków to częstotliwość na PB2 zmienia się na 63 Hz z wypełnieniem około 95% i nie wiem jak to zrobić aby na PB2 częstotliwość się nie zmieniała bez względy na stan wejść PB3 i PB4.

Poniżej przedstawiam listing mojego programu.

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



Ostatnio edytowano 14 maja 2017, o 18:31 przez Mufinek, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2017, o 13:29 
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

topic7402.html

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2017, o 17:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1033
Lokalizacja: Trójmiasto
Pomógł: 190

Na początek wyedytuj swój post i popraw wstawiony kod zgodnie z postem kolegi powyżej, i nie chodzi tu o czepialstwo tylko o to, że kod wklejony zgodnie z takimi wytycznymi jest ładnie formatowany przez co dużo bardziej przejrzysty.

Co do twojego problemu to sygnał 3kHz generujesz w pętli głównej zmieniając stan pinu a pomiędzy zmianami masz opóźnienia zgodne z połową okresu - i tu by było wszystko ok, tylko zauważ że twoje funkcje które sprawdzają stan przycisków zawierają procedury eliminacji drgań styków które również zawierają opóźnienia (i to rzędu ms) które wpływają na wykonywanie pętli głównej, dla tego częstotliwość 3kHz się rozjeżdża!
Dodatkowym problemem jest fakt, iż procesorek attiny13 ma tylko jeden timer sprzętowy, który już wykorzystujesz do generowania sygnału PWM.
Jednakże da się to mimo wszystko zrobić.
Możesz np. uaktywnić przerwanie od przepełnienia licznika (wydaje mi się że pomimo trybu fastPWM takie przerwanie będzie działać - jak jest inaczej niech ktoś mnie poprawi) i w obsłudze tego przerwania obsłużyć timer programowy który to dopiero będzie generował Ci sygnał 3kHz.

Jeśli jednak przerwanie od przepełnienia przy fastPWM nie będzie działać to możesz zrezygnować z trybu fastPWM, ustawić licznik w tryb CTC, ewentualnie w tryb NORMAL dobrać sobie częstotliwoś tego licznika tak by dopasować sobie generator 3kHZ i programowy PWM.
W przerwaniu od licznika (czy to od porównania czy przepełnienia to już zależy od wybranego trybu) generować sygnał 3kHZ (jeśli częstotliwość będzie za duża to poprzez dodatkowy timer programowy) oraz sygnał PWM.
Piszesz że masz niebieską książkę - tam w rozdziale PWM masz również opis programowego rozwiązania takiego generatorka.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2017, o 18:25 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 547
Pomógł: 27

Oprócz tego polecam zajrzeć na blog Mirkahttp://mirekk36.blogspot.com/
i odnaleźć tam artykuł "Drgania styków to bajki?" tam Mirek wyjaśnia kwestię prawidłowej obsługi klawiszy bez funkcji _delay_ms.
poza tym masz jeszcze babola bo ustawiasz dwa razy preskaler w timerze 0 na na 8 i na 1 co w efekcie ustawia ci na 64 no chyba że tak ma być.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2017, o 18:40 
Offline
Nowy

Dołączył(a): 30 kwi 2017
Posty: 13
Zbananowany użytkownik

Pomógł: 0

Już poprawiłem post i mam pytanie do kolegi XENTIS, a mianowicie czy w trybie CTC lub Normal uzyskam osobno generator 3kHz i PWM 300Hz bo w moim urządzeniu są właśnie potrzebne 2 różne częstotliwości. Co do porady kolegi TONYGRYPS to postaram się także zgłębić to zagadnienie z "drganiem styków". Zabieram się już do pracy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2017, o 19:19 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 547
Pomógł: 27

W trybie CTC da się to uzyskać.
Ja bym próbował tak przerwanie co 16us i w tym przerwaniu zmieniał stan pinu (tego od 3kHz) oraz zaimplementował bym w tym przerwaniu timer programowy
w pętli while zrobił bym programowy PWM w W niebieskiej książce jest opisane jak to zrobić i żadnych _delay_ w pętli while.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2017, o 19:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1033
Lokalizacja: Trójmiasto
Pomógł: 190

Mufinek napisał(a):
a mianowicie czy w trybie CTC lub Normal uzyskam osobno generator 3kHz i PWM 300Hz
Co do kwestii PWM to odsyłam do książki Mirka, co do generatora 3kHz to co za problem w przerwaniu oprócz procedur odpowiedzialnych za sterowanie programowym PWM-em dopisać parę linijek kodu do zmiany stanu pinu na którym chcesz uzyskać 3kHz. Jedyne co musisz zrobić to odpowiednio wszystko przeliczyć (prawdopodobnie będziesz musiał utworzyć dodatkową zmienną na potrzeby tego sygnału tak by dopasować sobie tę częstotliwość)
Tak na szybko to jeśli PWM chcesz mieć z częstotliwością 300Hz i z 256bitową rozdzielczością, to przerwanie powinno być wywoływane z częstotliwością 300x256=76800Hz czyli dużo więcej niż twoje 3kHz, więc w przerwaniu musisz inkrementować zmienną i porównywać jej wartość z wyliczoną dla 3kHz stałą czyli w twoim przypadku 76800/3000=~25. Czyli jak zmienna osiągnie wartość 25 zmieniasz stan pinu generującego 3kHz i zerujesz zmienną (liczone tak na szybko i tylko dla pokazania zasady - nie daję głowy czy wyliczenia są w 100% poprawne).
W ten sposób generowany będzie przebieg PWM i sygnał 3kHz - tylko na koniec musisz przeanalizować ile się będzie wykonywać całe przerwanie żeby się zmieścić w taktowaniu procka - ale to już w mirkowej księdze, w rozdziale o PWM jest ładnie wyjaśnione.

Więc odpowiadając na pytanie - TAK bez problemu da się to zrobić w obu trybach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 maja 2017, o 19:33 
Offline
Użytkownik
Avatar użytkownika

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

Witam
Takie coś na szybko, tylko sobie coś z tymi Twoimi przyciskami pokombinuj.
Wypełnienie zmienia się zmieniając PWM_1 i PWM_2:
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: 21 maja 2017, o 16:13 
Offline
Nowy

Dołączył(a): 30 kwi 2017
Posty: 13
Zbananowany użytkownik

Pomógł: 0

Witam.

Dzisiaj miałem trochę czasu i uruchomiłem urządzenie dzięki waszej wydatnej pomocy. Dla uściślenia urządzenie to ma zastąpić rezystor zamontowany w wentylatorze mojego Opla Astry III. Samego rezystora nie można kupić, jedynie razem z wentylatorem, a to koszt około 500 zł. Pomyślałem, że lepiej będzie zrobić urządzenie na tranzystorze MOSFET, który to tranzystor będzie sterowany poprzez PWM i załączany po podaniu impulsu z jednostki centralnej komputera pokładowego. Ponieważ w tym urządzeniu wykorzystuję tranzystor MOSFET z kanałem typu N, a obciążenie - wentylator - jest włączone pomiędzy źródło, a masę pojazdu więc potrzebowałem dodatkowe zasilanie bramki MOSFET-a napięciem wyższym o około 10V niż zasilanie z samochodu (12-14V). Zrobiłem to na "podwajaczu" napięcia i do tego potrzebny mi był sygnał prostokątny ale o wyższej częstotliwości niż kanał PWM. Tak więc teraz pozostaje mi uruchomić urządzenie i przetestować na wentylatorze. Dzisiaj już tego nie będę robił tylko wziąłem się za analizowanie kodu programu bo mam jeszcze problemy z pełnym zrozumieniem. Rozumiem jak uzyskuje się częstotliwość podstawową - nawiązując do kodu kolegi "Kicajek" - dla taktowania Timera0 - wartość zegara 9600000/1/(OCR0A=124)= 77419 Hz -, aby uzyskać na wyjściu PB2 sygnału 3kHz to dzielimy przy pomocy zmiennej "clock" w obsłudze przerwania porównującego Timera0 przez 12 i przez 2. Jednakże nie wiem w jaki sposób na wyjściach PB0 i PB1 uzyskuję sygnał około 300Hz. Jeżeli chodzi o sygnał PWM to także nie do końca "kumam" jak to działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 maja 2017, o 17:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1033
Lokalizacja: Trójmiasto
Pomógł: 190

Mufinek napisał(a):
Jednakże nie wiem w jaki sposób na wyjściach PB0 i PB1 uzyskuję sygnał około 300Hz. Jeżeli chodzi o sygnał PWM to także nie do końca "kumam" jak to działa.

Masz 2 zmienne globalne PWM_1 i PWM_2 - są to zmienne od których zależy wypełnienie PWM odpowiednio PWM_1 dla pinu PB0, PWM_2 dla pinu PB1.
Dodatkowo w obsłudze przerwania masz zmienną pwm_clock która działa jak licznik. Co każde wywołanie przerwania zmienna jest zwiększana o 1 a następnie porównywana z dwiema zmiennymi PWM_1 i PWM_2.
Dla skrócenia wywodu rozpatrzmy tylko jeden kanał PWM:
Jeżeli pwm_clock jest większa lub równa PWM_1 to na pinie PB0 ustawiany jest stan wysoki, jeżeli mniejsza to jest ustawiany stan 0. Czyli jak zmienna PWM_1 będzie równa 0 to będziesz miał pełne wypełnienie dodatnie, jeśli natomiast PWM_1 będzia miało wartość 255 to będzie minimalne wypełnienie.
Licznik pwm_clock w ciągu sekundy przelatuje z przepełnieniem 300 razy , stąd mówimy że PWM pracuje z częstotliwością 300Hz, z kolei same zmienne pwm_clock, PWM_1 i PWM_2 mogą przyjmować wartości od 0 do 255 w systemie binarnym możliwe do zapisania za pomocą 8 bitów, stąd mówimy że PWM ma rozdzielczość 8-bitową co oznacza że możemy ustawić 256 różnych wartości wypełnienia.

kicajek napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Powyższe warunki to taka odmiana if/else - jak warunek w pierwszym nawiasie spełniony wykonywany jest kod zaraz po znaku zapytanie do dwukropka, jeżeli jest niespołniony to wykonuje się kod od dwukropka do średnika.
Analogicznie druga linia jest dla drugiego kanału PWM.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2017, o 14:45 
Offline
Nowy

Dołączył(a): 30 kwi 2017
Posty: 13
Zbananowany użytkownik

Pomógł: 0

Witam.

dziękuję wszystkim za pomoc. Urządzonko jak na razie działa z mniejszym silnikiem bez problemu, a niedługo sprawdzę go w samochodzie. jeżeli kogoś interesuje schemat tego urządzenia to mogę go udostępnić na forum. poniżej kod programu po poprawkach. W razie jakichkolwiek zastrzeżeń co do poprawności programu uwagi jak najbardziej wskazane.

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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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