This is an old revision of the document!


Table of Contents

Servomotor

Necessary knowledge: [HW] Motor Module, [HW] Sensors Module, [AVR] Digital Inputs/Outputs, [LIB] Motors, [LIB] Analog to Digital Converter

Theorie

RC servo motor
The relationship between width of the signal and position of Servo PWM.

Servomotoren werden oft in ferngesteuerten (RC) Modellen benutzt und sind nehr nützlich in kleinen robotischen Anwendungen, weil sie sehr kompakt und günstig sind. Ein RC-Servomotor hat einen eingebauten Gleichstrommotor, eine Gearbox, Positionsfeedbacksensor, und Steuerelektronik. RC-Servomotren können mit einem externen PWM-Signal gesteuert werden. Wenn das Signal der RC Servotiming entspricht, “beschreibt” es normalerweise ein Positionsinput für die Servosteuerelektronik. Die Servomotor Elektronik vergleicht die Achsenstellung mit der eigegebenen Position, während versucht wird eine passende Position für die Achse zu finden. Das Positionskontrollsignal ist eine durchgehende Rechteckschwingung, wie in dem Bild dargestellt.

RC (radio-controlled) Servomotoren sind sehr verbreitete Aktuatoren in den Robotics und im Modellbau. RC-Servomotoren bestehen aus einem kleinen Gleichstrommotor, einer Übersetzung und der logischen Kontrolleinheit. Normalerweise versucht der Rotor des Servomotors sich in eine bestimmte Position zu bringen und diese zu halten. Die Position des Rotors hängt von dem Kontrollsignal ab, dass der Servomotor empfangen hat. Je nach Typ des Motor kann der maximale Drehwinkel des Motors variieren. Servomotoren, die sich konstant drehen, sind selten. In diesem Fall gibt das Kontrollsignal nicht den Rotationswinkel, sondern die Geschwindigkeit an. Servomotoren “hacks” sind auch sehr verbreitet. Das bewirkt, dass die Positionsbestimmung des Motor sich konstant drehen lässt. In diesem Fall ist das Feedback Potentiometer durch zwei Widerstände ersetzt worden, und der mechanische Widerstand der verhindert, dass eine vollständige Rotation stattfinden kann, wurde entfernt. Ein wichtiger Charakter der Servomotors ist das Kraft-Gewicht-Verhältnis.

Das Kontrollsignal des Servomotors ist ein speziellen Pulsweitenmoduliertes Signal (PWM), wo die Pulsweite die Position des Rotors angibt. Die Periode des Signals ist 20 ms (50 Hz) und die Weite der hohen Periode ist 1 ms - 2 ms. 1 ms markiert die eine äußerste Position 2 ms die Andere. 1,5 ms markieren die Mittelposition des Servomotor Rotors.

Traditionelle RC-Servomotoren sind auch bekannt als analoge Servomotoren. Dies liegt daran, dass in dem letzten Jahrzehnt so genannte digitale Servomotoren auf den Markt kamen. Der Unterschied zwischen beiden, dass analoge RC-Servomotoren mit einem 50 Hz PWM Signal gesteuert werden, digitale RC-Servomotoren werden durch einen Microcontroller mit einem höherfrequenten Signal gesteuert. Das Inputsignal ist das Gleiche, jedoch ist durch die höhere Modulationsfrequenz wird eine schnellere und präzisere Positionsbestimmung ermöglicht.

Übung

Auf dem Board des HomeLab Motormoduls sind 2 Anschlüsse für RC-Servomotoren. Die PWM-Enden der Anschlüsse sind an den Pins PB5 und PB6 am Microcontroller angeschlossen, dessen sekundäre Funktion das Vergleichen der Einheiten A und B von Timer 1 sind. Timer 1 kann ein PWM Signal erzeugen, und daher ist das Steuern eines Motors sehr einfach zu programmieren. Das einzige schwierige ist das Einstellen des Timers.

Der Timer 1 muss in den PWM-Produktionsmodus eingestellt werden, wo der maximale Wert des Timers mit dem ICR Register bestimmt wird. Durch ändern des maximales Wertes im programm und im Taktgeber des Timers, kann die präzise PWM Frequenz um den Servomotor zu steuern bestimmt werden. Mit dem Vergleichs-Register des Timers werden die Längen für beiden hohen Semi-Perioden des Signals bestimmt. Der Timer hat eine spezielle Vergleichseinheit, welche den Wert des Zählwerks beobachtet und für den Fall, dass es gleich dem Wert des Vergleichs-Registers ist, ändert es des Output-Wert der Vergleichseinheit. Es folgt ein Programm-Code der Servomotor-Steuer-Library von HomeLab. Für die Ausführung nutzt es Parameter für Timer welche durch Macrofunktionen bestimmt werde. Zum Beispiel, wird die Periode durch die F-CPU Kosntante angegeben, welche die Taktrate des Microcontrollers angibt. Wenn man Macros nutzt, brauch man nicht die Parameter des Timers für verschiedene Taktzyklen zu berechnen und der Compiler konvertiert die Operationen mit Macros zu Konstante, daher steigt der Programmspeicher nicht, und es wird auch nicht mehr Rechenzeit benötigt.

