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



Teraz jest 19 mar 2026, o 00:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
 Tytuł: Atmega88P i PWM
PostNapisane: 29 cze 2017, o 20:39 
Offline
Nowy

Dołączył(a): 06 kwi 2017
Posty: 13
Pomógł: 0

Witam
Mam pytanie odnośnie Fast PWM i Phase correct PWM. Ogólnie to zaczęło się od tego kiedy przepisałem sobie z BlueBook'a w ramach "nauki" kod do Fast PWM sprzętowego. Wszystko by było fajnie gdyby nie fakt, że dioda zamiast gasnąć do zera, lekko świeci cały czas. Przeszukałem neta i dowiedziałem się, że to efekt "piku", który jest na początku. Rozwiązaniem było włączenie Phase correct PWM zamiast Fast PWM, ewentualnie odwrócenie fazy, tak, że na początku dioda będzie świecić na MAX i ta szpila nie będzie widoczna. Ja stwierdziłem, że pójdę w stronę Phase correct PWM, aby może kolejne możliwości timer'ów poznać trochę poza BlueBook'iem. Problem w tym, że nie wiem czy źle ustawiam bity czy program się nie podgrywa poprawnie. Poniżej kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nie wiem czy źle ustawiam bity odnośnie trybu pracy, ale jak nie tak to jak ?
Do ustawień kierowałem się tą tabelą.

Obrazek

Dodatkowo skoro już piszę to może mi ktoś powie, czy to normalne, że niekiedy muszę wgrywać program 3 razy, aby mikrokontroler "pobrał". Dlatego np taka dodatkowa dioda w kodzie, aby prostą zmianą widzieć fizycznie. Ewentualnie co może być powodem, że program się nie ładuje poprawnie.



Ostatnio edytowano 29 cze 2017, o 20:59 przez dbaran, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 cze 2017, o 20:40 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3230
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

topic7402.html

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2017, o 06:21 
Offline
Użytkownik
Avatar użytkownika

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

Kod który wrzuciłeś działa bez żadnych modyfikacji (co prawda testowałem na atmedze328p ale ten procek jest z tej samej rodziny co 88 więc jest w pełni zgodny), więc problemów musisz szukać raczej w połączeniach
Co do twoich problemów z wgrywaniem wsadu to nie jest to normalne że trzeba kilka razy próbować wgrywać. Na Atnelowskim programatorze (a w stopce widzę że taki masz) wszystko śmiga zawsze bez zająknięcia (sam posiadam 2 takie programatory jeden starszy drugi najnowszy i na obu wsad wchodzi bez błędu za każdym razem - nigdy nie miałem z nimi żadnego problemu).
Jak masz to wszystko połączone? Na stykówce czy polutowane? Bo objawy jakie opisujesz wskazywały by na duże problemy z pewnością połączeń...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2017, o 21:02 
Offline
Nowy

Dołączył(a): 06 kwi 2017
Posty: 13
Pomógł: 0

Ok, tylko jaki masz efekt ?
Zaczyna się od świecenia diody, przygada, ale nie gaśnie i znów się rozjaśnia. Jeżeli tak to w tym momencie nie wiem czy jest to Fast PWM czy już Phase correct PWM. Dlaczego, bo ponoć Phase correct PWM miał wyeliminować "żarzenie się diody", tak przynajmniej wyczytałem na necie. Chciałem, aby dioda całkiem gasła, a tak nie jest.
W przypadku ustawienia
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dioda zaczyna od pełnego światła, a na końcu się "żarzy" zamiast zgasnąć.

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

Widzę "pik" diody, zaczyna zwiększać jasność światła do pełna i maleje do zera. Tutaj było by ok, gdyby nie ten pik, zakładam że to przy starcie mikrokontrolera, jeszcze wyjścia nie zdążą się ustawić i dlatego jest taki efekt tylko przy "wgrywaniu wsadu". Chyba, że się mylę, ewentualnie można zniwelować ten efekt w jakiś sposób to chętnie poczytam jak. Nie zmienia to faktu, że przy wcześniejszym przypadku również nie miało być żarzenia, a jest.

