Forum: Mikrocontroller und Digitale Elektronik Motoransteuerung AtMega128


von Dave P. (dave01)


Lesenswert?

Nabend,

ich benutze einen AtMega128 und möchte damit einen Motor ansteuern.
Die Ansteuerung des Motors durch ein PWM habe ich auch hinbekommen und 
funktioniert auch tadellos.
Nun möchte ich per externe Taster die Geschwindigkeit senken, oder 
erhöhen.
Die Tasteransteuerung funktioniert auch einwandfrei. Nun aber mein 
Problem.
Das PWM-Signal wechselt nur zwischen 1ms und 2ms. Also nur an den 
Maxima.

Hier mal mein Programmcode, vielleicht seht ihr ja meinen Fehler, ich 
jedenfalls sehe da nicht mehr viel :D

Zur Erklärung:

MOTOR_INK, MOTOR_DEK, MOTOR_RES, MOTOR_SET : Tasten
TASTE_PIN : PIN der Tasten
Motor_POS : Zählvariabel zum Verändern der Flanke
Motor: Übergabewert für COMP

Intervalle:
Motor = 1000 : 1ms
Motor = 15000: 2ms
Motor = 8000 : 1,5ms
1
if ((TASTE_PIN & (1<<MOTOR_INK)) != 0)
2
{
3
  if (Motor_POS <= 15000)
4
  {
5
     Motor_POS++;      
6
  }
7
  else
8
    Motor_POS = 15000;
9
 }  
10
if ((TASTE_PIN & (1<<MOTOR_DEK)) != 0)
11
{
12
    if (Motor_POS >= 1000)
13
  {  
14
    Motor_POS--;      
15
  }
16
  else
17
    Motor_POS = 1000;
18
} 
19
20
if ((TASTE_PIN & (1<<MOTOR_RES)) != 0)
21
  Motor = 8000;
22
23
if ((TASTE_PIN & (1<<MOTOR_SET)) != 0)
24
  Motor = Motor_POS;

von Spess53 (Gast)


Lesenswert?

Hi

>if ((TASTE_PIN & (1<<MOTOR_INK)) != 0)
>{
>  if (Motor_POS <= 15000)
>  {
>     Motor_POS++;
>  }
>  else
>    Motor_POS = 15000;
> }

Und was meins du, wie schnell das durch ist?

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Dave Pr schrieb:

> Das PWM-Signal wechselt nur zwischen 1ms und 2ms. Also nur an den
> Maxima.
>
> Hier mal mein Programmcode, vielleicht seht ihr ja meinen Fehler, ich
> jedenfalls sehe da nicht mehr viel :D

Und der Code ist von der Standard-Hauptschleife
1
  ...
2
3
  while( 1 )
4
  {
5
6
     ....
7
     dein Code
8
     ....
9
  }
10
}

umrahmt?

Wenn: ja.

Was denkst du: Wieviele Durchläufe durch diese Schleife wird wohl dein 
µC in, sagen wir mal, einer Zehntel Sekunde schaffen. Eine Zehntel 
Sekunde deshalb, weil du es kaum schaffen wirst, deine Tasten kürzer zu 
als eine Zehntel Sekunde gedrückt zu halten.

Also: Was denkst du - wie oft?
50-tausend mal, 100-tausend mal?

irgendwo da dazwischen wird wohl die Lösung liegen.
Du siehst also nur deswegen die PWM an jeweils den Grenzwerten, weil das 
Hoch- bzw. Runterzählen so schnell geht (bei jedem Durchlauf um 1 
erhöhen bzw. verringern), dass du als langsamer Mensch überhaupt keine 
Chance hast, da in Einzelschritten die PWM hochzuzählen. So schnell 
kannst du eine Taste gar nicht drücken und wieder loslassen, dass dein 
µC das nur ein einziges mal innerhalb der while Schleife auswerten und 
als 'Taste gedrückt' werten würde.

Du musst unterscheiden zwischen:
* Tu etwas, SOLANGE eine Taste gedrückt ist
* Tu etwas, wenn eine Taste niedergedrückt WURDE

Das zweite beinhaltet, dass die Taste zwischendurch auch wieder 
losgelassen werden muss, ehe dann das nächste mal eine gedrückte Taste 
eine Aktion auslöst. #Eine# Aktion - und nur Eine.

von Modellbauer (Gast)


Lesenswert?

Ist der "Motor" zufällig ein Modellbauservo oder warum so markante 
Zeiten wie 1, 1.5 oder 2 ms?

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.