PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SD20 arbeitet nicht richtig? Woran kann es liegen?



klucky
01.02.2006, 10:39
Hallo!

Ich habe mir vor einiger Zeit einen SD20 gekauft und habe jetzt nach langem rumprobieren endlich zumindistens kleinere Ergebnisse. Leider Funktioniert noch nicht alles zu meiner vollen Zufriedenheit und ich kann mir auch nicht unbedingt erklären woran es noch liegen könnte ... desswegen hoffe ich auf eure Hilfe! Zuerstmal ein paar Worte zur Hardware: Ich verwende zum ansteuern des SD20 (4Mherz durch Quarz) einen Atmega32 (16Mherz durch Quarz) den ich über I2C (Pullup an beiden Leitungen 10k) mit dem SD20 (Pin22 (SCL) vom Atmega an Pin14 (SLC) vom SD20 und Pin23 (SDA) vom Atmega an Pin15 (SDA) vom SD20. Als Servos habe ich zum einen einen S3003 von Robbe der im Normalen Modus gerade mal einen Stellbereich von ca 60 Grad schafft ... im Erweiterten Modus schaffe ich es dann sogar auf einen Stellbereich von 180 Grad allerdings kommt mir der Impuls mit einem Bereich von 0,299ms - 2,040ms (Reg22=1, Reg23=255, Reg21=32) ein wenig komisch vor da die Spezifikationen für Servos ja eigentlich einen Bereich von 1ms-2ms vorsehen und ich gedacht hätte das diese Werte zumindist ansatzweise eingehalten werden. Und zum anderen habe ich mir zum Testen einen 5€ Servo von Conrad gekauft, der überhaupt nicht zu meiner Zufriedenheit arbeitet. Im Normalen Modus bekommt man zwar Ausschläge die in etwa so Liegen wie die von dem S3003 aber spätetens nach dem dritten Ausschlag ist Schluss und der Servo bleibt in einer position stehen. Wenn ich dann den Servo abziehe und den S3003 dranklemme bleibt dieser auch bloß in der einen Position stehen, nach einem Reset (Accu abnehmen und wieder dran machen) läuft der S3003 dann aber wieder so wie er soll.

Hier einmal der Programmcode den ich für den erweiterten Modus beim S3003 benutze:



#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <twimaster.c>

#define SD20_W 0xC2 /*SD20 Adresse mit Schreibbit*/
#define SD20_R 0xC3 /*SD20 Adresse mit Lesebit*/

void delay(unsigned long us)
{
while ( us ) { us--; } /* 6 cpu cycles per loop */
}

int main(void)
{
delay(1000000); /*Warten dass der SD20 bereit ist*/
i2c_init();
i2c_start(SD20_W);
i2c_write(22);
i2c_write(1);
i2c_stop();

i2c_init();
i2c_start(SD20_W);
i2c_write(23);
i2c_write(255);
i2c_stop();

i2c_init();
i2c_start(SD20_W);
i2c_write(21);
i2c_write(32);
i2c_stop();

while(1)
{
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(1);
i2c_stop();

delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(128);
i2c_stop();

delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(255);
i2c_stop();

delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(127);
i2c_stop();
}
}


Und hier der Programmcode den ich bei beiden Servos für den Normalen Modus benutze:



#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <twimaster.c>

#define SD20_W 0xC2 /*SD20 Adresse mit Schreibbit*/
#define SD20_R 0xC3 /*SD20 Adresse mit Lesebit*/

void delay(unsigned long us)
{
while ( us ) { us--; } /* 6 cpu cycles per loop */
}

int main(void)
{
delay(1000000); /*Warten dass der SD20 bereit ist*/
i2c_init();
i2c_start(SD20_W);
i2c_write(21);
i2c_write(0);
i2c_stop();

while(1)
{
delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(1);
i2c_stop();

delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(128);
i2c_stop();

delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(255);
i2c_stop();

delay(1000000);
i2c_init();
i2c_start(SD20_W);
i2c_write(1);
i2c_write(127);
i2c_stop();
}
}


Ich hoffe Ihr könnt mir mit den Informationen die ich euch gegeben habe helfen ansonsten könnte ich am Wochenende nochmal ein Foto von der Platine reinstellen damit ihr euch die auch nochmal angucken könnt.

MFG Klucky

PS: Ich hab das Thema mal hier rein geschrieben weil es aus meiner Sicht bei den anderen Topics nicht wirklich reinpasst weil es ja net nur um C, Avr, oder Pic geht sondern eigentlich nen bisschen von allem ist ... ;)

