PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Servotester mit 555er



Devil
08.10.2008, 09:10
Hallöchen Bastler,

ich habe hier vor längerer Zeit ein Beitrag gelesen mit einer Schaltung für ein Servotester mit ein 555er IC mit dem man Servos im kompletten drehbereich testen kann.
Ich habe den "Servotester" vom großen C und muss sagen das der mich nicht gerade begeistern konnte. Dieser kann wenn es hochkommt ein viertel der dem servo zu verfügung stehenden Drehbereich testen.

Deshalb bin ich nun seit Stunden auf der suche dieser Schaltung, leider erfolg los.

Statt dessen habe ich diese interessante Seite gefunden:

http://www.elektronik-kompendium.de/sites/slt/0310131.htm

und dachte das das ja quasi das ist was ich suche. Ich bin mir nur nicht sicher ob diese Schaltung genügt, weil dort beschrieben ist das man das Puls-Pausen-Verhältnis nicht kleiner als 1:1 bekommt und ich mir nicht sicher bin Ob ein Steuersignal von einem servo nicht auch längere Pausen als Pulse benötigt um beide seiten voll Auszulenken.

Also bitte ich euch mir mit der Schaltung von der Seite weiterzuhelfen oder , wenn ihr habt, die schaltung für den Servoterster zu verlinken.

MfG Jan

Hubert.G
08.10.2008, 10:49
Diese Schaltung geht sehr gut /www.domnick-elektronik.de/elek555.htm
ziwschen D1 und Pot noch einen Widerstand mit 47k einfügen.

oberallgeier
08.10.2008, 11:56
... mit dem man Servos im kompletten drehbereich testen kann ...Ich hab mir mit nem tiny13 und einem Poti einen Servotester aufgebaut.

.........................https://dl.dropbox.com/s/aeenxojt07613hv/servotester_1663.jpg?dl=0http://oberallgeier.ob.funpic.de/servotester_1663.jpg

Bauteile:
1 tiny13
1 Steckfassung für den tiny
1 Poti 100k
1 Winkelstecker mit 3 Kontakten (für Servo)
2 Kondensator VisKo 100 nF
1 2950 (LowDrop Spannungsregler 5V für den tiny13)
1 Streifenrasterplatine 12 x 24 Löcher
etwas Schaltdraht für Brücken
Anschluss für Spannungsversorgung 6 .. 7 V je nach Servo - die Anschlussspannung geht direkt auf den Servo.

Ich hab noch nen ISP-Wannenstecker drauf, der ist aber nicht wirklich erforderlich. Ausserdem habe ich noch 2x2 Buchsenkontakte drauf zum Messen der Stromaufnahme und so und einen Kontaktstift auf Sig, um das Steuersignal für den Servo am Oszilloskop anzusehen.

Der Stellbereich ist frei wählbar per Software im Programm. Er ist bei mir aber so eingestellt, dass ich die meisten Servos an beide Anschläge fahren kann.

thewulf00
08.10.2008, 17:01
@oberallgeier
Das ist mal ein sehr gelungenes Projekt!
Ist das irgendwo ausführlich beschrieben?

Den Poti fragst Du sicher über einen AD-Wandler des Tinys ab, oder? Ist das genau genug, oder springt der Servo auch ab und an?

oberallgeier
08.10.2008, 17:31
... gelungenes Projekt! ...Danke *gggg*.


... Ist das irgendwo ausführlich beschrieben? ...Wie man´s nimmt. Ich hab in meinem Ordner (das ist das Ding im Regal für Papier *ggg*) den Schaltplan in Bleistift auf kariertem Papier, und in meinem PC-Projektordner den Code. Ich dachte (bisher) nicht, das zu veröffentlichen, weils wohl genug Threads darüber gibt und die Lösung recht einfach ist (und es ist ein eher frühes Werk von mir: Assembler, nicht wirklich pfiffig programmiert und so . . . .).


