Forum: Mikrocontroller und Digitale Elektronik Probleme mit Impuls (Seroansteuerung)


von dwiendl (Gast)


Angehängte Dateien:

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

von dwiendl (Gast)


Lesenswert?

Lol, ich habe vergessen, mitzuteilen, dass der Atmega32 auf 8Mhz läuft 
:)

von zwieblum (Gast)


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?

von Falk B. (falk)


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

von dwiendl (Gast)


Lesenswert?

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 :(

von dwiendl (Gast)


Lesenswert?

sorry von 1-2 ms mein ich.(und 1,7-2,7 ms ist es aktuell)

von dwiendl (Gast)


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.

von Falk B. (falk)


Lesenswert?

@dwiendl (Gast)

>Interrupt, und die sonstigen Werte verändern, um meinn Impuls zu
>bekommen.

Poste mal den UNVERÄNDERTEN Originalquelltext.

MFG
Falk

von dwiendl (Gast)


Lesenswert?

Das ist der Quellcode. Ich habe nur oben im Define geändert.

von dwiendl (Gast)


Lesenswert?

Wäre echt cool, wenn ihr mir helfen könnt

von Oliver (Gast)


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

von Karl H. (kbuchegg)


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
    }

von dwiendl (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.