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