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
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.
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
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
definecarsm_min0x0050/*absolut min 0x0050 carson mini 620 uS*/
2
definecarsm_max0x0130/*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