Servotester mit ATtiny13            

von Gerd Sinning                        
Elektronik-Labor   Projekte   AVR 

 Servos sind individuelle Charaktere, normalerweise erwarten sie einen Puls zwischen 1 und 2 ms alle 20 ms und dann drehen sie nach links und rechts, aber welchen Drehwinkel haben verschiedene Servos? Da gibt es Unterschiede, bereits die Steckerbelegung ist nicht standardisiert und die Pulsbreite ebensowenig. Ein paar Messergebnisse zeigen das: ein Conrad Servo dreht etwas über 180 Grad mit einer Pulsbreite von 0.62 bis 2.4 ms, ein anderer Servo dreht 180 grad von 0,5 bis 2.5 ms, von 1 bis 2 ms sind es nur 90 Grad. Da hilft nur ein schneller Test.

Das Schaltbild: mit diesem Servotester kann man es ausprobieren, bevor man den Servo einbaut.

Das Programm ist sehr einfach aber recht vielseitig. Der Servotester hat zwei Ausgänge um den Servo anzuschliessen, einen konventionellen Ausgang mit einer Pulsbreite von 1-2 ms an PB0 und einen von 0.5 bis 2.5 ms für die Grenzwerte an PB1. Den muss man vorsichtig benutzen, weil man damit den Servo an den mechanischen Anschlag steuern kann, man hört das aber und der Strom steigt an. Also schnell wieder zurück in den sicheren Bereich. Mit dem Potentiometer an ADC3 wird die die Spannung eingestellt, digitalisiert und in die Pulsbreite umgesetzt, d. h. damit dreht man nach links und rechts. Die Spannung wird auch mit 9600,8,N,1 an die serielle Schnittstelle übertragen. Wenn man den Bascom Servo Befehl nimmt dann ist die Pulsbreite für den Servo, jedenfalls bei meinem AT13, von der Clockfrequenz abhängig, und die Werte für den Servo Const Svmin und Const Svmax bleiben nicht konstant. Siehe Goniometer. Daher wird hier die Pulsbreite mit Pulseout Portb , 0 , Svpos0 erzeugt. Bei 4 MHz hat man da 1 us Auflösung, also 1000 Schritte zwischen 1 und 2 ms und das passt gut zum ADC mit 1024 Werten. Damit läut der Servo ruckelfrei. Die LED wird bei einem Wert vom ADC über 511 eingeschaltet, also in der Mitte vom Einstellbereich.

Ohne Servos kann man damit eine Spannung digitalisieren und an den PC übertragen. Mit einem Servo gibt es ein Servo-Voltmeter. Die LED kann Grenzwerte der Spannung anzeigen und mit einem LDR am Eingang des ADC wird Licht gemessen, der Servo dreht von dunkel nach hell.

Das gibt viel Spaß beim Basteln und Raum für eigene kreative Entwicklungen.

Literatur:  datasheet ATtiny13, Atmel.com



Download: Servo.zip

'***************************************************************************
'
' Title :AT13 servo tester
'
' potentiometer (voltage) on ADC3 turns servo left right
'
' PB0 output Servo0 1 - 2 ms (conventional)
' PB1 output Servo1 0.5 - 2.5 ms (use carefully)
' PB2 output Led2 turns on above Const Ledon = 511
' PB3 input ADC3 voltage in
' PB4 output RS232 sends voltage on ADC3 (0..1023)
'
' servo uses Pulseout on PB0/1, therefore set clock to 4.8 MHz
'
' Last updated : GS 12-2013
' Target : ATtiny13
'
'***************************************************************************
' This program is free software; you can redistribute it and/or
' modify it under the terms of the GNU General Public License.
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY;
'***************************************************************************
'
' Pinout ATtiny13/ATtiny13V 8-PDIP/SOIC
'
' (PCINT5/RESET/ADC0/dW) PB5 VCC
' (PCINT3/CLKI/ADC3) PB3 PB2 (SCK/ADC1/T0/PCINT2)
' (PCINT4/ADC2) PB4 PB1 (MISO/AIN1/OC0B/INT0/PCINT1)
' GND PB0 (MOSI/AIN0/OC0A/PCINT0)
'
';***************************************************************************

$regfile = "ATtiny13.DAT"
$crystal = 4800000
$hwstack = 8
$swstack = 8
$framesize = 4

Led2 Alias Portb.2

Const Svmin0 = 990 'check for your servo
Const Svmin1 = 500
Const Ledon = 511 'Led2 turns on

Dim Channel As Byte , I As Byte , N As Byte
Dim Svpos0 As Word , Svpos1 As Word
Dim W As Word
Dim Voltage As Word

Ddrb = &B00010111
Portb = &B00000000 '

'*********************************************************************
Acsr.acd = 0 ' switch off analog comparator

$asm 'turn on 4.8 MHz CLK
ldi R24, &B10000000 'prescale enable
Out Clkpr , R24
ldi R24, &B00000001 'prescale 2
Out Clkpr , R24
$end Asm

Didr0 = &B00001000
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Open "comb.4:9600,8,n,1,INVERTED" For Output As #1

'Enable Interrupts

'For Svpos = Svmin To Svmax Step 2 'test
' Pulseout Portb , 0 , Svpos
' Waitms 20
'Next

Do 'all in 1 loop

Channel = 3 'read potentiometer
For I = 1 To 4
W = Getadc(channel) '10 bit
Voltage = Voltage + W
Next I

Shift Voltage , Right , 1 '2048
Svpos1 = Voltage + Svmin1

Shift Voltage , Right , 1 '1024
Svpos0 = Voltage + Svmin0

If Voltage > Ledon Then 'show on Led
Led2 = 1
Else
Led2 = 0
End If

Pulseout Portb , 0 , Svpos0
Pulseout Portb , 1 , Svpos1
Waitms 15 'move servo

Incr N
If N = 25 Then
Print #1 , Voltage 'send data
N = 0
End If

Loop

End

'


 Elektronik-Labor   Projekte   AVR