... Den Poti fragst ... AD-Wandler des Tinys ... Ist das genau genug, oder springt der Ser vo auch ab und an?Der Ser vo springt geringfügig, wenn überhaupt (zumindest die Preisklasse, die ich üblicherweise kaufe) - weil das Poti vom Ser vo nicht sooo genau ist, vor allem aber, weil die Verbindung zwischen Abtriebsstummel des Ser vos und dem Poti im Ser vo weder spielfrei noch starr ist. Wegen des Controllers ist das wohl nicht. Der läuft zwar nur mit internem Oszillator bei 9,6 MHz, das ist eine Genauigkeit, die für den Ser vo völlig ausreicht. Den ADC betreibe ich mit 10Bit, das heißt, dass ich die rund 1,5 ms - die das Ser vosignal wegen der großen Bandbreite bestreicht - recht genau aufteilen kann. Und da der tiny13 nix anders tut, als den einen Ser vo zu bedienen, kann ich die Aufteilung der Rampe recht genau machen. Ich müsste mal nachsehen wieviel das ist, ich glaub es sind 4µs-Schritte (Interrupts).

Was natürlich noch von Vorteil ist: man kann damit recht hübsch gehackte Ser vos (also mit verbliebener Elektronik aber ohne interne Verbindung Poti-Abtriebswelle) testen. Völlig ausgeweidete Ser vos, wie ich sie betreibe, (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=344432#344432) brauchen aber eine richtige H- Brücke.

thewulf00
08.10.2008, 18:53
Du betreibst sie also als Getriebemotor ohne Elektronik? Das ist ja ja auch ungewöhnlich. Aber dann sind sie wenigstens wieder genauer :-p

Dein kleines Projekt finde ich sehr nützlich, vor allem aber sehr ästhetisch - durch die Miniaturisierung. Ich bin auch ein Freund des Minimalen (zumindest in der Größe).

Ich glaube, den Schaltplan kriege ich auch so hin, aber die Software interessiert mich... :-)
Eine Frage noch: Warum ein 100K-Poti?

