Skocz do zawartości

PWM,obsługa serwomechanizmu


Pomocna odpowiedź

Napisano

Witam. Wiem ,że było już wiele tematów tego typu ,ale w żadnym nie znalazłem odp na moje pytanie. Oto program :

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
int main( void )
{
  _delay_ms(1000);
  DDRB = 0xFF;    
  TCCR1A |=(1<<COM1A1);
  TCCR1A |=|(1<<WGM11); // pwm korekcja fazy 9-bit 
  TCCR1B |=(1<<WGM12)|(1<<WGM13)|(1<<CS11); // tryb CTC ,TOP=ICR1,preskaler 8
  ICR1 = 2500;  
  sei();
  while(1){
  OCR1A=80;
   _delay_ms(700);
  OCR1A=240;
}}

Teraz moje pytanie 🙂 .Musze ciągle ustawiać serwo raz w pozycji niemalże skrajnej lewej ,raz w prawej. Gdy w programie nie występuje while(1) ,wszystko jest ok ,jeśli jednak go dodaje serwo obraca się tylko w lewo potem stoi 😕 W czym tkwi problem ??Z góry dzięki za pomoc 😅

__________

Komentarz dodany przez: Treker

Daj jeszcze jeden delay po OCR1A - 240. Bez tego nie zauważysz zmiany wypełnienia z 80 na 240, bo program automatycznie przeskoczy do pierwszej instrukcji.

dzięki , duże przeoczenie z mojej strony ....

Mam jeszcze takie pytanie ,serwo ma straszne drgania można je jakoś usunąć ,czy tak po prostu ma być ??

dzięki , duże przeoczenie z mojej strony ....

Mam jeszcze takie pytanie ,serwo ma straszne drgania można je jakoś usunąć ,czy tak po prostu ma być ??

Może ma drgania bo przekroczyłeś zakres ruchu serwa. Zmniejsz wychylenie serwa i sprawdź czy dalej drga.

Witam kolejny raz. Nie chciałem zakładać nowego tematu więc tu zamieszczę kolejne pytanie.Program pisany na atmega 8.

Działają mi tylko pwmy 9 bitowe , nie działają 8 i 10 bitowe. Sprawdzałem dla fast pwm i phase corect .Program ten sam co w pierwszym poście ,zmieniam oczywiście tryb pwm na 8 lub 10 bitowy 🙂 . Serwo jednak ani drgnie ? Czy ktoś mógłby mi powiedzieć w czym tkwi problem ?? Szukałem w nocie katalogowej ,ale jakoś nie znalazłem rozwiązania. 😕

Dzięki

A wartości rejestrów odpowiedzialnych za wypełnienie zmieniasz?

Tak,zmieniam. Dawałem max,min pośrednie nic się nie dzieje 😕

edit : załączam program do fast pwm 8 bit ,atmega 8

#include

#include

#include

int main( void )

{

DDRB=0xFF;

_delay_ms(2000);

TCCR1A|=(1<

TCCR1B|=(1<

ICR1=2500;

sei();

while(1){

OCR1A=40;

_delay_ms(650);

OCR1A=220;

_delay_ms(220);

}

}

Tak ,jak wspomniałem w poprzednim poście działa mi tylko 9 bitowy pwm.Powyżej mój program dal 8 -bitowego.Może problem leży w kodzie ??

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