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


von John T. (johntwenty)


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;
}

von 2920 (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.