Co do programowania i problemów z "ładowaniem wsadu", to wcześniej było to wszystko na płytce stykowej. Obecnie w ramach "ćwiczeń" z elektorniki i tworzeniu płytek PCB zrobiłem sobie własną prostą płytkę. Ma ona na pewno problemy z "zasilaniem" niekiedy ( muszę wtyczkę docisnąć ) więc myślę czy nie zrobić jeszcze raz nowej, ale tym razem dodatkowo rezystory SMD zamiast przewlekanych. W jednym i drugim przypadku ( stykówka i własny zestaw ) zauważyłem, że nie zawsze wgrywał się wsad. Nigdy nie byłem pewny czy wszystko dobrze skompilowałem i wgrałem, ponieważ jako początkujący różne błędy popełniam. Dlatego często sobie pomagam migającą diodą, gdzie zmieniam częstotliwość migania poprzez zmianę. Często po "połączeniu" się z mikrokontrolerem za pomocą MKAVRCalculator, wyłączam go, pytanie czy musi być cały czas załączony i to może powodować problemy. Choć nie zauważyłem zależności, ale kto wie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2017, o 22:07 
Offline
Użytkownik
Avatar użytkownika

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

OK znalazłem babola, wcześniej podłączyłem diody anodą do procka a katodą do masy i było OK, ale po Twojej odpowiedzi teraz jak odwróciłem diody to faktycznie dioda sterowana PWM-em nie gasła do końca.
A problem był w pierwszej pętli for gdzie warunek miałeś i<255, czyli ostatnia wartość i dla której warunek spełniony to i=254, czyli brakowało jedynki do zapełnienia licznika. Wystarczy ów warunek zmienić na i<=255, lub i<256 i dioda gaśnie w obu konfiguracjach ;)


dbaran napisał(a):
Często po "połączeniu" się z mikrokontrolerem za pomocą MKAVRCalculator, wyłączam go, pytanie czy musi być cały czas załączony i to może powodować problemy. Choć nie zauważyłem zależności, ale kto wie.

Ale MkAvrCalculator jest tylko nakładką graficzną na Avrdude i w momencie kliknięcia "Sprawdź podłączony AVR" lub przycisku "wykonaj" wysyła on linię komend (zresztą widoczną na dole obok przycisku wykonaj) do avrduda, ten robi swoje i na tym się kończy, avrdude zwraca tylko do MkAvrCalculatora dane jakie uzyskał od procka (jeśli jakiś oczekiwano) i w tym momencie procek jest już odłączony i robi swoje (czyli linia reset jest z powrotem podciągana do VCC i procesor rozpoczyna pracę jak po zwykłym resecie). A uruchomiony Calculator nie "trzyma" aktywnego połączenia - zresztą tak jak pisałem on nawet bezpośrednio z prockiem nie gada więc to czy jest on odpalony czy też nie nie ma najmniejszego znaczenia podczas wgrywania wsadu z środowiska. Jedyne co to czasem po jakimś błędzie MkAvrCalculator wywala komunikat o wymaganym resecie z przyciskiem OK to zdarza się że jego reset nie pomaga co wynika bezpośrednio z tego że sam avrdude zawisł w systemie wtedy trzeba mu uprzejmie wydać komendę z menadżera zadań "zamknij".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2017, o 22:59 
Offline
Nowy

Dołączył(a): 06 kwi 2017
Posty: 13
Pomógł: 0

Dzięki za pomoc.

Mam jeszcze dwa pytania dodatkowe ;)
1. Jeżeli chciałbym użyć "trybu 5" z tabeli umieszczonej w pierwszym poście, gdzie WGM00 i WGM02 mają stan wysoki ( również jest tryb Phase correct PWM ) domyślam się, że wtedy "liczenie" odbywało by się do poziomu przeze mnie ustalonego ? Jeżeli tak to jak ustawić ten poziom ? Zmiennej OCRA nie ma w mikrokontrolerze, pytanie czy muszę taką stworzyć/zadeklarować ? Ewentualnie coś źle rozumuje.

2. Kiedy dioda ma się "zaświecać" w pierwszej pętli ( a właściwie przed nią ) występuje błysk diody. Czy jest sposób, aby to zniwelować ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2017, o 12:26 
Offline
Użytkownik
Avatar użytkownika

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

Jeszcze zauważyłem że analogiczny babol masz w drugiej pętli który powoduje że do rejestru nie trafia na koniec "0", nie widać tego bo po drugiej pętli masz wstawione OCR0A=0. I tu żeby to poprawić trzeba trochę pokombinować, albo zwiększając do 256 liczbę od której startuje "i" ale wtedy do rejestru trzeba załadować wynik wyrażenia (i-1) lub też ze zmiennej i zrobić int16_t a warunek wykonania pętli "i>=0".

