Hallo, ich hätte da ein kleines Problem. Ich will mit Hilfe eines Atmega 32 Digitale Servos ansteuern. Dazu habe ich diesen Quellcode verwendet. Nun habe ich das Problem, dass die Impulsdauer sich nicht großartig verändern lässt. Ich benötige ein 1-2ms langen Impuls (je nach position), innerhalb(nach ende) einer 20ms logischen 0. Selbst mit den Grenzen, die man im Quellcode einstellen kann, gelingt es mir nicht, diesen Impuls in diesem gewünschten Ausmass zu erzeugen. Ich hoffe, ihr könnt mir helfen. MFG Dominik Wiendl
Lol, ich habe vergessen, mitzuteilen, dass der Atmega32 auf 8Mhz läuft :)
188 - 205, 242: warum machst du die if-anweisung in den timer rein? das soll doch in die initialisierung. 211 - 220: die if-anweisung beeinflußt den jitter für alle pulse. so allgemein: wo setzt du die werte der io-pins? zeile 192/193/202 werden höchstens ein mal ausgeführt ... kannst du mal beschreiben, wie die pulserzeugung funktionieren soll?
@ dwiendl (Gast) >Dateianhang: code.c (7 KB, 8 Downloads) | formatierter Code Und damit soll man WIRKLICH 20 Servos ansteurn können? Und du willst mal gleich 32 ansteuern? Der Code ist ziemlich aufgebläht und ohne Pfiff. Das geht deutlich besser, siehe Soft-PWM. In einer ISR ein Bubblesort? Häää? Da hast du wohl den Code ziemlich verunstaltet, oder? Ich behaupte mal, das man mit nem cleveren Trick 10 Servos ansteuern kann, dann 10x2ms = 20ms, mit zwei Output Compare Funktionen vielleicht 20. Dann wirds aber langsam eng. MFG Falk
nein, lol ich will 17 servos mit dem Atmega32 ansteuern. Das programm geht ja,nur bekomm ich einen Impuls, der 17-27 ms ist (je nach Position).Ich will nur, dass er von 10-20ms geht :(
Mir ist schon klar, dass der Quellcode nicht 1A ist, sonst würde ich ja selber klarkommen. Meine Frage ist einfach, wie muss ich den Timer, den Interrupt, und die sonstigen Werte verändern, um meinn Impuls zu bekommen. Über eine Antwort wäre ich dankbar.
@dwiendl (Gast) >Interrupt, und die sonstigen Werte verändern, um meinn Impuls zu >bekommen. Poste mal den UNVERÄNDERTEN Originalquelltext. MFG Falk
Das ist der Quellcode. Ich habe nur oben im Define geändert.
Wenn dein Prozessor wirklich mit 8MHz läuft, müsste das Timing eigentlich stimmen. Der Code, so wie er angehängt ist, kompiliert übrigens nicht fehlerfrei, kann also nicht genau der sein, der bei dir läuft. Oliver
Ich wünschte, diese Unsitte
1 | TCCR1B = 0b00001011; /* timer = 0 bei compare A prescalar 1 00001010 */ |
2 | TIMSK = 0b00010000; /* interrupt bei compare A*/ |
würde sich mal aufhören. Schnapp dir das Datenblatt zum M8 und zum M32 und vergleich mal, ob dort die gleichen Vorteiler eingestellt sind. Ansonsten sind diese defines
1 | define carsm_min 0x0050 /*absolut min 0x0050 carson mini 620 uS*/ |
2 | define carsm_max 0x0130 /*absolut max 0x0130 carson mini 2360 uS*/ |
für die maximalen und minimalen Pulslängen zuständig. Deine Servopositionen werden als Wert von 0 bis 255 angegeben. 0 ist die eine Extremstellung, 255 die andere. PS: Du hast hoffentlich den Compiler optmieren lassen? Damit da nicht zuviel Jitter in die Servopositionen kommt, ist es wichtig, dass dieser Programmteil möglichst schnell abläuft
1 | count =0; |
2 | while (servo_abs[count].nr != 0xff) |
3 | { while (TCNT1 < (servo_abs[count].pos+servo_abs[count].start)) |
4 | { ; |
5 | }
|
6 | DPinReset(servo_gen[servo_abs[count].nr].adr ,servo_gen[servo_abs[count].nr].pin); |
7 | count++; |
8 | }
|
stimmt, lol beim Rauskopieren fehlen die # vor den defines! Danke :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.