Go Down

Topic: Problem mit Interrupt für Motoransteuerung (Read 635 times) previous topic - next topic

Se11001

Hallo!

Ich bin derzeit dabei einen 24V Synchronmotor mittels 3 Phasen PWM anzusteuern, zur Spannungs- und Stromverstärkung verwende ich eine Platine mit 3 Halbbrücken mit dem IR2104.

Das funktioniert soweit ganz gut und ich habe testweise folgendes Programm geschrieben:

Code: [Select]
int n = 0;
int x = 0;
int r[16] = {64,88,109,123,128,123,109,88,64,40,19,5,0,5,19,40};   
int s[16] = {119,103,81,56,32,13,2,1,9,25,47,72,96,115,126,127};
int t[16] = {9,1,2,13,32,56,81,103,119,127,126,115,96,72,47,25};    //Diese drei Arrays enhalten die vorberechneten Sinusschwingungen, jeweils um 120° phasenverschoben.
int rpin = 10;
int spin = 11;
int tpin = 12;


void setup() {
  pinMode(rpin, OUTPUT);
  pinMode(spin, OUTPUT);
  pinMode(tpin, OUTPUT);
}

void loop() {   
if(x>=25)       //Ändere ich diesen Wert, so verändert sich die Drehzahl des Motors (kleiner => schneller, größer => langsamer)
{

  x=0;
  if(n>=16) n=0;
  analogWrite(rpin,1*(r[n]));
  analogWrite(spin,1*(s[n]));
  analogWrite(tpin,1*(t[n]));
  n=n+1;

}
  delay(1);
  x++;
}


Mit dem Programm läuft der Motor auch schon wunderbar, jedoch basiert es auf der Laufzeit eines Programmdurchlaufes, wodurch es nicht in ein vorhandenes Programm implenentiert werden kann. Daher habe ich versucht das ganze Programm mittels Interrupt neu zu schreiben, um von keinem Delay abhängig zu sein.

Dazu habe ich mir das "Timer1" Library heruntergeladen und folgendes Programm verfasst:
Code: [Select]
#include "TimerOne.h"
int ledpin=13;
int alle_x_millisekunden=100;
int x=0;
int y=0;
int rpin = 10;
int spin = 11;
int tpin = 12;
int r[16] = {64,88,109,123,128,123,109,88,64,40,19,5,0,5,19,40};
int s[16] = {119,103,81,56,32,13,2,1,9,25,47,72,96,115,126,127};
int t[16] = {9,1,2,13,32,56,81,103,119,127,126,115,96,72,47,25};
int periode=5;

void setup()   {
               pinMode(rpin, OUTPUT);
               pinMode(spin, OUTPUT);
               pinMode(tpin, OUTPUT);
               Timer1.initialize(alle_x_millisekunden*1000);
               Timer1.attachInterrupt(motor);
               }


void motor() {
               if(y>=periode)
               {
                  y=0;
                  if(x>=16) x=0;
                  analogWrite(rpin, r[x]);
                  analogWrite(spin, s[x]);
                  analogWrite(tpin, t[x]);
                  x++;
                 
               }
               y++;
               }

     

void loop()    {
                    // Später restlicher Programmcode
               }


Nur leider läuft damit der Motor nicht, sondern wird in der Ausgangspositoin festgehalten. Kann jemand den Fehler erkennen?


Gruß,
Se11001

Udo Klein

An welchem Timer hängen eigentlich Deine PWM Pins? Nicht etwa zufällig am Timer 1 den Du gerade anderweitig verwendest?
Check out my experiments http://blog.blinkenlight.net

uwefed

Ich nehme mal an Du hast einen Arduino UNO.

Pin 12 ist kein PWM Ausgang.
Pin 10 ist vom Timer 1 kontrolliert.
Deshalb funktioniert das nicht.
Grüße Uwe

http://www.arduino.cc/playground/Main/TimerPWMCheatsheet

Se11001


An welchem Timer hängen eigentlich Deine PWM Pins? Nicht etwa zufällig am Timer 1 den Du gerade anderweitig verwendest?

Das habe ich nicht bedacht und war auch der Fehler, Pin 11 und 12 hängen ja an Timer 1. Nachdem ich die Belegung auf die Pins 6,7,8 (also Timer4) geändert habe, funktioniert es nun wunderbar!


Ich nehme mal an Du hast einen Arduino UNO.

Nein, es ist ein Arduino Mega, hätte ich vorher erwähnen sollen. Mit dem ersten Programm lief es ja an den selben Pins.

Vielen dank für eure rasche Hilfe!


Gruß,
Se11001

Go Up