oberallgeier
08.10.2008, 19:25
... Getriebemotor ohne Elektronik ... genauer ...Ja, ich bin über den Geradlauf beider etwas unterschiedlicher Motoren (Zeitkonstante 12 bzw. 8 ms) auf meinem Dottie (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=390196#390196) selber überrascht. Die Regelung gleicht die Unsymmetrie der Motoren aus: weniger als +/- 1mm bei 1 m Laufstrecke.


... Ich glaube, den Schaltplan kriege ich auch so hin, aber die Software interessiert mich... Man(n) sollte doch keine Arbeit zweimal machen. Schaltplan (https://dl.dropbox.com/s/0wedvx5q776oecd/s-test-2.jpg?dl=0) und Bestückung (https://dl.dropbox.com/s/i94a94ymollionq/s-test-1.jpg?dl=0) - handschriftlich *gggg*. Ich glaube, im Schaltplan fehlt die GND-Verbindung des 2950, die muss sein = (2) an GND.


; Sicherung vom 21jan08, 13:46 nach Datei servo1_servoplatine-gut.asm
;================================================= ==================================
;* Target MCU : ATtiny13
;* Target Hardware : Servotester-Platine, Servo auf PB3, Poti auf PB4
;* Target cpu-frequ. : 9,6 MHz, interner Oszillator
;================================================= ==================================
;*Versionsgeschichte:
;====================
;x1599 21jan08 12ff Version für die "Servoplatine" adaptiert
; dazu ISR+adc+servo1-x30-gut.asm abgeändert.
;
;* Aufgabenstellung
;* ISR zum Testen von einem Servo mit der Servotester-Platine
; Servo über getrennte Leitung, max. 1 A, vom Labornetzteil versorgt
; Portbelegung, Schaltung auszugsweise (übernomm. v. srv-adc+pwm-x29b.asm)
;
; Vcc(6V LNT) -----------------------------------------Vcc-Servo1
;
; Vcc -----------tiny13-Vcc
; |
; | tiny13-PB3=pin2----------------+---Signal-Servo1
; | |
; | + - - (poti1->ADC) - - +
; | |
; | tiny13-PB4--------+
; | V
; | +--------+
; +-------------------+ 25klin +----+
; +--------+ |
; |
; GND---------------------------------------+----------GND-Servo1
;
;* ===============================================
; ######### Original war: ISR+adc+servo1-x30-gut.asm
;================================================= ==================================
; Speicherbelegung
;r14 low-Byte der ADC-Wandlung (lsb)
;r15 high-Byte der ADC-Wandlung: Beide ergeben einen Wert zwischen 0...1023
;r16 Mehrzweck, high-Byte in Pausen "pause_an", "pause_aus", "led_ende" u.ä.
;r17 low-Byte in Pausen, s.o.
;
;r18 -- --
;r19 -- --
;r20 -- --
;
;r21 Byte Steuerbyte. Es werden nur Bits ausgewertet
; "Rampe" an-aus, 1=Rampe an, bit 1 = Servo 1 , bit 5 = Servo 2
; Übernahme Rampenwert, 1=Daten wurden noch nicht übernommen vom
; Hauptprogramm in die ISR, 0=ISR hat Daten abgeholt und zwar
; bit 2 = Servo 1 , bit 6 = Servo 2
;r22 1/2 Word lsb Zeitwert Rampe aus auf-ab-Rechnerei im Hauptprogramm
;r23 1/2 Word msb zu r26
;r24 1/2 Word LSB Zeitwert Rampe aus ADC/Poti im Hauptprogramm
;r25 1/2 Word MSB wird vom r14/15 geholt und zurechtgerechnet
;
;r26 1/2 Word LSB GESAMTDAUER Servoimpuls MUSS in r26/27 sein wegen sbiw
;r27 1/2 Word MSB Zeitwert für GESAMTDAUER Servoimpuls, etwa 500 Takte ?
;
;r28 1/2 Word lsb LSB RampenCOUNTER Servo1, wird in ISR runtergezählt
;r29 1/2 Word msb MSB Counter stammt vom ADC
;r30 1/2 Word lsb LSB Auf-ab-COUNTER Servo2, wird in ISR runtergezählt
;r31 1/2 Word msb MSB
;
;================================================= ==================================

#include "tn13def.inc"

; Interrupthandler-Tabelle (aus ATTiny13_doc2535.pdf, Seite 42)
; Address Code Labels ; Comments
.org 0x0000 rjmp anfang ; Reset Handler
;.org 0x0003 rjmp isr_x13 ;TIMO_OVF = Timer0 Overflow Handler

.org 0x0006 rjmp isr_ctc ; IRS für Timer0 CompareA Handler
;
;================================================= ==================================
; Deklarationen für den Praeprozessor
; Konstanten ####### evtl. auch keine Konstanten definiert
;
#define a r16 ;Kurzbezeichung für Allzweckregister r16
;
; Anschlussbelegung, vgl. srv-adc+pwm-x29b.asm
#define servo1 3 ;Servo 1 auf Port PB3
#define potiadc 2 ;Poti 1 am Port PB4 geht auf ADC-Kanal 2
;
;Festwerte und div. Daten für adcdat etc ====>
#define adcpsc 7 ; =7 ==> Clock/128, 9,6 MHz werden 75 kHz, vgl. doc, S93
;#define adcdat 3 ;Dummywert vom ADC ###>>> "Nur" 8Bit-Wandlung ! ? !
#define msges 5000 ;Gesamtzeit der Rampe: 5000 ISR-Zyklen sind 20 ms
#define mstest 500 ;Test ergibt mit mstest 500 und tmprs 40: für 2,0 ms
; das heisst: 4 µs Interrupt-Abstand (Fehler +4%)
#define msmin 180 ;Minimalwert für Rampe: 0,5 ms
#define tmrprs 38 ;Preset im Timer-Register (hoffentlich für CTC)
;
;================================================= ==================================
; Hauptprogramm
;================================================= ==================================
;
anfang:
rcall mc_init ;Initialisiere den Mikrocontroller
rcall isr_ini ;Initialisiere die ISR
rcall adcinit ;ADC initialisieren
;
sei ; .. Interrupts allgemein zulassen im Hauptprogramm

anfang2:
rcall adc_hol ;Hole Daten vom ADC in Register low=r14 + high=r15
;
rjmp anfang2
;
;================================================= ==================================
; Prozeduren
;================================================= ==================================
;
adc_hol: ;=== Hole Daten vom ADC, wird erst NACH der Wandlung verlassen
;Nach Wandlung sind die Werte in; L=r14,H=r15
ldi r16,potiadc ;Poti ist auf ADC-Kanal 2. >> Kanal 0 = Pin1=PB5,
; K1(ADC1)=Pin7=PB2, K2=Pin3=PB4 und K3=Pin2=PB3
rcall rdadc ;ADC auslesen
ret ;=====----->>>>>
;
rdadc: ;=== Hole Daten vom ADC in die Register low=r14 + high=r15
out admux,r16 ;vgl.doc2535, S 79
sbi admux,adlar ;Result left adjusted ==> NUR 8-Bit-Wandlung
sbi adcsra,adsc ;Wandlung starten
adrdy: ;=== Warte bis ADC fertig ist ==> ZWEI Wandlngen durchführen
sbic adcsra,adsc ;Skip if bit is cleared => dann ADC fertig
rjmp adrdy ; .. wenn nicht fertig, warten
adrdyb:
sbic adcsra,adsc ;Erst zweite Wandlung bringt korrektes Erbebnis,
rjmp adrdyb ; vgl. doc2535, sonst könnte alter Wert da sein.
; Dies dann, ###===>>> nur WENN der Kanal umgeschaltet wurde.
; in r14,adcl ;Daten einlesen, zuerst Low-Byte - nicht bei adlar
in r15,adch ;vgl. oben ADMUX (out 3), ADSC
ret ;=====----->>>>>
;
;================================================= ==================================
; Initialisierungprozeduren, für µC, ADC und Timer-ISR
;================================================= ==================================
;
mc_init: ;=== Initialisiere Mikrocontroller
; PB0 (servo1) + PB3 (servo2) = Ausgang, PB4 (poti1) = ADC-Eingang
ldi r16,0b00001000 ;Ausgang (1) auf PB3, Eingang (0) auf PB4
out ddrb,r16 ;Datenrichtungsbits setzen, Port ist Ausgang
ldi r16,0b11100111 ;Datenrichtungsbits setzen
out portb,r16 ; und initialisieren
ret ;=====----->>>>>
;
adcinit: ;=== Initialisiere ADC und hole Daten
ldi a,adcpsc ;Setze adpsc0,1,2 => Clock/128, siehe define
out adcsra,a ;Lade prescaler ==> 75 kHZ, siehe define
sbi admux,potiadc ;Wandlung vom Kanal ADC2 = PB4 = potiadc
sbi admux,adlar ;Result left adjusted ==> NUR 8-Bit-Wandlung
sbi adcsra,aden ;AD en-able einschalten
sbi adcsra,adsc ;Wandlung zum Initialisieren starten
;
adrdy_in1: ;=== Warte bis ADC fertig ist ==> ZWEI Wandlngen durchführen
sbic adcsra,adsc ;Skip if bit is cleared => dann ADC fertig
rjmp adrdy_in1 ; .. wenn nicht fertig, warten
adrdy_in2: ;=== Warte bis ADC fertig ist ==> ZWEI Wandlngen durchführen
sbic adcsra,adsc ;Skip if bit is cleared => dann ADC fertig
rjmp adrdy_in2 ; .. wenn nicht fertig, warten
;
ldi r16,0b00000000 ;Dummy-Muster
mov r14,r16 ;Muster nach r14
mov r15,r16 ; .. und nach r15

sbi adcsra,aden ;AD en-able einschalten
sbi adcsra,adsc ;Wandlung zum Initialisieren starten

ret ;=====----->>>>>
;
;
isr_ini: ;=== Initialisierung der ISR (war mal isrinit_x15)
;
;;Timer Register werden belegt
ldi a,(1<<wgm01) ;prescaler ist 1, waveform = CTC
out tccr0a,a ;Register TCCR0 ist für den Prescaler zuständig
ldi a,(1<<cs00) ;prescaler ist 1 => kein Prescaling, Abstand zum
out tccr0b,a ; nächsten Interrupt bestimmt der
; CTC-Prescaler tmrprs
ldi a,(1<<ocie0a) ;Hier Interrupts nach CTC eingeschaltet
out timsk0,a ;Register TIMSK ist dafür zuständig
ldi a,tmrprs ;Hier wird der Timer vorgeladen. Er läuft dann
out TCNT0,a ; .. tmrprs mal durch bevor ein Interrupt auftritt
out ocr0a,a ;Preset tmrprs in OCR0A
; .. Interrupts allgemein zulassen im Hauptprogramm
; ret ;=====----->>>>>
;
;
;================================================= ==================================
; Interrupt-Service-Routine
;#######>>>>> Muss real nicht zuerst der (letzte) PC gepusht werden ?
;================================================= ==================================
;
;
isr_ctc: ;=== Immer wieder Veränderungen
;
sbiw r27:r26,1 ;Pointer von 5000 runterzählen
; für EINEN Servoimpuls von 20 ms
breq i_neu ; .. und Spezialfall "null" ==> Daten umschaufeln
; und Rampe einschalten. WENN keine neuen Daten da
; sind, dann alte Daten nehmen :(
;
; Jetzt wird nachgesehen, ob eine der Rampen ausgeschaltet werden muss. Das steht
; im Portbit ddrb
;
isr_nn: ;=== Zähler der ISR steht nicht auf Null
s1_pran: ;=== Servo1: Prüfe, ob Rampe ist an
in r20,portb
sbrs r20,servo1 ;Ist Rampe von servo1 an?
rjmp i_raus ;Wenn Rampe nicht an ist, dann gleich raus
;
sbiw r29:r28,1 ;Decrementiere Rampenwert
brne i_raus ;weiter, wenn noch nicht Null zu servo2
cbi portb,servo1 ; Sonst Lösche Rampe für Servo1
;
rjmp i_raus

sbiw r29:r28,1
breq i_neu
rjmp i_raus

i_neu: ;Daten neu in Register und port servo1 umschalten
ldi r28,low(msmin)
ldi r29,high(msmin)
; mov r17,r15 ;Es ist adlar gesetzt, das ADCLH ist in r15
ldi r18,0
add r28,r15
adc r29,r18
;Und ADC-Wert gleich nochmal draufaddieren
; aber nur die Hälfte
clc ;Clear carry für anschliessende Division /2
ror r15 ;
add r28,r15
adc r29,r18
;
ldi r26,low(msges) ;Loopgrenzen für Gesamtloop 20 msec
ldi r27,high(msges)
sbi portb,servo1 ; Und setze Rampe für Servo1. FERTIG
;
i_raus:
reti ;=====----->>>>>
;
;================================================= ==================================
; Ende des Quellcodes
;================================================= ==================================


... Warum ein 100K-Poti? ...Das war das Einzige lineare, das hier rumlag.

thewulf00
08.10.2008, 20:43
Ah ok.

Die 2.Zeichnung ist ja der Hammer. Ich mach das alles nie so geplant, sondern löte i.d.R. spontan...

Da fällt mir ein: Am Freitag habe ich sowas ähnliches gebaut. Ich wollte den Drehencoder (quasi digitales Poti) ansteuern und hab den Wert des Encoders auf den Servo geschickt. (Also die Pulslänge ändere ich durchs Drehen)

Aber du sag mal: Seh ich das richtig, dass das einer dieser reduzierten Conrad-Mini-Digitalservos ist? Wenn ja, hast Du den auch mal ungehackt angesteuert? Meine Schaltung geht nur mit analogen, irgendein Trick fehlt mir noch...

oberallgeier
08.10.2008, 23:24
... 2.Zeichnung ... Ich ... löte i.d.R. spontan ...Ich bin ja noch etwas in den Anfängerschuhen - da muss man so etwas eben ein bisschen planen.


... Drehencoder ... Wert des Encoders auf den Servo geschickt ...Hmmm, verstehe ich das richtig? Du hast den Servo als Zeigerinstrument benutzt? Habe ich manchmal gemacht - mit meinen irDME´s oder mit meinem Sharp-GP2D120. Der Abstand (z.B. über ADC gemessen) wird so auf den Servo gegeben, dass der "Zeigerausschlag" mir Wert und Dynamik bringt (na ja, die Dynamik nur im Rahmen der Stellgeschwindigkeit des Servo).


... einer dieser reduzierten Conrad-Mini-Digitalservos ...Genau so einer ist das. Originalzustand. Der lässt sich einwandfrei mit dem gezeigten Servotester ansteuern, braucht aber reichlich Saft. Bei 6 .. 7V stelle ich die Strombegrenzung meist über 800 mA.

thewulf00
09.10.2008, 13:16
800mA - Omg.

Naja, dafür sehen aber Deine Schaltungen besser aus... :)

Naja, man kann es als Zeigerinstrument sehen, oder als Servotester. :p
Der große Conradservo macht das genau wie der kleine. Aber der digitale macht nicht mit. Dabei schicke ich bloß 20ms-Impulse mit 1-2ms High. Machst Du das ebenso?

oberallgeier
09.10.2008, 13:50
Ich hab das mal im Oskar angesehen. Unter 550/600mA habe ich in der Rampenform eindeutig Störungen - Spannungseinbrüche von 0,6 .. 0,8V in Peakform, die oberhalb von 650/700 mA verschwinden; jetzt wäre ein DSO gut.

Aktuell sendet mein Servotester Rampen mit etwa 0,82 bis 1,84 ms im 20 ms-Rhythmus bei linkem Anschlag (GUZ) bzw. rechtem Anschlag des Servo. Deine Fragen haben mir eine notwendige/sinnvolle/wünschenswerte Erweiterung suggeriert: RS232, mit der die aktuelle Rampendauer in ms ans Terminal geschickt wird *ggggg*. *Grübel*Einfall*HA* ich hab ja noch nen 2313 rumliegen, den ich nicht brauche. Und einen unbenutzten 16 MHz Quarz. Schreib ich mal auf meine Projekt-Warteliste (aktuelle Position 6 oder 7).

Ach so, ja: Schönheit ist nicht alles in der Welt, auch nicht in der Welt der Elektronik. Sie darf, aber sie muss nicht sein.

@Devil. Tut mir leid, dass wir so weit von Deinem Anliegen abglitten sind. Ich bin ja total OT.

thewulf00
09.10.2008, 14:29
Sein Anliegen wird wohl schon beantwortet sein :)

Bei meinem Drehencodertest hab ich ein LCD mit dran - zusammen mit Peter Fleurys Library. Aber ich kann nicht beides gleichzeitig benutzen. Keine Ahnung warum. Sobald ich das LCD aktualisieren lasse (nicht dauerhaft, nur ab und zu), geht meine Routine für den Encoder nimmer, dann nimmt er nur noch seeeehr langsam die Encoderänderungen entgegen. Aber ohne Quellcode wird wohl keiner eine Idee dazu haben, was? :D

Wie gesagt, wenn ich an den Encodertester/Servotester den digitalen Servo aus Deinem Bild anschließe, dann tut sich nichts. Nichts heißt GAR NICHTS.

oberallgeier
09.10.2008, 14:43
Hast Du nur einen von diesen digitalen Schnäppchen-Servos? Funktioniert/e der denn IRGENDWANN, IRGENDWIE ? Wenn nicht nur einen, was tun die Anderen?

thewulf00
09.10.2008, 14:57
Ja, es sind die gleichen Servos. Hab mehr einen als da, ich hab aber erstmal nur einen getestet. Ich drehe am Encoder und er zuckt sich garnicht. Ich denke nicht, dass es ein Hardwarefehler ist. Es sei denn, Orange ist hier nicht das Signal... :)

