Skocz do zawartości

PWM silnik DC na Atmega8


stanekcr

Pomocna odpowiedź

Witam! To mój pierwszy post na tym forum, mam nadzieję, że znajdę tutaj pomoc. Jestem początkujący, duzo szukałem na temat PWM, nie ma tego zbyt wiele przedstawionego w przystępny sposób. Chciałbym wysterować dwa silniki prądu stałego przez mostek H przy pomocy PWM -timer 1 (Atmega8). Proszę o sprawdzenie kodu i odpowiedź na kilka pytań.

#include <avr/io.h>              
#include <avr/interrupt.h>     
#include <stdlib.h>
#define F_CPU 1000000L
volatile uint16_t pwmA;
volatile uint16_t pwmB;

void PWM_Init (void)
{

TCCR1B|=(1<<WGM12)|(1<<CS11)|(1<<CS10);        //tryb 8 - bit Fast PWM, preskaler 64
TCCR1A|=(1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);       // czyli f=61 Hz przy fcpu=1MHz

TIMSK |= (1 << TOIE1);  // przerwanie
sei(); 
OCR1A = 0; // 0-255
OCR1B = 0; // 0-255
}

SIGNAL (SIG_OVERFLOW1)
{

OCR1A=pwmA;

OCR1B=pwmB;
}

int main(void)
{
DDRB=0x1e; // piny 0001 1110 jako wyjścia
PWM_Init();
pwmA=127; // pwm na 50%
pwmB=80; // pwm na ok 25%
while(1)
{
}
}

Czy ten program jest dobrze napisany?? Powinien kręcić 2 silniki w tę samą stronę, przy czym jeden wolniej drugi szybciej.

Jak zmienić kierunek obrotów, tzn żeby sygnał z pwm był dostarczany na PINB 3 lub 4??

Link do komentarza
Share on other sites

Przepraszam za niedociągnięcia w przedstawieniu problemu.

Więc podłączam Atmege8 przez układ L293D do 2 silników DC.

ckt_mtr_1826.jpg tak jak na obrazku

do RA1, RA2 podpinam PB1 i PB2, do RA0, RA3 - PB3 i PB4.

Link do komentarza
Share on other sites

stanekcr, przy takim połączeniu jak na schemacie nie będziesz miał regulacji prędkości obrotowej silników, z prostego powodu - nie podłączyłeś PWMa do wejść 1,2E i 3,4E. Co do kodu przedstawionego powyżej to nie stosuje się już SIGNAL(), zamiast tego stosuje się ISR(). Zmienne pwmA i pwmB niepotrzebnie dałeś jako 16bitowe, spokojnie wystarcza 8bitów, skoro używasz PWMa 8bit.

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

Dlaczego nie będzie regulacji?? Przecież z Atmegi wyprowadzam tylko sygnał sterujący na mostek układ 293 który w zależności od sygnału będzie zasilał silniki napięciem Vcc1 i Vcc2.

Dziękuje za rady 🙂

Link do komentarza
Share on other sites

Przy takim podłączeniu masz regulację kierunku wirowania, ale nie masz regulacji prędkości obrotowej. W pierwszym poście napisałeś, że chcesz żeby silniki wirowały w tym samym kierunku, ale z różną prędkością. Teraz będą wirowały z tą samą prędkością - maksymalną.

Link do komentarza
Share on other sites

Rozważmy jeden silnik:

PB1 daje sygnał PWM na układ 293, logiczną 1 na pin RA3(wg obrazka powyżej) a pin RA2 ma cały czas wartość 0. Silnik kręci się cały czas w jedną stronę. Silnik będzie dostawał maksymalny prąd ale tylko wtedy kiedy PB1 ma wartość zero, a ten sygnał jest determinowany ustawieniami PWM. Czy nie tak to działa?

Link do komentarza
Share on other sites

stanekcr, żeby silnik był sterowany PWM musisz podpiąć sygnały z mikrokontrolera OC1A oraz OC1B do portów enable 1,2 oraz enable 3,4 mostka. Np tak: OC1A do Enable 1,2 a OC1B do Enable 3,4

Tu sympatycznie wyjaśniona zasada działania mostka przez kolegę: https://www.forbot.pl/forum/topics20/mostek-h-h-bridge-vt111.htm?highlight=mostek

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Nie prościej wykorzystać piny 1,2E i 3,4E z układu L293? Wtedy pinami RA0-3 ustalasz kierunek wirowania, a na piny 1,2E i 3,4E podajesz sygnał z wyjść OC1A i OC1B mikrokontrolera.

Link do komentarza
Share on other sites

Aha, dzięki oświeciliście mnie. Podłącze wg schematu:

l293d.png

Jeszcze mam pytanko. Jeżeli włączę pwm to będzie on w przypadku atmega8 na pinach PB1, PB2. Czy jest teraz opcja, aby występował na innych pinach a PB1 i PB2 miały inne funkcje.

Wybaczcie moją niewiedzę, ale dopiero zaczynam.

ps

Olimek, na podstawie tamtego tematu pisałem swój program, tylko nie wiedziałem czy będzie on na pewno działał i nie miałem pomusłu jak zmienić polaryzację przy podłączeniu jakie chciałem wykonać na początku. Dzięki za pomoc.

Link do komentarza
Share on other sites

Jeśli chcesz używać sprzętowego PWM czyli ciągniętego z Timerów to wyjścia będą zależeć właśnie od timera, którego używasz. Czyli jeśli zmienisz timer to zmienią się i wyjścia. Jeśli użyjesz PWM programowego to wyjścia mogą być praktycznie na każdym pinie uK.

Link do komentarza
Share on other sites

Odkopuję.

Jeden silnik DC dość dziwne rzeczy robi.

Ustawiając oba wyjścia na 0 (jedno pwm 1A na atmega8, drugie port = 0) dostaję lekki obrocik... słabo filtrowane zasilanie? (niby bateryjka)

Wiecie coś o tym???

Link do komentarza
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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij 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...

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.