Motor Funktion für Schrittmotor in Atmel Studio

OP #5718071
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
Gast #5718133
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);
OP #5718177
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
//
Gast #5718265
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.
Gast #5718483
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;
}
OP #5720615
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.