www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik brushless controller mit PWM ansteuern!


Autor: John Twenty (johntwenty)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich will meinen brushless regler mit dem mikrocontroller ATmega128 
ansteuern! dazu habe ich folgendes programm geschrieben: das programm 
gibt alle 20ms einen puls zwischen 0.5 und 2ms aus! Grundsätzliche 
frage: funktionieren servo ansteuerungen eigentlich alle mit diesen 
zeiten, oder wie werden diese angesteurt?
könnt ih mal einen blich übers programm werfen, könnte funktionieren 
oder?

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

#define F_CPU 14745600 // clock
#define PRESCALE_FACTOR 8 // prescale factor 8
#define PRESCALE_FACT (1<<CS11)
#define PULS_PERIOD 50 //50Hz -> 20ms
#define MAXPULS_FREQ 500 // 500Hz -> 2ms
#define MINPULS_PRESC 4 //MinPuls ist 4 mal kleiner als MaxPuls
#define TIMERSTART_VALUE 0-65536/(F_CPU/PRESCALE_FACTOR)*PULS_PERIOD 
//passt den startwert für den timer an, damit timer genau 20ms braucht 
bis overflow
#define MAXTIMER_VALUE F_CPU/(MAXPULS_FREQ*PRESCALE_FACTOR)
#define MINTIMER_VALUE 
F_CPU/(MAXPULS_FREQ*MINPULS_PRESC*PRESCALE_FACTOR)

SIGNAL(SIG_OVERFLOW1){
PORTB|=(1<<PB5);
TCNT1=TIMERSTART_VALUE;
}

void init(){
DDRB|=(1<<PB5); // set PB5 (OC1A) to output
/***normal timer mode of operation***/
TCCR1A|=(1<<COM1A1); // clear OCnx on compare match
TCCR1B|= PRESCALE_FACT;// timer prescaling
TIMSK|=(1<<TOIE1); //overflow interrupt enable
TCNT1=TIMERSTART_VALUE;
sei(); //enable interrupts
}

//speed Werte 0-255 erlaubt
void setMotorSpeed(unsigned char speed){
OCR1A=TIMERSTART_VALUE+MINTIMER_VALUE+(MAXTIMER_VALUE-MINTIMER_VALUE)/25 
5*speed;
}

int main(void){
init();
setMotorSpeed(128);
while(1);
return 0;
}

Autor: 2920 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Servos werden mit diesen Pulsen angesteuert, die Machbarkeit 
nicht immer einfach.  Bedenkend, dass das Minimum zwischen 0.8..1ms und 
das Maximum bei 1.6..2.2ms sein soll, welche Aufloesung haettest du denn 
gerne ? 8bit ? 8bit auf 1.4ms verteilt waere dann machbar mit einem 
5.6MHz clock oder schneller, ohne Vorteiler. Der 2.2ms Counter muesste 
dann auf ca 400 hoch zaehlen. Dh, der PWM muesste auf der Pulsbreite 
mindestens 9 bit haben.

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.