Skocz do zawartości

[C] Atmega128 Sterowanie regulatorem EDF


Pomocna odpowiedź

Napisano

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 🙂

Witajcie, postanowiłem nową konstrukcję zaprogramować w C

Poziom idzie w górę - brawo!

Jaki masz kwarc w drugim przypadku?

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.

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.

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?

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).

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.

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.

//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

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...