dbaran napisał(a):
1. Jeżeli chciałbym użyć "trybu 5" z tabeli umieszczonej w pierwszym poście, gdzie WGM00 i WGM02 mają stan wysoki ( również jest tryb Phase correct PWM ) domyślam się, że wtedy "liczenie" odbywało by się do poziomu przeze mnie ustalonego ? Jeżeli tak to jak ustawić ten poziom ? Zmiennej OCRA nie ma w mikrokontrolerze, pytanie czy muszę taką stworzyć/zadeklarować ? Ewentualnie coś źle rozumuje.

Widzisz ten timer ma dwa rejestry porównania OCR0A i OCR0B, i na jego bazie możesz zrobić teoretycznie 2 -kanałowy PWM czyli na pinie OC0A (czyli PD6) procka jeden PWM którego wypełnienie regulujesz zapisując do rejestru OCR0A, natomiast drugi kanał na pinie OC0B (czyli pin PD5) procka, i jego wypełnienie ustalasz w rejestrze OCR0B - nie ważne czy to będzie Fast-PWM czy Phase Correct w trybie 1.
Dla czego napisałem wyżej teoretycznie, i tylko dla Phase Correct w trybie 1?
Otóż jak się przyjrzysz tabeli którą wcześniej przetoczyłeś to w trybie 1 licznik zlicza do TOP=0xFF czyli do pełna; natomiast dla trybu 5 licznik zlicza do TOP=OCR0A. W tym trybie Rejestr porównania A wyznacza niejako rozdzielczość PWM kanału B. Czyli jeśli ustawimy OCR0A np na 100, to w kanale PWM B można będzie regulować wypełnienie w zakresie od 0 - 100 ładując wartość do rejestru OCR0B, natomiast przekroczenie wartości 100 będzie równoznaczne z ustawieniem 0. (oczywiście analogicznie jak ustawimy OCR0A na 250, to wartości OCR0B będą w zakresie 0 - 250).
Oczywiście zmieniając wartość OCR0A zmieniamy rozdzielczość, ale co za tym idzie również częstotliwość generowania przebiegu, bo należy pamiętać że to nadal licznik który działa jak w trybie CTC z rejestrem porównania OCR0A. Reasumując w trybie PWM Phase Correct 5 tracimy niejako jeden kanał PWM na pinie OC0A/PD6.
Mam nadzieję że powyższe wywody będą zrozumiałe jak by co to pytaj.

dbaran napisał(a):
2. Kiedy dioda ma się "zaświecać" w pierwszej pętli ( a właściwie przed nią ) występuje błysk diody. Czy jest sposób, aby to zniwelować ?
Efekt ten wynika z tego jak masz podpiętą diodę (a zdaje się że masz anodą do plusa, katodą do portu) tak więc gdy na początku main pin diody ustawiasz jako wyjście to jako że wartości w rejestrach po starcie procka są zerowe, to pin po ustawieniu się jako wyjście ustawia na nim stan niski który powoduje zaświecenie diody do czasu zainicjalizowania timera. Wystarczy zaraz po ustawieniu pinu jako wyjście ustawić na nim stan na 1 czyli PORTD |= (1<<PD6), możesz nawet przed ustawieniem pinu jako wyjście ustawić w port na 1 (bo ustawiając go po to dla oka może jest to niezauważalne ale w rzeczywistości na pinie na ułamek sekundy pojawi się zero)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2017, o 22:43 
Offline
Nowy

Dołączył(a): 06 kwi 2017
Posty: 13
Pomógł: 0

Dzięki za wyjaśnienia.
Co do "pika" po wgraniu programu i błyśnięciu diody to próbowałem już wcześniej to co pisałeś, ale nie zdało egzaminu. Może się wydawać, że to błahostka, ale w przypadku jakichś elementów wykonawczych taki pik może nie być pożądany ( nawet przy jednym cyklu ).
Można podłączyć inaczej diodę, ale myślałem, że programowo by było bardziej uniwersalnie.
Zakładam, że jest to "wada sprzętowego PWM", bo druga dioda "pomocniczą" nie mruga, a jest tak samo podłączona.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2017, o 22:50 
Offline
Użytkownik
Avatar użytkownika

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