Wenn Du mal ein LCD oder RS232 dran hast, kannste mir ja mal die genauen oder ungefähren Pulslängen sagen, mit denen Du den digitalen zum Laufen bekommst.

Devil
09.10.2008, 15:25
Hi,

Hubert.G

welche der schaltungen meinst du? ich vermute die PWM-erzeuger.

Oberallgeier

sorry aber ich dachte an eine reine Hardware-Versoin da ich nicht die möglichkeit habe ICs zu beschreiben.

MfG Jan

Hubert.G
09.10.2008, 16:12
Genau, das mit PWM. Ich habe das mal testweise ausprobiert, der Potiweg gehört eventuell angepasst.
Diese Schaltung eignet sich auch sehr gut für PWM-Ansteuerung von Motoren.

oberallgeier
09.10.2008, 16:12
... LCD oder RS232 dran hast, kannste mir ja mal die genauen oder ungefähren Pulslängen ...Steht ja (im Prinzip) schon oben:
... Rampen mit etwa 0,82 bis 1,84 ms im 20 ms-Rhythmus ...... gemessen mit dem Oszilloskop. Das sollte aber so schon ausreichen *gggg*.

thewulf00
09.10.2008, 16:38
@Oberallgeier

Vielen Dank, ich werd das mal ausprobieren.