Go Down

Topic: Synchronus Motor via PWM and Interrupt (Read 502 times) previous topic - next topic

Se11001

Nov 13, 2012, 02:36 am Last Edit: Nov 13, 2012, 02:40 am by Se11001 Reason: 1
Hello!

I am currently trying to operate a 3~ 24V Synchronus motor via PWM. For that, I have a print with 3 half - bridges with the IR2104 controller on it, what works very well with the motor if you send a 3 phase 0-5V PWM.

To test the motor, I've written the following program:
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};    //These 3 arrays contain the previously calculated 3~ PWM, from 0 to 128.
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)       //Changing that variable makes the frequency (and motor rpm) go up or down.
{

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

}
 delay(1);
 x++;
}


In principle that works well, but because that program works with delay I can't combine it with other programs. So I wanted to write a program which uses a timer interrupt, so I downloaded the library "Timer1" and wrote a new one:

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()    {
                   // Main program
              }


Unfortunately, it dosen't work that way and the motor is frozen in one position. However, if I set one output pin to 13 and wath the LED, it looks like a sinus :?

Can anyone help me?
(Please excuse my not so good English)


Greets,
Se11001

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy