Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 22:58558001804d
- Parent:
- 21:b831f68ce5ed
- Child:
- 24:ebaced951bbd
--- a/main.cpp Thu Apr 18 08:15:22 2019 +0000
+++ b/main.cpp Tue May 21 11:56:25 2019 +0000
@@ -1,5 +1,6 @@
#include "mbed.h"
#include "QEI.h"
+#include "TextLCD.h"
/* Code written by Simon Truelove (completed 5/4/2019) to control Switched Reluctance Motor (SRM) modified from a
QSH6018-65-28-210 stepper motor. The position of the motor is monitored using a rotary encoder 102-1307-ND using QEI.h.
@@ -8,8 +9,10 @@
on in sequence then it will complete 2 revolutions to find the encoder index and set StateA which is used for calculating
StateB. StateB controls 4 identical state machines, however state B is calculated slightly differently within each one
depending on the direction of rotation required and the direction the motor had turned previously. LED's are switched on and
-off and these LED's control which of the 4 state machines is used.
-"Its flow"
+off and these LED's control which of the 4 state machines is used. When the motor is running the rpm is calculated every rotation
+and then the PWM duty is adjusted until the desired rpm is achieved. The rpm is also used to change the phase advance and the PWM gain
+so that it runs with the optimum setting at any speed and the changes in PWM duty give a smooth change in speed. The temperature
+of the thrmocouple is measured every 0.6 seconds and will stop the motor if the temperature exceeds 80C.
*/
void Initialisation (void); //These function prototypes are written after the main. They must be listed here too
@@ -27,10 +30,12 @@
void RPM (void);
void VelocityLoop (void);
void ReadKType(void);
+void Switch (void);
Serial pc(USBTX, USBRX); // tx, rx - set up the Terraterm input from mbed
QEI wheel(p5, p6, p8, 800, QEI::X4_ENCODING); //code for quadrature encoder see QEI.h
+TextLCD lcd(p9, p10, p16, p17, p18, p19, TextLCD::LCD16x2);
Timer t; //timer used in RPM
@@ -38,16 +43,21 @@
DigitalOut led2 (LED2);
DigitalOut led3 (LED3);
DigitalOut led4 (LED4);
+DigitalIn anticlockwise (p11);
DigitalOut SerialClock (p12); //ReadKType SPI
DigitalIn DOut (p13); //ReadKType SPI
DigitalOut cs1 (p14); //Chip Select SPI
+DigitalIn clockwise (p15);
+
+AnalogIn pot (p20); //Potentiometer for adjusting speed SetPoint
DigitalOut UnUsedPhase1 (p21);
-PwmOut Phase1 (p22); //Pin set up - PWM to enable speed control
-PwmOut Phase2 (p23);
-PwmOut Phase3 (p24);
-PwmOut Phase4 (p25);
-DigitalOut UnUsedPhase2 (p26);
+DigitalOut UnUsedPhase2 (p22);
+PwmOut Phase1 (p23);
+PwmOut Phase2 (p24); //Pin set up - PWM to enable speed control
+PwmOut Phase3 (p25);
+PwmOut Phase4 (p26);
+int SetPoint = 1500; //for adjusting the speed
int StateA = 0; //State for first 2 revolutions (calibration of the index)
int StateB = 0; //All state machines after calibration use this state
int AdjCW = 57; //CW offset to adjust phase firing to give the fastest speed = used to calculate stateB
@@ -55,22 +65,24 @@
int CW = 57; //Value used to start motor from stationary
int ACW = 12; //Value used to start motor from stationary
int TimePerClick = 0; //for calc of RPM
-int SetPoint = 1500; //for adjusting the speed
int enc = 3200; //800 x4 enc = 3200 Pulses Per Rev
int s = enc/50; //s=number of cases in state machine (64)
int T = 80; //Thermostat protection limit degrees centigrade
int z = 3200; //TimePerRev = TimePerClick * (3200/z); 3200 pulses per rev, PulseCount2_==3200 for wheel.getwhoop_ flag. i.e. 1 points per reoluition for RPM calc. //Motor temp limit
int slowloop = 0; //Counter used to read temp at a slower rate
+int start = 28;
+int adj = 25-start;
char c; //keyboard cotrol GetChar
+float SetPointBuffer = 0; //Used in calculation to convert potentiometer value to SetPoint value. Used due to changing between int and float.
float rps = 0; //for calc of RPM
float rpm = 0; //for calc of RPM
-float duty = 1;
+float duty = 0.5; //PWM duty
float diff = 0.0; //Velocity loop: diff = SetPoint - rpm;
-float gain = 0.0001; //Velocity loop
+float gain = 0.0001; //Velocity loop
float p = 0.000014; //PWM period
-float x=0.1; //Used in StepACW x=time of square wave when 1 phase energised,
+float x=0.3; //Used in StepACW x=time of square wave when 1 phase energised,
float TimePerRev = 0; //for calc of RPM
float y=0.04; //Used in Step ACWy=time of square wave when 2 phases energised
float temp = 0; //ReadKType
@@ -78,22 +90,28 @@
int main(void)
{
pc.baud(921600); //Set fastest baud rate
- Phase1.period(p); //period of 0.000002 = 2 microseconds (500kHz). Good balance of low and high speed performance.
+ Phase1.period(p); //period of 0.000014 = 14 microseconds (500kHz). Good balance of low and high speed performance.
Phase2.period(p);
Phase3.period(p);
Phase4.period(p);
+ lcd.cls();
+ wait(2);
+ lcd.printf(" Switched\n");
+ lcd.locate(0,1);
+ lcd.printf("Reluctance Motor\n");
+ t.start(); //start timer for rpm calculation
+ SerialClock = 0; //reset serial clock for Themocouple
+ StepACW();
wait(0.1);
- t.start();
- SerialClock = 0;
- StepACW();
- Initialisation();
-
- while(wheel.getRevolutions()<2) //Index Calibration
+ //duty=1; //Makes sure the motor starts from the same position each time
+ Initialisation(); //reset everything
+
+ while(wheel.getRevolutions()<4) //Index Calibration
{
- StateA = (wheel.getPulses()+25)%s;
+ StateA = (wheel.getPulses()+start)%s;
switch(StateA)
{
- case 0:Ph1();break;
+ case 0:Ph1();pc.printf("1 %i\n\r", wheel.getPulses());break;
case 1:Ph1();break;
case 2:Ph1();break;
case 3:Ph1();break;
@@ -109,7 +127,7 @@
case 13:Ph1();break;
case 14:Ph1();break;
case 15:Ph1();break;
- case 16:Ph2();break;
+ case 16:Ph2();pc.printf("2 %i\n\r", wheel.getPulses());break;
case 17:Ph2();break;
case 18:Ph2();break;
case 19:Ph2();break;
@@ -126,7 +144,7 @@
case 30:Ph2();break;
case 31:Ph2();break;
case 32:Ph3();break;
- case 33:Ph3();break;
+ case 33:Ph3();pc.printf("3 %i\n\r", wheel.getPulses());break;
case 34:Ph3();break;
case 35:Ph3();break;
case 36:Ph3();break;
@@ -141,7 +159,7 @@
case 45:Ph3();break;
case 46:Ph3();break;
case 47:Ph3();break;
- case 48:Ph4();break;
+ case 48:Ph4();pc.printf("4 %i\n\r", wheel.getPulses());break;
case 49:Ph4();break;
case 50:Ph4();break;
case 51:Ph4();break;
@@ -161,38 +179,50 @@
}
if(wheel.getYay()==1) //PulseCount_==1, yay_=1 used to increment the StateA count
{
- StateA++;
- wheel.ResetYay();
- if (StateA>(s-1))
+ StateA++; //increment StateA
+ wheel.ResetYay(); //reset Yay
+ if (StateA>(s-1)) //State A is only valid between 0 and 63 (64 states)
{
- StateA=0;
+ StateA=0; //continuous loop
}
}
}
while(1)
{
- while((led1 == 0) && (led2 == 0)) //If no command to operate
+ while((clockwise == 0) && (anticlockwise == 0)) //If no command to operate
{
- duty = 0.3; //Duty reduced to low value to ensure ramp up of speed
+ duty = 0.11; //Duty reduced to low value to ensure ramp up of speed
rpm = 0; //RPM function not being triggered due to no rotation. RPM set to 0
+ SetPointBuffer = (float) 3000 *pot; //cast pot value as a float
+ SetPoint = (int) SetPointBuffer; //Convert SetPointBuffer to an int and use as value for SetPoint
AdjCW = CW; //Reset to correct value for start up
AdjACW = ACW; //Reset to correct value for start up
Ph0(); //turn off all phases
GetChar(); //read keyboard strikes
ReadKType(); //Temperature measurement
StateB = (wheel.getPulses()+StateA)%s; //calculation for stateB
+ Switch();
+ lcd.cls();
+ wait(0.001);
+ lcd.printf("SRM STOP");
+ lcd.locate(0,1);
+ lcd.printf("%.0fRPM, %.0fdegC\n",rpm, temp);
+ wait(0.1);
}
- while((wheel.getRevolutions()>1) && (wheel.getPulses()>0) && (led1==1) && (temp<T)) //After Calibration, Prev CW movement, CW command
+ while((wheel.getRevolutions()>1) && (wheel.getPulses()>0) && (clockwise==1) && (temp<T)) //After Calibration, Prev CW movement, CW command
{
- GetChar(); //read keyboard strikes
- StateB = (wheel.getPulses()+StateA+AdjCW)%s; //calculation for stateB
+ GetChar();
+ Switch(); //read keyboard strikes
+ StateB = (wheel.getPulses()+StateA+AdjCW-adj)%s; //calculation for stateB
+ SetPointBuffer = (float) 3000 *pot; //cast pot value as a float
+ SetPoint = (int) SetPointBuffer; //Convert SetPointBuffer to an int and use as value for SetPoint
switch(StateB)
{
case 0:Ph1();break;
case 1:Ph1();break;
- case 2:Ph1();break;
+ case 2:Ph1();break;z
case 3:Ph1();break;
case 4:Ph1();break;
case 5:Ph1();break;
@@ -262,18 +292,24 @@
RPM(); //calculate RPM
VelocityLoop(); //Adjust velocity
slowloop++; //increment slowloop
- if(slowloop>(0.01*rpm)) //Reads temperature at a constant time interval
+ if(slowloop>(0.02*rpm)) //Reads temperature at a constant time interval
{
ReadKType(); //Read Temp
- slowloop=0; //Reset slowloop
+ lcd.cls();
+ wait(0.0001);
+ lcd.printf("CW %.0f\n",rpm);
+ slowloop=0; //Reset slowloop
}
}
}
- while(wheel.getRevolutions()>1 && wheel.getPulses()<1 && (led1==1) && (temp<T)) //After Calibration, Prev ACW movement, CW command
+ while(wheel.getRevolutions()>1 && wheel.getPulses()<1 && (clockwise==1) && (temp<T)) //After Calibration, Prev ACW movement, CW command
{
GetChar();
- StateB = (enc+wheel.getPulses()+StateA+AdjCW)%s;
+ Switch();
+ StateB = (enc+wheel.getPulses()+StateA+AdjCW-adj)%s;
+ SetPointBuffer = (float) 3000 *pot;
+ SetPoint = (int) SetPointBuffer;
switch(StateB)
{
@@ -352,14 +388,20 @@
if(slowloop>(0.01*rpm))
{
ReadKType();
- slowloop=0;
+ lcd.cls();
+ wait(0.0001);
+ lcd.printf("CW %.0f\n",rpm);
+ slowloop=0;
}
}
}
- while((wheel.getRevolutions()>1) && (wheel.getPulses()>0) && (led2==1) && (temp<T)) //After Calibration, Prev CW movement, ACW command
+ while((wheel.getRevolutions()>1) && (wheel.getPulses()>0) && (anticlockwise==1) && (temp<T)) //After Calibration, Prev CW movement, ACW command
{
GetChar();
- StateB = (wheel.getPulses()+StateA+AdjACW)%s;
+ Switch();
+ StateB = (wheel.getPulses()+StateA+AdjACW-adj)%s;
+ SetPointBuffer = (float) 3000 *pot;
+ SetPoint = (int) SetPointBuffer;
switch(StateB)
{
@@ -437,14 +479,20 @@
if(slowloop>(0.01*rpm))
{
ReadKType();
+ lcd.cls();
+ wait(0.0001);
+ lcd.printf("ACW %.0f\n",rpm);
slowloop=0;
}
}
}
- while((wheel.getRevolutions()>1) && (wheel.getPulses()<1) && (led2==1) &&(temp<T)) //After Calibration, Prev ACW movement, ACW command
+ while((wheel.getRevolutions()>1) && (wheel.getPulses()<1) && (anticlockwise==1) &&(temp<T)) //After Calibration, Prev ACW movement, ACW command
{
GetChar();
- StateB = (enc+wheel.getPulses()+StateA+AdjACW)%s;
+ Switch();
+ StateB = (enc+wheel.getPulses()+StateA+AdjACW-adj)%s;
+ SetPointBuffer = (float) 3000 *pot;
+ SetPoint = (int) SetPointBuffer;
switch(StateB)
{
@@ -523,21 +571,38 @@
if(slowloop>(0.01*rpm))
{
ReadKType();
- slowloop=0;
+ lcd.cls();
+ wait(0.0001);
+ lcd.printf("CW %.0f\n",rpm);
+ slowloop=0;
}
}
}
while(temp>(T-1)) //If Temp exceeds T the motor will not operate
{
Initialisation();
+ wait(0.001);
+ lcd.printf("SRM Over Temp");
+ lcd.locate(0,1);
+ lcd.printf("RPM=%.0f, %.0f C\n",rpm, temp);
+ wait(0.1);
pc.printf("Motor Over Temp\n\r");
- while(1)
+ while(1)
{
ReadKType(); //Read motor Temp
+ lcd.printf("SRM Over Temp");
+ lcd.locate(0,1);
+ lcd.printf("RPM=%.0f, %.0f C\n",rpm, temp);
+ wait(0.1);
pc.printf("%f\r",temp); //Display current Temp
wait(1);
if(temp<T-20) //Reset when Temp 20 degrees C below thermostat trip value
{
+ wait(0.001);
+ lcd.printf("SRM Back Online");
+ lcd.locate(0,1);
+ lcd.printf("RPM=%.0f, %.0f C\n",rpm, temp);
+ wait(0.1);
pc.printf("Motor Back Online\n\r");
break;
}
@@ -674,24 +739,25 @@
case '4': Ph4();break; //Check Phase 4
case '5': Ph0();break; //Turn off all Phases
case '6': StepACW();break; //Step ACW
- case '7': pc.printf("TimePerClick = %i, TimePerRev = %.5f, rps = %.5f, rpm = %.1f, \n\r", TimePerClick, TimePerRev, rps, rpm);break; //Print rpm related data
- case '9': pc.printf("State A = %i, StateB = %i, Pulses= %i, Revs= %i \n\r", StateA, StateB, wheel.getPulses(), wheel.getRevolutions());break; //Print data relating to position
- case '0': pc.printf("%i, %.5f, %i, %i, %.1f, %f, %f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm, gain, p);break; //Print general data
- case 'q': SetPoint=SetPoint+5;if (SetPoint >3000){SetPoint = 3000;}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Increases setpoint used in Velocity loop
- case 'a': SetPoint=SetPoint-5;if (SetPoint <0){SetPoint = 0;}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Decreases setpoint used in Velocity loop
- case 'w': duty = duty + 0.01;pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Increases duty used in Velocity loop
- case 's': duty = duty - 0.01;pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Decreases duty used in Velocity loop
- case 'e': gain = gain * 10;pc.printf("%i, %.5f, %i, %i, %.1f, %f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm, gain);break; //Increases gain used in Velocity loop
- case 'd': gain = gain / 10;pc.printf("%i, %.5f, %i, %i, %.1f, %f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm, gain);break; //Decreases gain used in Velocity loop
- case 'r': p = p+0.0000001;pc.printf("%i, %.5f, %i, %i, %i, %0.7f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm, p);break; //Increasees PWM period
+ case '7': pc.printf("TimePerClick = %i, TimePerRev = %.5f, rps = %.5f, rpm = %.1f, \n\r", TimePerClick, TimePerRev, rps, rpm);break; //Print rpm related data
+ case '9': pc.printf("State A = %i, StateB = %i, Pulses= %i, Revs= %i \n\r", StateA, StateB, wheel.getPulses(), wheel.getRevolutions());break; //Print data relating to position
+ case '0': pc.printf("%i, %.5f, %i, %i, %.1f, %f, %f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm, gain, p);break; //Print general data
+ case 'q': SetPoint=SetPoint+5;if (SetPoint >3000){SetPoint = 3000;}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Increases setpoint used in Velocity loop
+ case 'a': SetPoint=SetPoint-5;if (SetPoint <0){SetPoint = 0;}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Decreases setpoint used in Velocity loop
+ case 'w': duty = duty + 0.01;pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Increases duty used in Velocity loop
+ case 's': duty = duty - 0.01;pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Decreases duty used in Velocity loop
+ case 'e': gain = gain * 10;pc.printf("%i, %.5f, %i, %i, %.1f, %f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm, gain);break; //Increases gain used in Velocity loop
+ case 'd': gain = gain / 10;pc.printf("%i, %.5f, %i, %i, %.1f, %f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm, gain);break; //Decreases gain used in Velocity loop
+ case 'r': p = p+0.0000001;pc.printf("%i, %.5f, %i, %i, %i, %0.7f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm, p);break; //Increasees PWM period
case 'f': p = p-0.0000001;pc.printf("%i, %.5f, %i, %i, %i, %0.7f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm, p);break; //Decreasees PWM period
- case 't': pc.printf("%.0f C\n\r",temp);break; //Print current Temp
- case 'o': AdjCW = AdjCW+1;if (AdjCW >(s-1)){AdjCW = 0;}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //AdjCW+
- case 'k': AdjCW = AdjCW-1;if (AdjCW <0){AdjCW = (s-1);}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //AdjCW-
- case 'p': AdjACW = AdjACW+1;if (AdjACW >(s-1)){AdjACW = 0;}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //AdjACW+
- case 'l': AdjACW = AdjACW-1;if (AdjACW <0){AdjACW = (s-1);}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //AdjACW-
- case 'z': led1 = !led1;led2 = 0;pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Run motor CW
- case 'x': led1 = 0;led2 = !led2;pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Run motor ACW
+ case 't': pc.printf("%.0f C\n\r",temp);break; //Print current Temp
+ case 'o': AdjCW = AdjCW+1;if (AdjCW >(s-1)){AdjCW = 0;}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //AdjCW+
+ case 'k': AdjCW = AdjCW-1;if (AdjCW <0){AdjCW = (s-1);}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //AdjCW-
+ case 'p': AdjACW = AdjACW+1;if (AdjACW >(s-1)){AdjACW = 0;}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //AdjACW+
+ case 'l': AdjACW = AdjACW-1;if (AdjACW <0){AdjACW = (s-1);}pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //AdjACW-
+ case 'z': led1 = !led1;led2 = 0;pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Run motor CW
+ case 'x': led1 = 0;led2 = !led2;pc.printf("%i, %.5f, %i, %i, %.1f \n\r", SetPoint, duty, AdjCW, AdjACW, rpm);break; //Run motor ACW
+ case 'm': pc.printf("%f \n\r", pot.read()); //Potentiometer value
}
}
}
@@ -706,13 +772,182 @@
rps = 1 / TimePerRev; //inverse to convert SPR to rps
rpm = rps * 60; //x 60 to convert rps to RPM
- if(duty < 0.9) //Mapped Phase Advance with no load
+ //if(duty < 0.9) //Mapped Phase Advance with no load
{
- if(rpm < 135)
+ if (rpm<299)
+ {
+ AdjCW = (57);
+ AdjACW = (12);
+ gain = (0.0001);
+ }
+ else if(rpm > 299 and rpm < 309)
+ {
+ AdjCW = (59);
+ AdjACW = (12);
+ gain = (0.0001);
+ }
+ else if(rpm > 309 and rpm < 319)
+ {
+ AdjCW = (60);
+ AdjACW = (12);
+ gain = (0.0001);
+ }
+ else if(rpm > 319 and rpm < 328)
+ {
+ AdjCW = (61);
+ AdjACW = (12);
+ gain = (0.0001);
+ }
+ else if(rpm > 328 and rpm < 337)
+ {
+ AdjCW = (62);
+ AdjACW = (12);
+ gain = (0.0001);
+ }
+ else if(rpm > 337 and rpm < 346)
+ {
+ AdjCW = (63);
+ AdjACW = (12);
+ gain = (0.0001);
+ }
+ else if(rpm > 346 and rpm < 351)
{
AdjCW = (0);
- AdjACW = (13);
+ AdjACW = (12);
+ gain = (0.0001);
+ }
+ else if(rpm > 351 and rpm < 357)
+ {
+ AdjCW = (1);
+ AdjACW = (11);
+ gain = (0.0001);
+ }
+ else if(rpm > 357 and rpm < 362)
+ {
+ AdjCW = (3);
+ AdjACW = (10);
+ gain = (0.0001);
+ }
+ else if(rpm > 362 and rpm < 420)
+ {
+ AdjCW = (4);
+ AdjACW = (6);
+ gain = (0.0001);
+ }
+ else if(rpm > 420 and rpm < 548)
+ {
+ AdjCW = (5);
+ AdjACW = (4);
+ gain = (0.0001);
+ }
+ else if(rpm > 548 and rpm < 664)
+ {
+ AdjCW = (6);
+ AdjACW = (3);
+ gain = (0.0001);
+ }
+ else if(rpm > 664 and rpm < 710)
+ {
+ AdjCW = (7);
+ AdjACW = (3);
+ gain = (0.0001);
+ }
+ else if(rpm > 710 and rpm < 767)
+ {
+ AdjCW = (8);
+ AdjACW = (2);
+ gain = (0.0001);
+ }
+ else if(rpm > 767 and rpm < 960)
+ {
+ AdjCW = (9);
+ AdjACW = (1);
+ gain = (0.0001);
+ }
+ else if(rpm > 960 and rpm < 1051)
+ {
+ AdjCW = (10);
+ AdjACW = (0);
gain = (0.0001);
+ }
+ else if(rpm > 1051 and rpm < 1281)
+ {
+ AdjCW = (11);
+ AdjACW = (63);
+ gain = (0.00001);
+ }
+ else if(rpm > 1281 and rpm < 1427)
+ {
+ AdjCW = (12);
+ AdjACW = (62);
+ gain = (0.00001);
+ }
+ else if(rpm > 1427 and rpm < 1613)
+ {
+ AdjCW = (13);
+ AdjACW = (61);
+ gain = (0.00001);
+ }
+ else if(rpm > 1613 and rpm < 1661)
+ {
+ AdjCW = (14);
+ AdjACW = (60);
+ gain = (0.00001);
+ }
+ else if(rpm > 1661 and rpm < 1746)
+ {
+ AdjCW = (15);
+ AdjACW = (59);
+ gain = (0.00001);
+ }
+ else if(rpm > 1746 and rpm < 1999)
+ {
+ AdjCW = (16);
+ AdjACW = (58);
+ gain = (0.00001);
+ }
+ else if(rpm > 1999 and rpm < 2324)
+ {
+ AdjCW = (17);
+ AdjACW = (57);
+ gain = (0.00001);
+ }
+ else if(rpm > 2324 and rpm < 2621)
+ {
+ AdjCW = (18);
+ AdjACW = (56);
+ gain = (0.00001);
+ }
+ else if(rpm > 2621 and rpm < 2779)
+ {
+ AdjCW = (19);
+ AdjACW = (55);
+ gain = (0.00001);
+ }
+ else if(rpm > 2779 and rpm < 2882)
+ {
+ AdjCW = (20);
+ AdjACW = (54);
+ gain = (0.00001);
+ }
+ else if(rpm > 2882 and rpm < 2967)
+ {
+ AdjCW = (22);
+ AdjACW = (53);
+ gain = (0.000005);
+ }
+ else if(rpm > 2967)
+ {
+ AdjCW = (23);
+ AdjACW = (52);
+ gain = (0.000005);
+ }
+ }
+ /*if(rpm < 135)
+ {
+ AdjCW = (0);
+ AdjACW = (13);
+ gain = (0.0001); //proportional gain
}
else if(rpm > 135.2 and rpm < 171)
{
@@ -917,8 +1152,8 @@
AdjCW = (17);
AdjACW = (57);
gain = (0.000001);
- }
- }
+ } */
+ /*}
if(duty > 0.99) //Mapped Phase Advance with load
{
@@ -988,10 +1223,10 @@
AdjACW = (5);
gain = (0.000001);
}
- }
+ }*/
}
-void VelocityLoop (void)
+void VelocityLoop (void) //Speed control
{
diff = SetPoint - rpm; //difference between setpoint and the RPM measurement
duty = duty + (diff*gain); //0.00001 when change required at fast rpm. 0.001 when changes required at slow rpm. duty is adjusted to speed up or slow down until difference = 0
@@ -1000,15 +1235,15 @@
{
duty = 1;
}
- if (duty <0.11) //min duty 0.11
+ if (duty <0.053) //min duty 0.11
{
- duty = 0.11;
+ duty = 0.053;
}
}
void ReadKType(void) //Reads Temperature
{
- int i = 0;
+ int i = 0;
int Readout = 0;
cs1 = 0;
@@ -1019,7 +1254,7 @@
SerialClock = 0;
wait_ms(0.01);
- for(i = 13; i > -1; i = i-1) // now data is temp data where MSB is first and each count is worth 0.25 degrees
+ for(i = 13; i > -1; i = i-1) //now data is temp data where MSB is first and each count is worth 0.25 degrees
{
if(DOut == 1) //check data, store results in readout
{
@@ -1038,4 +1273,10 @@
temp = Readout * 0.125; //get the real temp value which is a float
Readout = 0;
cs1 = 1;
+}
+
+void Switch (void)
+{
+ led1 = clockwise;
+ led2 = anticlockwise;
}
\ No newline at end of file