//
// The value of the timer (20 ms)for achieving the full period of PWM.
// F_CPU is the clock rate of the microcontroller which is divided with 50 Hz and 8.
//
//
#define PWM_PERIOD      (F_CPU / 8 / 50)
 
//
// Middle position of PWM servo (5 ms / 20 ms)
// Middle position is 15/200 of full period.
//
#define PWM_MIDDLE_POS  (PWM_PERIOD * 15 / 200)
 
//
// Factor for converting the percents (-100% to 100%)to periods.
// +1 is added to ensure that semi periods would reach to the boundaries of 1 ms and 2 ms or // a little over.
//
#define PWM_RATIO       (PWM_PERIOD / 20 / 2 / 100 + 1)
 
//
// Set-up of the pins.
//
static pin servo_pins[2] =
{
	PIN(B, 5), PIN(B, 6)
};
 
//
// Preparing the servo motor for working.
//
void servomotor_init(unsigned char index)
{
	// The pin of PWM signal for output.
	pin_setup_output(servo_pins[index]); 
 
	// Setup of timer 1.
	// Prescaler = 8
	// Fast PWM mode, where TOP = ICR
	// OUTA and OUTB to low in comparisson.
	timer1_init_fast_pwm(
		TIMER1_PRESCALE_8,
		TIMER1_FAST_PWM_TOP_ICR,
		TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH,
		TIMER1_FAST_PWM_OUTPUT_CLEAR_ON_MATCH,
		TIMER1_FAST_PWM_OUTPUT_DISABLE);
 
	// Determining the period by maximum value.
	timer1_set_input_capture_value(PWM_PERIOD);	
}
 
//
// Determining the position of the servo motor.
// The parameter of the position is from -100% to +100%.
//
void servomotor_position(unsigned char index, signed short position)
{	
	switch (index)
	{
		case 0:			
			timer1_set_compare_match_unitA_value(
				PWM_MIDDLE_POS + position * PWM_RATIO);
			break;
 
		case 1:
			timer1_set_compare_match_unitB_value(
				PWM_MIDDLE_POS + position * PWM_RATIO);
			break;
	}
}

Das Beispielprogramm nutzt beschriebene Funktionen der HomeLab Library. Am Anfang des Programms wird der erste Servomotor PWM-Signal Generator gestartet, mit der servomotor_init Funktion. Der Wert der Position des Servomotors wird durch die Kanalnummer 3 des ADC erhalten, wo ein Potentiometer am Sensorboard angeschlossen ist. Um die Reichweite -100 % - +100 % die für die Steuerung des Servomotors notwendig ist zu erhalten wird die Hälfte des Maximums (512) vom ADC Wert abgezogen und das Ergebnis wird durch 5 dividiert. Das Ergebnis ist +/- 102, aber kleine Ungenauigkeiten werden nicht gezählt, da Servomotren sich auch in der Relation des PWM-Signals und des Drehwinkels unterscheiden. Die finale PWM Halbperioden Weite in Anwendungen muss über das “Try-and-Error”-Verfahren gefunden werden. Die Fernsteuerungen von RC-Modellen haben auch Möglichkeiten für ein präzises Setup. Wenn das Programm läuft, wird die Rotorposition des Servomotors je nach Position des Potentiometers verändert.

//
// Testing program of the motors module of the HomeLab kit.
//
#include <homelab/adc.h>
#include <homelab/module/motors.h>
 
//
// Main program.
//
int main(void)
{
	short position;
 
	// Set-up of the ADC.
	adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);
 
	// Set-up of the motor.
	servomotor_init(0);
 
	// Endless loop.
	while (true)
	{
		// Reading the position of the potentiometer and converting the range of
		// the servo motor.
		position = ((short)adc_get_value(3) - (short)512) / (short)5;
 
		// Determining the position of the servo motor.
		servomotor_position(0, position);
	}
}
de/examples/motor/servo.1289820090.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0