PWM i ATMega32

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
...
-
Posty: 1
Rejestracja: 17 sty 2008, 8:59
Lokalizacja: Bydgoszcz

PWM i ATMega32

Post autor: ... » 17 sty 2008, 9:12

Witam.
Mam problem z PWM w ATMega32. Posluzylem sie gotowym programem z ksiazki "Mikrokontrolery AVR w praktyce" J.Dolinskiego.Problem polega na tym, ze nie moge zmieniac wypelnienia PWM za pomoca przyciskow.Podlaczony do zestawu ZL10AVR oscyloskop caly czas pokazuje stan wysoki.Ponizej umieszczam kod programu.
void czekaj(unsigned long zt) //procedura wytracania czasu
{
#define tau 10.38
unsigned char zt1;
for(;zt>0;zt--)
{
for(zt1=255;zt1!=0;zt1--);
}
}

int main( void )
{
unsigned char licznikkl=0; //zmienna wykorzystywana do pomiaru czasu
//naciśnięcia przycisków
char przyrost=1; //przyrost zmiany współczynnika wypełnienia sygnału PWM
union
{
unsigned int pwm;
unsigned char pwmc[2];
}volatile upwm; //aktualny współczynnik wypełnienia sygn. PWM

DDRB=0x08; //PB3 - wy (OC1 - wyjście PWM), pozostałe we
PORTB=0; //bez podciągania
DDRD=0xfc; //PD1 i PD0 - we (obsługa klawiszy SW1 i SW4), pozostałe wy
PORTD=0x03; //wejścia z podciąganiem (potrzebne dla klawiatury)
TCCR1A=0x83; //PWM 10 bitowy
//zerowanie OC1 po spełnieniu warunku równości podczas liczenia
//w górę,
//ustawiane podczas liczenia w dół
TCCR1B=0x03; //preskaler=3, co przy 10-bit PWM daje Fwy=ok. 61Hz @8MHz
TCNT1L=0x00; //wstępne ustawienie licznika1
TCNT1H=0x00;
upwm.pwm=0x3ff; //początkowo silnik włączony, wartość TOP odpowiada wysokiemu
//poziomowi na wyjściu OC1 (PB3)
while(1) //główna pętla programu
{
if(bit_is_clear(PIND,1)) //czy wciśnięto SW4
{
upwm.pwm+=przyrost; //zwiększ pwm
if(upwm.pwm>0x3ff)
{
upwm.pwm=0x3ff; //jeśli przekroczono wartość TOP, to ustaw TOP
}
czekaj(150*tau); //eliminacja drgań i powtórnej interpretacji
//naciśnięcia przycisku
licznikkl++; //mierz długość naciśnięcia przycisku
}
else
{
if(bit_is_clear(PIND,0)) //czy wciśnięto SW1
{
upwm.pwm-=przyrost; //zmniejsz pwm
if(upwm.pwm>0x3ff)
{
upwm.pwm=0; //jeśli przekroczono wartość zero to ustaw zero
}
czekaj(150*tau); //eliminacja drgań i powtórnej interpretacji
//naciśnięcia przycisku
licznikkl++; //mierz długość naciśnięcia przycisku
}
else
{
licznikkl=0; //zeruj licznik pomiaru czasu naciśnięcia klawisza
//ponieważ wszystkie przyciski są zwolnione
przyrost=1; //ustaw początkową wartość przyrostu dla pwm
}
}
if(licznikkl>6)
{
przyrost=+16; //wykryto długie naciśnięcie przycisków,
//zwiększ krok regulacji
licznikkl=6;
}
OCR1AH=upwm.pwmc[1]; //wpisz aktualnie ustawiony współczynnik do rejestrów
OCR1AL=upwm.pwmc[0]; //OCR1 timera1
}
}

ODPOWIEDZ