Servo Ansteuern. wo liegt mein fehler?

OP #4671382
Lesenswert?
• ▲
▼
Mahlzeit;

Also ich möchte im nachfolgenden Codebeispiel, ein Servo mit zwei 
tastern nach links und nach rechts bewegen. Einen Fehler vermute ich 
darin, das die Werte im OCR1A und OCR1B und der Vorteiler auf 8mhz 
bezogen sind. Ich aber nur einen Atmega8A mit 1mhz verwende. Wie wende 
ich das ab? Das zweite ist, wenn ich eine Led an den PWM ausgang 
hänge(zu testen ob etwas kommt)und die taster unabhängig von einander 
drücke ändert sich an der Frequenz nichts, das Servo bewegt sich 
ebenfalls nicht. Wo liegt hier main Fehler. Wäre um hilfe sehr dankbar


Ich benütze

Atmel studio 6.2

avr isp mk2 original

Atmega8A

/*
 * Servo_steuern.c
 *
 * Created: 04.08.2016 11:28:38
 *  Author: Huber
 */
#define F_CPU 1000000UL
#include <util/delay.h>

#include <avr/io.h>
#include <avr/interrupt.h>

//impuls starten
ISR(TIMER1_COMPA_vect)
{
  PORTB|= (1<<PB1);
}

//impuls beenden
ISR(TIMER1_COMPB_vect)
{
  PORTB &= ~(1<<PB1);
}

int main(void)
{   // Servo Ausgang definieren

  DDRB |= (1<<PB1);

  // Eingänge taster definieren

  PORTD |= (1<<PD2) | (1<<PD3);

  // Timer für Servosteuerung konfigurieren

  TCCR1B |= (1<<WGM12)|(1<<CS11);// CTC modus+ Prescaler 8 (f_CPU /8 = 
)
  TIMSK  |=  (1<<OCIE1A)| (1<<OCIE1B); // Timer interrups für 
vergleichswerte
  OCR1A  |= 25000;        // Vergleichsregister periode von max 25 ms
  OCR1B  |= 1400;  //Vergleichsregister Position des Servos nach 
Programmstart
                   //die genaue position muss experimentiel ermittelt 
werden..
  sei();



    while(1)
    {  // Servohorn nach recht bewegen

        if (!(PINB&(1<<PB3)))
        {
      if(OCR1B < 2500) OCR1B++;
      _delay_ms(1);
    }
    // Servohorn nach links bewegen

    if (!(PINB&(1<<PB2)))
    {
      if(OCR1B > 750 )OCR1B--;
      _delay_ms(1);
    }


    }
}
OP #4671560
Lesenswert?
• ▲
▼
Danke, habe ich das tatsächlich nicht gesehen.

so wie nachfolgend funktioniert es jetzt soweit. könnte mir noch jemand 
bitte erklären, oder die Formel zeigen wie ich die Pulsbreite bzw. die 
werte von OCR1A und OCR1B berechnen kann. denn das habe ich jetzt mehr 
oder weniger nach glück eingestellt.


/*
 * Servo_steuern.c
 *
 * Created: 04.08.2016 11:28:38
 *  Author: Huber
 */
#define F_CPU 1000000UL
#include <util/delay.h>

#include <avr/io.h>
#include <avr/interrupt.h>

//impuls starten
ISR(TIMER1_COMPA_vect)
{
  PORTB|= (1<<PB1);
}

//impuls beenden
ISR(TIMER1_COMPB_vect)
{
  PORTB &= ~(1<<PB1);
}

int main(void)
{   // Servo Ausgang definieren

  DDRB |= (1<<PB1);

  // Eingänge taster definieren

  PORTD |= (1<<PD2) | (1<<PD3);

  // Timer für Servosteuerung konfigurieren

  TCCR1B |= (1<<WGM12)|(1<<CS11);// CTC modus+ Prescaler 8 (f_CPU /8 = 
)
  TIMSK  |=  (1<<OCIE1A)| (1<<OCIE1B); // Timer interrups für 
vergleichswerte
  OCR1A  |= 1562;        // Vergleichsregister periode von max 25 ms
  OCR1B  |= 160;  //Vergleichsregister Position des Servos nach 
Programmstart
                   //die genaue position muss experimentiel ermittelt 
werden..
  sei();



    while(1)
    {  // Servohorn nach recht bewegen

        if (!(PIND&(1<<PD3)))
        {
      if(OCR1B < 1562) OCR1B++;
      _delay_ms(1);
    }
    // Servohorn nach links bewegen

    if (!(PIND&(1<<PD2)))
    {
      if(OCR1B > 80 )OCR1B--;
      _delay_ms(1);
    }


    }
}

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.