Skocz do zawartości

Pomocna odpowiedź

Napisano

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

stanekcr, wypadałoby żebyś dodał schemat, ewentualnie napisał jakiego mostka używasz i jak jest on podłączony z mikrokontrolerem.

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.

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.

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 🙂

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

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?

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.

RafI, Kolega cię uprzedził 😉

stanekcr,

1,2 A ustalanie kierunku obrotów pierwszego silnika

1,2 E ustalenie prędkości silnika 1

3,4 A ustalanie kierunku obrotów drugiego silnika

3,4E ustalenie prędkości silnika 2

Na pewno szukałeś ?

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.

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.

Nic nie muli. Akurat wykorzystuje cztery programowe PWMy w projekcie i wszystko działa bez problemu.

  • 2 lat(a) później...

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

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