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: HbMotor.cpp
- Revision:
- 29:eb3d72dd94aa
- Parent:
- 28:fdb3b144e342
- Child:
- 32:7f4145cc3551
--- a/HbMotor.cpp Sat Dec 15 14:20:04 2018 +0000 +++ b/HbMotor.cpp Mon Dec 17 13:25:00 2018 +0000 @@ -69,19 +69,22 @@ HbMotCtrl::HbMotCtrl(eMotPos Pos, INT16 Type){ pos = Pos; typ = Type; - for(int i = 0; i < 4; ++i){ - ready.reset(i); - } + //for(int i = 0; i < 4; ++i){ + // ready.reset(i); + //} + val = 0; ofs = 0; pwmMin = 0; pwmMax = 0; rpmMin = 0; rpmMax = 0; + rpmGain = 1; + rpmOfs = 0; coefA = 0; coefB = 0; coefC = 0; - curPwmVal = 0; - curRpmVal = 0; + //curPwmVal = 0; + //curRpmVal = 0; } //========================================= //デストラクタ @@ -96,18 +99,24 @@ void HbMotCtrl::setPwmLimt(INT16 Min, INT16 Max){ pwmMax = Max; pwmMin = Min; - ready.set(0); + //ready.set(0); } void HbMotCtrl::setRpmLimt(INT16 Min, INT16 Max){ rpmMax = Max; rpmMin = Min; - ready.set(1); + //ready.set(1); +} +void HbMotCtrl::setRpmOffset(INT16 ofs){ + rpmOfs = ofs; +} +void HbMotCtrl::setRpmGain(float gain){ + rpmGain = gain; } void HbMotCtrl::setMotCoef(float a, float b, float c){ coefA = a; coefB = b; coefC = c; - ready.set(2); + //ready.set(2); } //void HbMotCtrl::makeTable(){ // 0は0rpm,1%は1500rpm(minimum)....100%はMaxrpm @@ -132,50 +141,118 @@ if(percent == 0){ tmpPwm = 0; } else { - tmpRpm = rpmMin + (int)((rpmStep * (percent-1)) + 0.5); + //tmpRpm = rpmMin + (int)((rpmStep * (percent-1)) + 0.5); + tmpRpm = rpmGain * (rpmMin + (int)((rpmStep * (percent-1)) + 0.5)) +rpmOfs; + if(tmpRpm > rpmMax) tmpRpm = rpmMax; + if(tmpRpm < 0) tmpRpm = 0; tmpPwm = (INT16)(coefA * tmpRpm * tmpRpm + coefB * tmpRpm + coefC); } return tmpPwm; } -void HbMotCtrl::setValue(float value){ - int iVal = 0; - if(value + 0.5 > 49){ - iVal = 49; +INT16 HbMotCtrl::calcPwm(UINT16 rpm) +{ + //float rpmStep = (rpmMax - rpmMin) / 99.0; + int tmpRpm; + INT16 tmpPwm; + if(rpm == 0){ + tmpPwm = 0; + } else { + tmpRpm = rpmGain * rpm + rpmOfs; + if(tmpRpm > rpmMax) { + tmpRpm = rpmMax; + } + //else if(tmpRpm < rpmMin && tmpRpm > 0) { + // tmpRpm = rpmMin; + //} + else if( tmpRpm < 0){ + tmpRpm = 0; + } + tmpPwm = (INT16)(coefA * tmpRpm * tmpRpm + coefB * tmpRpm + coefC); + if(tmpPwm < 0) tmpPwm = 0; + } + + return tmpPwm; +} + +//void HbMotCtrl::setValue(float value){ +// int iVal = 0; +// if(value + 0.5 > 49){ +// iVal = 49; +// } +// else if (value < 0){ +// iVal = 0; +// } +// else{ +// iVal = value + 0.5; +// } +// val = iVal; +// iVal+=ofs; +// UCHAR uPos = pos * 2 + typ; + +// fpgaMotor(uPos, calcPwm(iVal)); +//} +//void HbMotCtrl::setOfs(float value){ +// int iVal = 0; +// if(value + 0.5 > 49){ +// iVal = 49; +// } +// else if (value < 0){ +// iVal = 0; +// } +// else{ +// iVal = value + 0.5; +// } +// ofs = iVal; +// iVal+=val; +// UCHAR uPos = pos * 2 + typ; +// fpgaMotor(uPos, calcPwm(iVal)); +//} +//float HbMotCtrl::getValue(){ +// return val; +//} +//float HbMotCtrl::getOfs(){ +// return ofs; +//} + +void HbMotCtrl::setRpmValue(INT16 value){ + INT16 iVal = 0; + if(value + ofs > rpmMax){ + iVal = rpmMax - ofs; } else if (value < 0){ iVal = 0; } else{ - iVal = value + 0.5; + iVal = value; } val = iVal; iVal+=ofs; UCHAR uPos = pos * 2 + typ; - fpgaMotor(uPos, calcPwm(iVal)); + fpgaMotor(uPos, calcPwm((UINT16)iVal)); } -void HbMotCtrl::setOfs(float value){ +void HbMotCtrl::setRpmOfs(INT16 value){ int iVal = 0; - if(value + 0.5 > 49){ - iVal = 49; + if(value + val > rpmMax){ + iVal = rpmMax - val; } else if (value < 0){ iVal = 0; } else{ - iVal = value + 0.5; + iVal = value; } ofs = iVal; iVal+=val; UCHAR uPos = pos * 2 + typ; - fpgaMotor(uPos, calcPwm(iVal)); + fpgaMotor(uPos, calcPwm((UINT16)iVal)); } -float HbMotCtrl::getValue(){ +INT16 HbMotCtrl::getRpmValue(){ return val; } -float HbMotCtrl::getOfs(){ +INT16 HbMotCtrl::getRpmOfs(){ return ofs; } @@ -213,6 +290,22 @@ if(motCtrl[1] == NULL) return; motCtrl[1]->setPwmLimt(min, PWN_MAX); } +void HbSubProp::setRpmGain(eMotType type, float gain){ + if(type == IN){ + motCtrl[0]->setRpmGain(gain); + } + else{ + motCtrl[1]->setRpmGain(gain); + } +} +void HbSubProp::setRpmOffset(eMotType type, INT16 ofs){ + if(type == IN){ + motCtrl[0]->setRpmOffset(ofs); + } + else{ + motCtrl[1]->setRpmOffset(ofs); + } +} void HbSubProp::setCoef(eMotType type, float a, float b, float c){ if(type == IN){ if(motCtrl[0] == NULL)return; @@ -229,24 +322,24 @@ // motCtrl[0]->makeTable(); // motCtrl[1]->makeTable(); //} -void HbSubProp::setValue(float val){ +void HbSubProp::setValue(INT16 val){ if(motCtrl[0] == NULL || motCtrl[1] == NULL) return; - motCtrl[0]->setValue(val); - motCtrl[1]->setValue(val); + motCtrl[0]->setRpmValue(val); + motCtrl[1]->setRpmValue(val); } -void HbSubProp::setOfs(float val){ +void HbSubProp::setOfs(INT16 val){ if(motCtrl[0] == NULL || motCtrl[1] == NULL) return; - motCtrl[0]->setOfs(val); - motCtrl[1]->setOfs(val); + motCtrl[0]->setRpmOfs(val); + motCtrl[1]->setRpmOfs(val); } -float HbSubProp::getValue(){ +INT16 HbSubProp::getValue(){ if(motCtrl[0] == NULL || motCtrl[1] == NULL) return 0; // 同じはずなのでINのみ - return motCtrl[0]->getValue(); + return motCtrl[0]->getRpmValue(); } -float HbSubProp::getOfs(){ +INT16 HbSubProp::getOfs(){ if(motCtrl[0] == NULL || motCtrl[1] == NULL) return 0; // 同じはずなのでINのみ - return motCtrl[0]->getOfs(); + return motCtrl[0]->getRpmOfs(); }