Witam, może Wy mi pomożecie. Mam mały problem odnośnie sterowania prędkością silnika DC przez PWM.
Mikrokontroler to atmega8 podłączony przez mostek H do silnika DC.
Chcę w prosty sposób zmienić mu prędkość przez wpisanie mu do rejestru OCR2 odpowiednich wartości co się równa z odpowiednim wypełnieniem sygnału. Silnik po podłączeniu zasilania i nadania mu kierunku obrotów rusza i się obraca z najprawdopodobniej maksymalną prędkością a na jej zmiany nie reaguje. PWM działa bo jak podepnę pod tego pina diodę to miga. Podobny program napisałem w asemblerze i wszystko chodziło więc podejrzewam że jakiś błąd w programie robię a program przecież banalny.
Proszę o pomoc:|
Mikrokontroler to atmega8 podłączony przez mostek H do silnika DC.
Chcę w prosty sposób zmienić mu prędkość przez wpisanie mu do rejestru OCR2 odpowiednich wartości co się równa z odpowiednim wypełnieniem sygnału. Silnik po podłączeniu zasilania i nadania mu kierunku obrotów rusza i się obraca z najprawdopodobniej maksymalną prędkością a na jej zmiany nie reaguje. PWM działa bo jak podepnę pod tego pina diodę to miga. Podobny program napisałem w asemblerze i wszystko chodziło więc podejrzewam że jakiś błąd w programie robię a program przecież banalny.
Proszę o pomoc:|
#include <avr/io.h>
#include <avr/interrupt.h>
ISR (TIMER2_COMP_vect)
{
PORTB ^=_BV(0);
}
ISR (BADISR_vect){}
int main()
{
DDRB |= 0xff; //11111111
PORTB |=_BV(0); //00000000 Pin dla sygnału PWM
DDRD = 0x06; //00000110 Ustawienia dla przycisków do sterowania
PORTD = 0xf9; //11111001
int p1,p2;
p1=0x32; //50 impuls o czasie 3.2ms
p2=0x7d; //125 impuls o czasie 8ms
/*Licznik 2*/
TCCR2 |= (1<<WGM21) |(1<<WGM21) |(1<<CS22) |(1<<CS20); //Fast PWM, preskaler 128//
//Zegar 2MHz, czętotliwość 61Hz
TCNT2 = 0x00; //00000000
TIMSK |= (1<<OCIE2);
sei();
for(;;)
{
if(bit_is_clear(PIND,5)) //Zmiana prędkości
{
OCR2 = p1;
}
if(bit_is_clear(PIND,6))
{
OCR2 = p2;
}
if(bit_is_clear(PIND,0)) //Zmiana kierunków
{
PORTD |= _BV(1);
PORTD &= ~_BV(2);
}
if(bit_is_clear(PIND,3))
{
PORTD |= _BV(2);
PORTD &= ~_BV(1);
}
}
return 0;
}