www.mikrocontroller.net

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


Autor: dwiendl (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: dwiendl (Gast)
Datum:

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

Autor: zwieblum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dwiendl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :(

Autor: dwiendl (Gast)
Datum:

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

Autor: dwiendl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@dwiendl (Gast)

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

Poste mal den UNVERÄNDERTEN Originalquelltext.

MFG
Falk

Autor: dwiendl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist der Quellcode. Ich habe nur oben im Define geändert.

Autor: dwiendl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre echt cool, wenn ihr mir helfen könnt

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich wünschte, diese Unsitte
  TCCR1B = 0b00001011;   /* timer = 0 bei compare A prescalar 1 00001010 */
  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
define carsm_min 0x0050 /*absolut min 0x0050 carson mini 620 uS*/
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
    count =0;
    while (servo_abs[count].nr != 0xff)
    {  while (TCNT1 < (servo_abs[count].pos+servo_abs[count].start))
      {  ;
      }
      DPinReset(servo_gen[servo_abs[count].nr].adr  ,servo_gen[servo_abs[count].nr].pin);
      count++;
    }

Autor: dwiendl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt, lol beim Rauskopieren fehlen die # vor den defines!

Danke :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.