Skocz do zawartości

[C] Atmega128 Sterowanie regulatorem EDF


Treker

Pomocna odpowiedź

Witajcie, postanowiłem nową konstrukcję zaprogramować w C jednak nie mogę znaleźć rozwiązania jednego problemu. Regulator EDF potrzebuje 50Hz + regulację wypełnieniem, o ile dla 8MHz poniższy kod działa świetnie:

DDRE |= (1<<PE3);//EDF jako wyjście

TCCR3B |= (1 << CS31);//Preskaler 8
TCCR3A |= (1 << COM3A1) | (1 << COM3B1);//  Fast PWM
TCCR3A |= (1 << WGM31);//Fast PWM, ICR3 jako góra
TCCR3B |= (1 << WGM33) | (1 << WGM32);//Fast PWM, ICR3 jako góra
ICR3 = 20000;//50Hz
OCR3A = 1100;//Wypełnienie

Po zmianie kwarcu i przeliczeniu wartości:

DDRE |= (1<<PE3);//EDF jako wyjście

TCCR3B |= (1 << CS31) | (1 << CS30);//Preskaler 64
TCCR3A |= (1 << COM3A1) | (1 << COM3B1);//  Fast PWM
TCCR3A |= (1 << WGM31);//Fast PWM, ICR3 jako góra
TCCR3B |= (1 << WGM33) | (1 << WGM32);//Fast PWM, ICR3 jako góra
ICR3 = 5000;//50Hz
OCR3A = 1100;//Wypełnienie

Niestety w tym momencie już nie działa. Nie wiem czy źle coś przeliczam, jednak pewnie jest to bardziej problem z pierwszymi krokami jakie stawiam w C 🙂

Link do komentarza
Share on other sites

Jaki jest objaw "nie działania"?

Czy wcześniej w programie używasz timer3 na innych ustawieniach, czy to pierwsze ustawienia po resecie?

Generalnie wygląda, że dobrze ustawiasz - drobne uwagi:

Sygnał wyjściowy włączasz na pinie OC3A ustawiając go jako wyjście i wybierając tryb Clear OC3A on compare match, set OC3A at BOTTOM, (non-inverting mode)

ale za pomocą:

TCCR3A |= ....  (1 << COM3B1);

włączasz także Clear OC3B on compare match, set OC3B at BOTTOM, (non-inverting mode) , ale nie włączasz tego pinu jako wyjście (DDRE). Czy tak chciałeś zrobić?

Dodatkowo komentarz sugeruje zupełnie coś innego niż faktycznie te bity ustawiają:

TCCR3A |= (1 << COM3A1) | (1 << COM3B1);//  Fast PWM 

Te bity nie ustawiają trybu FAST PWM, ale to mało istotne.

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

włączasz także Clear OC3B on compare match, set OC3B at BOTTOM, (non-inverting mode) , ale nie włączasz tego pinu jako wyjście (DDRE). Czy tak chciałeś zrobić?

Drugiego wyjścia nie używa, zostało to z poprzedniego kodu.

To są pierwsze ustawienia tego Timera. Ciężko mi określić "co" nie działa bez oscyloskopu później spróbuje coś miernikiem jeszcze posprawdzać jednak byłem (w sumie nadal jestem) przekonany, że to jednak coś w ustawieniach, bo skąd ta poprawna praca przy 8Mhz.

Możliwe, że całkiem coś tutaj poplątałem, a działanie przy 8Mhz jest przypadkiem.

Link do komentarza
Share on other sites

No to poczekamy na oscyloskop.

O ustawienia poprzednie pytałem, ze względu na sposób, w którym ustawiasz bity w C, gdyż czasami zapomina się o tym, iż w danym rejestrze już jakieś bity ustawiałeś. No ale skoro to po resecie to nie ma problemu, bo bity w tych rejestrach są zerowane.

Patrząc w datasheet i Twój kod - wygląda OK.

Jeszcze pytanie tak na wszelki wypadek: W opcjach projektu masz wybraną ATmega128?

Link do komentarza
Share on other sites

Tak, jest M128 ustawiona.

Co do pomiarów to mogę jedynie miernikiem coś pomierzyć bez oscyloskopu.

A może ja coś źle sobie "wymyśliłem" jak to generować, może powinienem inne tryby Timerów używać? Potrzebuję do tego regulatora sygnał 50Hz, a prędkością silnika mam regulować wypełnieniem (analogicznie jak sterowanie serwami).

Link do komentarza
Share on other sites

Tryb Fast PWM jest jednym z trybów, który możesz spokojnie wykorzystać do tego celu.

Oscyloskop masz czy nie?

A może port LPT do analizatora?

Niestety nie mam takiej ATmegi żeby zrobić test.

Link do komentarza
Share on other sites

Oscyloskop masz czy nie?

A może port LPT do analizatora?

2xNie.

Jedyne co mogę to częstotliwość miernikiem sprawdzić, ale to później. Dam znać co udało mi się sprawdzić.

Tak dla formalności, JTAG wyłączony, tryb zgodności też wyłączony.

Link do komentarza
Share on other sites

//Ustawienie wyjsc
DDRB |= (1<<PB6) | (1<<PB5);
DDRE |= (1<<PE4) | (1<<PE3);
/**
 * Konfiguracja timerow 1 i 3:
 *   prescaler = 8
 *   tryb = Phase and Frequency Correct mode
 *   ustwienie wyjsc OC1A, OC1B, OC3A, OC3B
 */
TCCR1A = (1<<COM1A1) | (1<<COM1B1);
TCCR3A = (1<<COM3A1) | (1<<COM3B1);
TCCR1B = (1<<WGM13) | (1<<CS11);
TCCR3B = (1<<WGM33) | (1<<CS31);
//Wartosc TOP
ICR1 = 20000;
ICR3 = 20000;

Ja używam takich ustawień timera do sterowania czterema regulatorami modelarskimi. Sygnał o okresie 20ms, do OCR'ów wpisujesz wartości w mikrosekundach.

  • Pomogłeś! 1
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.