Forum: Mikrocontroller und Digitale Elektronik Motor Funktion für Schrittmotor in Atmel Studio


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Fabio M. (fabiom)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo,

Ich möchte eine Motorfunktion in Atmel Studio programmieren um einen 
DRV8825 mit angeschlossen Schrittmotor drehen zu lassen. So könnte sie 
aussehen: motor(255); Als Board benutze ich den Arduino MEGA 2560. 
Später möchte ich 4 oder noch mehr Motoren steuern.

Das Problem auf das ich gestoßen bin ist, dass ich kein PWM an dem STEP 
Pin bekommen habe. Er blieb immer LOW. Ich habe auch schon sehr lange 
recherchiert, bin aber leider nicht schlauer geworden. Das Grundprinzip 
ist, dass ich das zugehörige OCR1A Register oder ein anderes Register 
auf den Wert des Argumentes der Motorfunktion zu setzen. Bitte helft 
mir.

Viele Grüße,
Fabio

von Jörg B. (jbernau)


Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber ob des Scheefalls kann ich Deinen Monitor nicht lesen. Wir 
müssen wohl auf den Frühling warten ;-)

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Fabio M. schrieb:
> Er blieb immer LOW. Ich habe auch schon sehr lange
> recherchiert, bin aber leider nicht schlauer geworden.

Bist du sicher, dass er LOW war. Vielleicht war er einfach nur 
hochohmig, weil du ihn nicht als Ausgang konfiguriert hast.

von Malte (Gast)


Bewertung
0 lesenswert
nicht lesenswert
@ Fabio

Swing Low, Sweet Chariot

von Fabio M. (fabiom)


Bewertung
-1 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Fabio M. schrieb:
>> Er blieb immer LOW. Ich habe auch schon sehr lange
>> recherchiert, bin aber leider nicht schlauer geworden.
>
> Bist du sicher, dass er LOW war. Vielleicht war er einfach nur
> hochohmig, weil du ihn nicht als Ausgang konfiguriert hast.

Das könnte auch sein.

Am besten gebt ihr mir ein Beispiel für ein PWM Signal :)

von Stefan ⛄ F. (stefanus)


Bewertung
3 lesenswert
nicht lesenswert
Fabio M. schrieb:
> Am besten gebt ihr mir ein Beispiel für ein PWM Signal :)

Nein , bestens zeigst du mal vor, waß du da gebaut, programmiert und 
gemessen hast.

Denn Tutorials für PWM gibt es massenweise im Internet, doch mit denen 
kommst du scheinbar nicht klar. Bei Arduino brauchst du nur ein einziges 
Kommando, um eine PWM zu erzeugen: analogWrite(pin,wert);

von Fabio M. (fabiom)


Bewertung
0 lesenswert
nicht lesenswert
Ich benutze aber kein Arduino, sondern Atmel Studio. Meine Code Versuche 
sind diese: Ich habe sie in allen Variantionen getestet, da ich so 
verzweifelt war.
1
    DDRG |= (1 << PG5);
2
  DDRA |= (1 << PA7);
3
  
4
  //TCCR0B = (1 << FOC0B) | (1 << ) (1 << CS02) | (1 << CS00);
5
  TCCR0B = 0b11001101;
6
  
7
  OCR0B = 127;
8
  
9
  //TCCR1A &= ~(1 << CS00) | (1 << CS01) | (1 << CS02);
10
  //TCCR1A |= (1 << CS02) | (1 << CS01) | (1 << CS00);
11
  
12
  //OCR1A = 100;
13
//     while (1)  
14
//     {
15
//     //OCR1A = 100;
16
//     for (int i = 0; i < 1500; i++)
17
//     {
18
//       PORTB |= (1 << PB5);
19
//       _delay_ms(1);
20
//       PORTB &= ~(1 << PB5);
21
//       _delay_ms(1);
22
//     }
23
//     PORTA ^= (1 << PA7);
24
//

von karadur (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Kann mir mal einer sagen wo der Zusammenhang zwischen PWM und 
Schrittmotor ist?  Der DRV8825 regelt den Strom für die Motorwicklungen 
mit PWM aber hat Eingänge für Step und Direction.

Da scheint einges durcheinander.

von Jörg B. (jbernau)


Bewertung
0 lesenswert
nicht lesenswert
Ich hatte auch mal ein PWM Problem... Lösung war die while-Schleife in 
Main, die hatte ich vergessen... => Main wurde verlassen

VG Jörg

von Jörg B. (jbernau)


Bewertung
0 lesenswert
nicht lesenswert
karadur schrieb:
> Da scheint einges durcheinander.

Stimmt. aber die OCRxx sind doch auch für die Timer zuständig; die 
Impulsweite ist egal. Ich denke er nutzt Fast PWM um sich nicht um das 
Setzen der Ausgänge kümmern zu müssen.

von Fabio M. (fabiom)


Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht welche PWM Art ich benutzen soll. Das PWM Siganl soll an 
den STEP Pin weitergeleitet wird, um die Geschwindigkeit anzupassen.

von Jörg B. (jbernau)


Bewertung
0 lesenswert
nicht lesenswert
Fabio M. schrieb:
> Ich weiß nicht welche PWM Art ich benutzen soll.

Dann nimm bitte Arduino. Da kannst Du bei Deinem Wissensstand fertige 
Libs nehmen. Ansonsten setze Dich bitte mit dem Datenblatt des µC 
auseinander und schau Dir die Register bei den Timern an. Wenn Du das 
nicht verstehst, dann stelle bitte dahingehend zielgerichtete Fragen.

VG Jörg

von Fabio M. (fabiom)


Bewertung
0 lesenswert
nicht lesenswert
Eigentlich kenne ich mich schon im Datenblatt aus. Aber an genau diesem 
Problem komme ich einfach nicht weiter.

von m.n. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Zwar für ATmega328, sollte aber auch auf anderen Typen lauffähig sein: 
http://mino-elektronik.de/Generator/takte_impulse.htm#bsp7
Du mußt vermutlich nur STEP und DIR verwenden.

von Fabio M. (fabiom)


Bewertung
0 lesenswert
nicht lesenswert
Dankeschön. Ich schaue mir es mal an. Bei weiteren Probleme melde ich 
mich.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Ich sehe keinen Sinn darin, den STEP Anschluss mit einem PWM Signal 
anzusteuern. Was du brauchst sind mehr oder weniger Impulse pro Sekunde 
- aber schön passend zum Motor.

Also finde erstmal heraus, was du brauchst. Dann kann man schauen, wie 
das mit dem Timer umsetzbar ist.

von karadur (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nur zum Üben:

Deklarieren: Step,Dir,maxschritte;
Du brauchst 2 Pins für den Motorcontroller.



Dir = vorwärts;
for(anzahlschritte=0;maxschritte;anzahlschritte++)
{
Delay1000msec;
Step=1;
Delay1000msec;
Step=0;
}

von Fabio M. (fabiom)


Bewertung
0 lesenswert
nicht lesenswert
Hallo, dank eurer Hilfe habe ich jetzt eine Motor Funktion, die soweit 
funktioniert. Wenn es noch Verbesserungsvorschläge gibt, dann sagt mir 
diese bitte.

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdlib.h>
4
5
int16_t getSpeed(int16_t speed) {
6
  int16_t result = abs((speed - 256) * -1);
7
  
8
  if (result < 45)
9
    result = 45;
10
  
11
  if (speed == 0)
12
    result = 0;
13
  
14
  return result;
15
}
16
17
void motorInit() {
18
  DDRL |= (1<<PL6);
19
  DDRB |= (1 << PB7);
20
  
21
  TCCR0A = (1<<WGM01);  //Timer 0 in CTC Modus
22
  TCCR0B |= (1 << CS01);  //Prescaler 8
23
  OCR0A = 0;
24
25
  TIMSK0 |= (1<<OCIE0A);  //Enable Compare Interrupt
26
  sei();          //Enable gloabel interrupts
27
}
28
29
void motor(int16_t speed) {
30
  OCR0A = getSpeed(speed);
31
  
32
  if (speed == 0)
33
  {
34
    //Enable pin low
35
  } else if(speed < 0) {
36
    //Enable pin high
37
    //Directon pin to low
38
  } else {
39
    //Enable pin high
40
    //Direction pin to high
41
  }
42
}
43
44
int main(void)
45
{
46
  motorInit();
47
  motor(255);
48
  
49
  while (1);
50
}
51
52
ISR (TIMER0_COMPA_vect) {
53
  PORTB ^= (1 << PB7);
54
}

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]
  • [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.