97
« Last post by mamette on June 17, 2013, 10:55:25 AM »
I GOT IT!!! it must use Interrupts, and all things will works well..
// constants won't change. They're used here to
// set pin numbers:
const int motorPin1 =3;
const int motorPin2 =6;
const int motorPin3 =5;
// Variables will change:
boolean direct = true; // direction true=forward, false=backward
int pwmSin[] = {127,110,94,78,64,50,37,26,17,10,4,1,0,1,4,10,17,26,37,50,64,78,94,110,127,144,160,176,191,204,217,228,237,244,250,253,254,253,250,244,237,228,217,204,191,176,160,144,127
}; // array of PWM duty values for 8-bit timer - sine function
//int pwmSin[]={511,444,379,315,256,200,150,106,68,39,17,4,0,4,17,39,68,106,150,200,256,315,379,444,511,578,643,707,767,822,872,916,954,983,1005,1018,1022,1018,1005,983,954,916,872,822,767,707,643,578,511
//}; // array of PWM duty values for 10-bit timer - sine function
int increment;
int currentStepA=0;
int currentStepB=16;
int currentStepC=32;
// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
//long motorDelayActual = 0; // the actual delay, based on pot value and motor delay set above
long lastMotorDelayTime = 0;
void initBLDC() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
//TCCR1B = TCCR1B & 0b11111000 | 0x01; // set PWM frequency @ 31250 Hz for Pins 9 and 10
//TCCR2B = TCCR2B & 0b11111000 | 0x01; // set PWM frequency @ 31250 Hz for Pins 11 and 3
TCCR2B = _BV(CS21);
//TCCR0B = TCCR0B & 0b11111000 | 0x01; // set PWM frequency @ 31250 Hz for Pins 5 and 6
ICR1 = 255 ; // 8 bit resolution
//ICR1 = 1023 ; // 10 bit resolution
TIMSK2 |= _BV(TOIE1);
//sei();
//Timer2 Settings: Timer Prescaler /64,
//TCCR2B |= ((1<<CS22) | (0<<CS21) | (0<<CS20));
//Use normal mode
//TCCR2B |= (0<<WGM21) | (0<<WGM20);
// Use internal clock - external clock not used in Arduino
//ASSR |= (0<<AS2); //http://forum.arduino.cc/index.php/topic,37875.0.html
sei();
// Enable Timer1 Interrupt for Motor Control
//OCR2A = 0; //11 APIN
//OCR2B = 0; //D3
//OCR1A = 0; //D9 CPIN
//OCR1B = 0; //D10 BPIN
//OCR0A = 0; //D6
//OCR0B = 0; //D5
}
ISR(TIMER2_OVF_vect) {
BLDCmove();
};
void setup() {
initBLDC();
}
void loop() {
//IMU Code Here
}
void BLDCmove() {
if((millis() - lastMotorDelayTime) > 0)
{ // delay time passed, move one step
BLDCCommut();
lastMotorDelayTime = millis();
}
motorMove();
}
void BLDCCommut() {
if (direct==true)
{
increment = 1;
currentStepA = currentStepA + increment;
if(currentStepA > 47) currentStepA = 0;
if(currentStepA<0) currentStepA =47;
currentStepB = currentStepB + increment;
if(currentStepB > 47) currentStepB = 0;
if(currentStepB<0) currentStepB =47;
currentStepC = currentStepC + increment;
if(currentStepC > 47) currentStepC = 0;
if(currentStepC<0) currentStepC =47;
}
if (direct==false)
{
increment = -1;
currentStepA = currentStepA + increment;
if(currentStepA > 47) currentStepA = 0;
if(currentStepA<0) currentStepA =47;
currentStepB = currentStepB + increment;
if(currentStepB > 47) currentStepB = 0;
if(currentStepB<0) currentStepB =47;
currentStepC = currentStepC + increment;
if(currentStepC > 47) currentStepC = 0;
if(currentStepC<0) currentStepC =47;
}
}
void motorMove() {
analogWrite(motorPin1, pwmSin[currentStepA]);
analogWrite(motorPin2, pwmSin[currentStepB]);
analogWrite(motorPin3, pwmSin[currentStepC]);
}