mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Servo 8bit Timer AVR


Autor: J. K. (rooot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sg. Forumsbesucher :-)

Ich versuche einen Modellbau-Servo mit einem 8bit-Timer zu betreiben. 
Dazu wähle ich einen passenden Vorteiler, dass ich eine Zeitbasis von 
1ms habe.
in der
0. Millisekunde setze ich den Servo ausgang auf high
1. führe ich eine fast pwm aus, je nach eingestellen gradwert
2. setze ich den ausgang wieder auf low und warte bis
20 wo das ganze wieder von vorn beginnt.

das ganze habe ich mit einem AtMega16 und Timer 2 programmiert. Der 
Servo geht zirka in Mittelstellung beim einschalten. Bei einer erneuten 
Gradvorgabe stellt er sich fast auf die linke Endposition und reagiert 
nicht weiter.

Der 16-bit-Timer wird leider schon für was anderes gebraucht.

Kann das überhaupt so funktionieren oder hab ich nen Denkfehler?

MfG
J.K.

Autor: J. K. (rooot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
volatile int grad=80;  
volatile int einstellung; 
volatile unsigned int hilf;  
volatile int counter = 0;

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
// Reinitialize Timer 2 value
TCNT2=0x06;
       
if (counter==0) {  

// OC2 output: Disconnected
TCCR2=0x4C;
PORTD.7=1;

}


if (counter == 1){

// OC2 output: Inverted PWM
//TCCR2=0x7C;
//non
TCCR2=0x6C;  
OCR2=einstellung;  
}    
if (counter==2){
// OC2 output: Disconnected
TCCR2=0x4C;
PORTD.7=0; 
}
  
counter++;

if (counter==20)
counter = 0;        

}
// Declare your global variables here

void main(void)
{


// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In Func7=Out 
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T State7=0 
PORTD=0x00;
DDRD=0x80;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 250,000 kHz
// Mode: Fast PWM top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x4C;
TCNT2=0x06;
OCR2=0x80;


// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;


// Global enable interrupts
#asm("sei")         

hilf=125*grad; 
einstellung=hilf/90 + 6;

while (1)
      {
      // Place your code here   
       scanf("%i",&grad);    
       hilf=125*grad; //grad *250 timerschritte / 180°  das ganze durch 2
  einstellung=hilf/90 + 6;
      printf("%i grad ok , %i einst\n",grad,einstellung); 
      
      

      };
}

Autor: Tobias Tetzlaff (tobytetzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

warum führst Du in der 2.ms eine PWM aus?

Du musst doch alle 20ms einen Puls mit der Länge von 1-2ms erzeugen.
Also:
0ms: Pin an
nach maximal 2ms: Pin aus
nach 20ms: wieder von vorn

Mit welcher Frequenz läuft dein Mega?
Dann könnte man wohl eher sagen, wie es gehen soll.
Wieviele Schritte brauchst Du für das Servo?

Gruß Toby

Autor: J. K. (rooot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also der Mega lauft mit 16MHz.

in der 1. ms erzeugt die pwm einen impuls zwischen 0 und 1 ms
+ 1ms der "0." millisekunde = 1-2 ms

@Schritte:
naja, 100 würden reichen, jetzt sind 250

MfG
J.K

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.