witam, jeżeli dioda nadal pika przed startem programu to po ustawieniu stanu na pinie daj prostego _delay_ms(); zanim program ruszy dalej.
nie pamiętam ile czasu potrzeba na ustrawienie się portów. :( gdzieś w ds powinno bć.

------------------------ [ Dodano po: 9 minutach ]

ewentualnie podciągnąć delikatnie wyjście rezystorem do vcc. ? stan niski będzie wymuszany ustawieniem
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wynikającym z pwm'a .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2017, o 23:08 
Offline
Nowy

Dołączył(a): 06 kwi 2017
Posty: 13
Pomógł: 0

Daro69 napisał(a):
witam, jeżeli dioda nadal pika przed startem programu to po ustawieniu stanu na pinie daj prostego _delay_ms(); zanim program ruszy dalej.
nie pamiętam ile czasu potrzeba na ustrawienie się portów. :( gdzieś w ds powinno bć.

------------------------ [ Dodano po: 9 minutach ]

ewentualnie podciągnąć delikatnie wyjście rezystorem do vcc. ? stan niski będzie wymuszany ustawieniem
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wynikającym z pwm'a .


Jeżeli miało być to w ten 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.


to nie działa. Rezystor to już ingerencja w układ, a nie zawsze takie coś można zrobić. Na chwilę obecną jest to tylko do "nauki" więc duży problem to nie jest, ale będę musiał o tym pamiętać na przyszłość ( chyba sam w to nie wierze, że będę pamiętał ;) )

Stan niski spowoduje jej zaświecenie. Ustawiłem nawet 5 sekund i dalej jest efekt, że dioda 5 sekund nie świeci, a po 5 sekundach błyska, rozjaśnia się i gaśnie. W następnym cyklu już się normalnie rozjaśnia bez błysku.

Dochodzę do wniosku, że to jest podczas wgrywania ustawień dla PWM. Po zmianie kodu na taką kolejność

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


Efekt jest następujący przy starcie: błysk, odczekanie 5 sekund i płynne rozjaśnianie się. Wcześniej było odczekanie 5 sekund błysk i rozjaśnianie.



Ostatnio edytowano 1 lip 2017, o 23:45 przez dbaran, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lip 2017, o 23:42 
Offline
Użytkownik
Avatar użytkownika

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

miałem podobny efekt, sprzętowy pwm -
załatwiłem te piki przełączając DDR na wejście jeżeli (OCR..==0),
w pozostałych wartościach jako wyjście.(wyjscie jeżeli (OCRx))
gasła dioda do końca.
startując z pwm od OCR'a=0. noga jako wejście. a potem dopiero się przełącza jako wyjście. i tak cały czas w pwm'ie.
udało mi się to znaleźć. :)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 13 minutach ]

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

A DDR...na pinie OC... na początku pozostaw jako wejście.
powinno pomóc .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2017, o 00:21 
Offline
Nowy

Dołączył(a): 06 kwi 2017
Posty: 13
Pomógł: 0

Znalazłem inne rozwiązanie.
Tak jak mówiłem był problem przy inicjalizacji PWM.

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


Czyli "odczekanie" po ustawieniach do PWM i chodzi bez "pików". Sprawdziłem i 9ms to minimalny czas jaki można ustawić, aby nie było "piku".



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lip 2017, o 11:26 
Offline
Użytkownik
Avatar użytkownika

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

dbaran napisał(a):
Tak jak mówiłem był problem przy inicjalizacji PWM.

A tak konkretniej owy impuls generuje samo przełączenie pinu:

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

co ciekawe przy odwróconym stanie pinu czyli

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

żadne zakłócenia nie powstają...

Analizator stanów logicznych wykazał że szpilka zakłócająca która powstaje ma przy FCPU=8MHz około 8,178ms, tak więc dla ścisłości i oszczędności ustawienie pinu jako wyjście można zrobić:
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: 2 lip 2017, o 18:31 
Offline
Nowy

Dołączył(a): 06 kwi 2017
Posty: 13
Pomógł: 0

Z drugiej strony tryb5 już "odczekania" nie potrzebuje, jedyne to trzeba ustawić wartość "OCR0A" przed ustawieniem portu na wyjście.

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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO