Skocz do zawartości

ATmega16 [C] - Problem z PWM


Razonek

Pomocna odpowiedź

Witam!

Mam problem z uzyskaniem PWM'a, na timerze 1, kanale A (OCR1A). Myślę nad tym problemem już 3 dzień i nie mam pomysłu żadnego co jest złe.

zamieszczam tutaj kod

#define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>

int main (void)
{

DDRB = 0x00;
PORTB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFF;
PORTD = 0x00;


TCCR1A |= (1<<COM1A1) | (1<<WGM10);
TCCR1B |= (1<<WGM12) | (1<<CS12);

PORTD |= _BV(PD4) | _BV(PD5);

unsigned char x;

for(;;)
{
if(!(PINB & _BV(PB0)))
{
_delay_ms(20);
while(!(PINB & _BV(PB0))) {}
_delay_ms(20);

PORTC |= _BV(PC6);
PORTD |= _BV(PD0);
PORTD |= _BV(PD2);
for(x = 0; x<200; x++)
{
OCR1A = x;
OCR1B = x;
_delay_ms(150);
}
PORTD &= ~_BV(PD2);
PORTD &= ~_BV(PD0);
PORTC &= ~_BV(PC6);

}
}
}

oraz schemat połączeń:

IMG_4f0964bd64bf55420.png

Przy ustaleniu stanu wysokiego na pinie kanału A, jest tylko napięcie zasilania, nic się nie zmienia. Na pinie kanału B - wszystko jest tak jak powinno, płynnie się zmienia napięcie. Dodam również że podmieniałem uC i dalej to samo.

Z góry dziękuje oraz pozdrawiam

Razonek

Link do komentarza
Share on other sites

1. Włączyłeś PWM tylko na pinie A (1<

2. Podciągnij RESET rezystorem 4k7-10k do Vcc

3. załączaj schematy w większej rozdzielczości i op[isuj wartości elementów. jakość schematu pozostawia wiele do życzenia 🙂

4. stosuj wcięcia w kodzie, by analiza była łatwiejsza.

Link do komentarza
Share on other sites

Zakładam, że to jest tylko program testowy, bo w docelowym załączysz jednak PWM również na OC1B 🙂

Procedura _delay_ms() wygeneruje tylko co najwyżej 16ms opóźnienia dla zegara 16MHz. Jeżeli chcesz mieć 20ms (a tym bardziej 150), musisz to sobie sam napisać. Z takim argumentem działanie tej funkcji jest niezdefiniowane.

Czy celowo używasz instrukcji sumowania logicznego "|=" zamiast podstawienia "=" podczas programowania zawartości rejestrów TCCR1A/B ? Po resecie są tam zera i Twój kod jest OK ale nie zawsze tak będzie i kiedyś możesz się naciąć.

Wpisywanie jedynek na wyjścia portu PD4 i PD5 jest bezcelowe gdy sterowanie nimi przejął już generator PWM. Chyba, że to tylko taki test.

Do schematu można się oczywiście czepiać ale jak rozumiem miało to przekazać główną ideę - sterowanie mostków wprost z wyjść OC1A/B. Do tego wartości pozostałych elementów nie są potrzebne. Swoją drogą podświetlanie LEDowe wyświetlacza raczej nie wytrzyma takiego podłączenia wprost do +5V, zasilania samego LCD są podłączone odwrotnie(!) a VO to raczej rezystor do masy a najlepiej dzielnik bo sama matryca LCD zasilana jest napięciem powstałym między VO a VDD. Przydałoby się też więcej linii danych ale może czegoś nie wiem..

W sumie samo PWM powinno działać 😐 Dlaczego ma być takie wolne?

  • Lubię! 1
Link do komentarza
Share on other sites

No właśnie kanał A nie działa, kanał B robi to co chcę. Za schemat przepraszam, niepotrzebnie go zmniejszałem. Jutro wrzucę w lepszej jakości bo teraz pisze z telefonu. Co do podciągania resetu - wiem że dużo osób tego nie robi i ja również, nigdy mi się uC nie resetował z tego powodu. Co do schematu to miałbym prośbę - czy sterowniki silników są dobrze zmostkowane?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Kolega marek1707 chyba wybiórczo czytał dokumentację.

The maximal possible delay is 262.14 ms / F_CPU in MHz.

When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency). The user will not be informed about decreased resolution.

If the avr-gcc toolchain has __builtin_avr_delay_cycles(unsigned long) support, maximal possible delay is 4294967.295 ms/ F_CPU in MHz. For values greater than the maximal possible delay, overflows results in no delay i.e., 0ms.

Jak widać max czas ok. 16 ms jest liczony tylko dla maksymalnej rozdzielczości. Można odmierzać dłuższe czasy, jednak traci się na dokładności. Ale jak można się domyśleć, w wymienionym wyżej przykładzie, nie ma ona większego znaczenia.

Dlatego też apeluje o nie zamieszczanie nie pewnych i nie sprawdzonych informacji, jednocześnie nie zaznaczając swoich wątpliwości.

Nie mogę również zgodzić się z zarzutami dotyczącymi wyświetlacza. Jeżeli chodzi o podświetlenie, to czasami stosowane jest więcej niż jedna dioda połączone szeregowo, co eliminuje konieczność obniżania napięcia zasilania. Natomiast z moich testów wynika, że zawsze najwyższy kontrast uzyskuje się podciągając ten pin do masy. Na pewno wiele zależy od modelu wyświetlacza i odpowiednie rozwiązanie warto dobrać przed projektowaniem płytki.

Link do komentarza
Share on other sites

Nie potrafię edytować posta.

Kurcze z tych nerwów nie sprawdziłem czegoś. Jutro to sprawdzę, dziś już mi się nie chce. Jak zadziała to wystawie pomagajki za uświadomienie mi tego co do mnie nie docierało. Ten wyświetlacz to takie sprawdzenie czy posiadam bibliotekę wyświetlacza, i jak to wygląda na brd. Mam jeszcze prośbę odnośnie schematu - sterowniki silników są dobrze zmostkowane? Co do ustawiania wyjść pwm (PORTD |=...) to to było tylko do sprawdzenia... Jeszcze raz dziękuje, chyba namieszałem, jutro się okaże

Link do komentarza
Share on other sites

Procedura _delay_ms() wygeneruje tylko co najwyżej 16ms opóźnienia dla zegara 16MHz. Jeżeli chcesz mieć 20ms (a tym bardziej 150), musisz to sobie sam napisać. Z takim argumentem działanie tej funkcji jest niezdefiniowane.

To nie jest prawdą, a kol. Kling już wyjaśnił dlaczego.

Co do podciągania resetu - wiem że dużo osób tego nie robi i ja również, nigdy mi się uC nie resetował z tego powodu.

W ATmega16 Reset ma pull-up pomiędzy 30k, a 60k.

W niesprzyjających warunkach pracy z silnikami, może to być za duża rezystancja, by zapewnić, że zakłócenia nie spowodują resetu uC. Dlatego warto dodać rezystor około 5k, by znacznie zmniejszyć to ryzyko. Warto to robić także dlatego, że w innym mikrokontrolerze (który może kiedyś wykorzystasz) taki pull-up może nie być włączony na stałe (np. ATmega8), przez co będziesz rwał włosy z głowy czemu nie działa prawidłowo. A tak przyzwyczajenie jest i zapewni Ci spokój.

By pewność powiększyć jeszcze bardziej, warto dodać kondensator z RESET do masy np. 100nF.

  • Lubię! 1
Link do komentarza
Share on other sites

No nie wiem, oparłem się na dokumentacji biblioteki AVR Libc której używam. Tam całość opisu tej funkcji wygląda tak:

6.22.2.3 void _delay_ms (double __ms)

Perform a delay of __ms milliseconds, using _delay_loop_2().
The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz).
The maximal possible delay is 262.14 ms / F_CPU in MHz.

Koniec, kropka. Żadnych dywagacji o dłuższych czasach. Jeżeli w nowszych wersjach to poprawiono, to bardzo fajnie. W każdym razie nie wiemy czego używa Autor.

BTW: Pierwszy raz użyłem przycisku "code" - działa 😃

Kling, z którymi uwagami dotyczącymi LCD nie możesz się zgodzić? Z tym, że zasilanie jest podłączone odwrotnie (bo jest)? Czy może z tym, że opornik na wejściu VO powinien być raczej do masy (bo powinien)? A może z tym, że warto tam wstawić dzielnik (a warto, bo niewiele kosztuje a można regulować kontrast)? Tu nie są potrzebne żadne "testy". Analogowe drivery matrycy LCD rozpięte są między VDD a VO, a optymalnym zakresem pracy jest zwykle ok. -4.5 .. -4.8V (podane w dokumentacji) czyli +0.5V licząc od masy dla Vdd=5V. Czy może wreszcie nie możesz zgodzić się z tym, że podświetlanie takiego LCD raczej nie wytrzyma podłączenia wprost do zasilania 5V? Oczywiście jest tam w środku kilka równoległych łańcuchów szeregowo połączonych trzech struktur LED i to w rezultacie ma napięcie przewodzenia w okolicach 4.5V ale te brakujące pół wolta robi pewnie kilkaset mA przyrostu prądu. Wystarczy spojrzeć na ch-kę I=f(Uf)diody LED. Nigdzie nie widziałem, by którykolwiek z producentów zezwalał na podłączanie podświetlania wprost do +5V. Wręcz przeciwnie, podkreślane jest, by włączać w szereg rezystor ograniczający/ustalający prąd do wartości zalecanej dla danego podświetlacza. Wyjątkiem jest sterowanie ze źródła prądowego ale to chyba nie ten przypadek. Więc o co chodzi?

Kondensator na linii RESET popieram 🙂

Link do komentarza
Share on other sites

Co do podświetlania to dotychczas nie spotkałem się z wyświetlaczem nie mającym opornika połączonego w szereg z podświetlaniem. Właśnie sprawdzałem i w 2 egzemplarzach jest to 110 om, a w jednym są to dwa oporniki 200 om połączone równolegle, przez co ja też nie stosuję oporników do podświetlania.

Link do komentarza
Share on other sites

Kolega Harnas swoim postem poparł to, co ja osiągnąłem testami. Również nigdy nie dodaje dodatkowego rezystora do podświetlenia.

Faktu, że napięcie były podłączone odwrotnie, nie negowałem - nie analizowałem schematu autora postu.

Jeżeli o kontrast, to masz racje - dzielnik daje płynna regulację kontrastu. Ale jeżeli sprawdzi się 'w powietrzu', że kontrast bez regulacji (czyli maxymalny) nam odpowiada to po co go regulować? Oszczędzamy w ten sposób miejsce na płytce.

Link do komentarza
Share on other sites

Dziękuje bardzo za pomoc. Uświadomienie mi tego, że trzeba włączyć oba kanały.

Taki zabieg pomógł

TCCR1A |= (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10);
TCCR1B |= (1<<WGM12) | (1<<CS12);

Co do wyświetlacza: To macie 100% racji, jest źle podłączony, ale zamiast wyświetlacza mam tam diody. Przy okazji zmajstruje pcb tak żeby było OK! Na schemacie niema kilku rzeczy które są na płytce. To był mój pierwszy schemat w eaglu, wcześniej dawałem tylko i wyłącznie elementy i łączyłem je ręcznie. Kontrast maksymalny najbardziej mi odpowiada.

Co do edycji postu to wiem jak to się robi, ale byłem na telefonie i po prostu nie potrafiłem.

Jeszcze raz prosiłbym o sprawdzenie tego czy mostki H są dobrze podłączone. 1 mostek na 1 silnik.

Dziękuje za takie zainteresowaniem tematem i takie szybkie odpowiedzi.

Link do komentarza
Share on other sites

No to już prawie OT, ale zaintrygowany Waszymi informacjami o rezystorach na podświetlaniu przejrzałem moją szufladę. Wśród kilkunastu różnych wyświetlaczy, znakowych i graficznych ponad połowa ma podświetlanie i żaden nie ma opornika szeregowego. Wszystkie za to mają podświetlacz w postaci modułu jakby wsuwanego z boku pod szybę z LCD. Wyprowadzenia A i K takiego oświetlacza są dostępne z boku i niepodłączone do złącza z resztą sygnałów. Czy w tych z opornikiem podświetlanie jest jakoś zintegrowane z płytką LCD i dostępne na złączu 16-pinowym? Fakt, używałem takich dawno temu ale na rezystor szeregowy nie zwróciłem uwagi. Ech, będę musiał przyjrzeć się temu przy kolejnych projektach - na naukę nigdy nie jest za późno 🙂 Chociaż w sumie dodanie rezystora na schemacie niczym nie grozi - najwyżej wlutuje się zworkę, gdy okaże się zbędny.

Mostki są OK, choć.. ja bym tak silników podłączył. Podejrzewam, że L293 jest tak starym i znanym układem, że nawet tu na Forum toczyły się już dyskusje o jego możliwych aplikacjach. Jak widzę Ty sterujesz obiema gałęziami na raz, jednocześnie załączając albo wyłączając przebiegiem PWM odpowiednio skonfigurowane (statycznie) gałęzie. To powoduje, że o ile prąd silnika w fazie "gorącej" płynie przez tranzystory (dobrze), o tyle w fazie "zimnej" płynie wyłącznie przez diody (źle) powodując nagrzewanie się układu. Ja bym jedną gałąź sterował przebiegiem PWM a drugą statycznym sygnałem kierunku. Mniej sygnałów, prostsze sterowanie no i większa sprawność. W nocie katalogowej jest wyraźnie zaznaczone, że diody te są przeznaczone do tłumienia przepięć na obciążeniach indukcyjnych a nie do stałego przewodzenia prądu obciążenia. Brakuje także ich dokładnej specyfikacji. Z resztą cały mostek jest dość archaiczną konstrukcją, mam nadzieję, że przynajmniej jest tani.. Dwutranzystorowe, bipolarne stopnie końcowe serwują nam napięcia nasycenia dużo powyżej 1V co przy nietrywialnym silniku spowoduje kilkuwatowe straty. Jeśli to coś ma jeździć i prądy będą podchodzić pod 1A, to pomyśl o porządnym radiatorze. Przy całkiem dużym (30cm2), zrobionym z pól miedzi układ może "pochłonąć" tylko 2W. To już lepiej, żeby przylutowany kawałek blachy wystawał gdzieś do góry.

Mimo wiszenia w trzecim stanie portów procesora, wejścia mostków (PD0..3) nie muszą mieć rezystorów a już na pewno nie do masy. Ze schematu wewnętrznego wynika (wersja f-my Texas Instr.) że tranzystory wejściowe mają w emiterach źródła prądowe wymuszające "widzenie" przez układ stanu wysokiego na niepodłączonym wejściu. Rezystory do masy byłyby niepotrzebną walką z tym stanem rzeczy.

Dlaczego stabilizator zasilający procesor jest w wersji 6V?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.