Skocz do zawartości
Treker

[C] Atmega128 Sterowanie regulatorem EDF

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 🙂

Udostępnij ten post


Link to post
Share on other sites
Witajcie, postanowiłem nową konstrukcję zaprogramować w C

Poziom idzie w górę - brawo!

Jaki masz kwarc w drugim przypadku?

Udostępnij ten post


Link to post
Share on other sites

16Mhz, w kompilatorze i uC przestawione.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites
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.

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
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).

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

kling, dzięki - Twoje rozwiązanie się sprawdziło.

Udostępnij ten post


Link to post
Share on other sites

Treker, przez regulator EDF masz na myśli regulator silnika bezszczotkowego, który wykorzystujesz w EDFie, tak?

Udostępnij ten post


Link to post
Share on other sites

fish, tak 🙂

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij, aby zacząć pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...