PPS: Das gleiche Thema habe ich auch hier (http://www.roboter-teile.de/modules.php?name=Forums&file=viewtopic&p=460#460) gepostet wenn ihr wollt könnt ihr ja dort auch einmal reinschaun ...

klucky
02.02.2006, 18:01
Ist denn wirklich keiner da der mir helfen kann? :(

stegr
02.02.2006, 19:19
Das einzige, was mir grade aufgefallen ist:
Im Datenblatt vom SD20 steht überall: 8MHz mittels Keramikresonator
Du hast nen 4MHz Quarz. Das dürfte eigentlich nicht klappen... ;)
Wichtig sind sowohl die 8MHz, als auch die Art des Resonators (Keramikres.), da das im PIC eingestellt sein muss (wie bei den AVRs auch).

Ansonsten kenn ich mit dem SD20 nicht aus (hab keinen), kann dir da also nicht so sehr weiterhelfen.

MfG
Stefan

klucky
03.02.2006, 16:48
Mhh dann muss ich nochmal nachgucken ob ich wirklich nen 4Mherz quarz eingesetzt oder mich nur vertippt habe ... ansonsten steht im Datenblatt "optional kondensator wenn quarz statt resonator verwendet wird" muss ich dann auch im pic einstellen das ich nen quarz verwende ... dann hätt ich warscheinlich schon das problem ... dann müsst ich einmal nen keramik resonator kaufen und einbauen ...

Andre_S
03.02.2006, 20:14
Hallo,

also 8Mhz wäre schon notwendig, aber der Quarz, vorausgesetzt mit entprechenden Kondensatoren gegen Masse geht natürlich auch.
Das die Spezifikation Servo zw. 1 und 2ms liegt ist richtig, der läuft aber dann im Standart auch wirklich keine 180°, Du musst Dich da also nicht so sehr wundern, meine Bereiche sind bei 180° auch viel größer.
So richtig habe ich es nicht verstanden mit dem 5 Euro Servo und dem S3003 beim ab und anstecken. Ich kann also dazu nur beitragen, dass ich auch unter anderem 3 Billigservos nutze und ich habe keine Probleme damit.


Gruß André

vklaffehn
03.02.2006, 20:54
Hallo,

ich habe auch schon mit dem SD20 gekämpft, bei mir war allerdings ein 8Mhz Keramikresonator dabei. Werden der Controller und die Servos über eine gemeinsame Spannung versorgt? Die Servos sollten auf alle Fälle eine eigene Stromversorgung bekommen, das hat bei mir extrem geholfen.

Volker

klucky
03.02.2006, 22:25
Joar bei mir war auch einer drauf nur hab ich den auf einer anderen platine für den sd20 verlötet ... das mit dem quarz werd ich nochmal nachgucken nicht das ich mich da vertan hab ... und ansonsten ist das mit der stromversorgung von den servos nen guter tipp den ich auch nochmal probieren werde ... thx ... mal schaun ob das hilft ;)

klucky
09.02.2006, 20:35
Hallo! Es lag daran dass die Servos mit den Controllern an der selben Stromversorgung hingen ... hab es jetzt zum probieren erstmal mit einem 2. Accu und einem 2. 7805 gelöst ... allerdings wollt ich auf meinem Roboter nicht so gerne 2 Accus haben gibt es da irgendeine Möglichkeit mit der man beides an einem Accu zum laufen bekommt?

stegr
09.02.2006, 23:27
Entstören - ne Drossel (Spule - einige zig µH) in den Zuleitungszweig zum 7805 für den sd20 hängen.

Oder du bekämpfst das Problem gleich dort, wo es auftritt - an den Motoren: https://www.roboternetz.de/wissen/index.php/Getriebemotoren_Ansteuerung#Und_nie_vergessen_Moto ren_zu_entst.C3.B6ren

MfG
Stefan

klucky
11.02.2006, 02:50
Mhh also das mit dem Motor entstören hilft mir nicht wirklich weiter weil ich die schaltung mit nem Servo nicht nachbauen kann weil ich da nur 2 Kabel hab die für die Stromversorgung verantwortlich sind ... wenn ich jetzt 2 7805 nehme verbrauchen die dann mehr Strom als wenn ich das ganze mit einem 7805 versorge ... ich bin nicht so wirklich der elektronik freak desswegen bin ich für jede hilfe dankbar ... wenn ich so eine Spule in denn Zuleitungszweig hänge muss die dann nur auf + oder auch auf ground? Und wie groß sollte die sein einige zig hilft mir mit meinen kenntnissen nicht wirklich weiter ;)