Probleme mit Impuls (Seroansteuerung)

Gast #1212624
Lesenswert?

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
Angehängte Dateien:
Gast #1212646
Lesenswert?

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?
#1212991
Lesenswert?

@  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
Gast #1213212
Lesenswert?

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.
Gast #1214095
Lesenswert?

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
#1214148
Lesenswert?

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
    }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren