Motor current controller
Fork of CURRENT_CONTROL by
CURRENT_CONTROL.cpp
- Committer:
- adam_z
- Date:
- 2016-04-22
- Revision:
- 3:c787d1c5ad6a
- Parent:
- 2:562bd14dfd3a
- Child:
- 4:1a6ba05e7736
File content as of revision 3:c787d1c5ad6a:
#include "mbed.h" #include "CURRENT_CONTROL.h" CURRENT_CONTROL::CURRENT_CONTROL(PinName curChannel, PinName PwmChannel1, PinName PwmChannel2, PWMIndex pwmIndex, float Kp, float Ki, float Kd, float samplingTime) : currentAnalogIn(curChannel), MotorPlus(PwmChannel1), MotorMinus(PwmChannel2), pid(Kp,Ki,Kd,samplingTime), lpFilter(samplingTime) { pwmIndex_ = pwmIndex; Ts = samplingTime; //setup motor PWM parameters MotorPlus.period_us(50);//default period equals to 50 microseconds MotorPlus.write(0.5); //duty ratio = 0.5 in complementary output mode -> static if(pwmIndex_ == PWM1)TIM1->CCER |= 4; else if(pwmIndex_ == PWM2)TIM1->CCER |= 64; //enable complimentary output } void CURRENT_CONTROL::Control(float curRef) { analogInValue = currentAnalogIn.read(); curFeedBack = lpFilter.filter((analogInValue - currentOffset)*analog2Cur, 10*3.14159); pid.Compute(curRef, curFeedBack); MotorPlus = 0.5 - pid.output; if(pwmIndex_ == PWM1)TIM1->CCER |= 4; else if(pwmIndex_ == PWM2)TIM1->CCER |= 64; } void CURRENT_CONTROL::SetAnalog2Cur(float ratio)//LTS25-NP current sensor working with STM32F446RE : 3.3*8/0.6 { analog2Cur = ratio; } //****************for test************************// void CURRENT_CONTROL::SetPWMDuty(float ratio) { MotorPlus = ratio; if(pwmIndex_ == PWM1)TIM1->CCER |= 4; else if(pwmIndex_ == PWM2)TIM1->CCER |= 64; } float CURRENT_CONTROL::GetAnalogIn(void) { return analogInValue = currentAnalogIn.read(); } float CURRENT_CONTROL::GetCurrent(void) { return curFeedBack; } //=====================LPF ====================// LPF::LPF(float samplingTime) { Ts = samplingTime; } float LPF::filter(float input, float cutOff) { output = (outputLast + cutOff*Ts)/(1 + cutOff*Ts); outputLast = output; return output; }