Pages: [1]   Go Down
Author Topic: Problem mit Interrupt für Motoransteuerung  (Read 627 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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:
#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
Logged

0
Offline Offline
Faraday Member
**
Karma: 24
Posts: 3501
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Check out my experiments http://blog.blinkenlight.net

Forum Moderator
BZ (I)
Online Online
Brattain Member
*****
Karma: 272
Posts: 21939
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: