常驻嘉宾
- 积分
- 3611
- 威望
- 1908
- 贡献
- 941
- 兑换币
- 542
- 注册时间
- 2011-6-22
- 在线时间
- 381 小时
|
6#
楼主 |
发表于 2012-4-14 00:24:36
|
只看该作者
吉他手 发表于 2012-4-10 20:35
请注意,参考设计方案是将最终电机的控制量U限定在(-1,1)之间。因此这个量本身就是输出PWM的占空比。比如, ...
限制在-1到1来表示占空比是怎么实现的啊 ????
好久了都没搞懂啊。下面这个程序我能看懂,PWM的占空比就是 nOut,
但是我搞不懂的是:怎么样把检测到的角度和角速度按照公式U=K(K1*angle+K2*anglespeed),化成-1.0到1.0之间啊???
首先,按照官网参考方案来说,K1应该是(float)180/ (float)(GRAVITY_MAX - GRAVITY_MIN) ,
K2是。
K1,K2都出来了,那该怎么确定占空比是多少呢????
//------------------------------------------------------------------------------
void SetMotorVoltage(float fLeftVoltage, float fRightVoltage) {
// Voltage : > 0 : Move forward;
// < 0 : Move backward
short nPeriod;
int nOut;
nPeriod = (short)getReg(PWM_PWMCM);
//--------------------------------------------------------------------------
if(fLeftVoltage > 1.0) fLeftVoltage = 1.0;
else if(fLeftVoltage < -1.0) fLeftVoltage = -1.0;
if(fRightVoltage > 1.0) fRightVoltage = 1.0;
else if(fRightVoltage < -1.0) fRightVoltage = -1.0;
//--------------------------------------------------------------------------
if(fLeftVoltage > 0) {
setReg(PWM_PWMVAL1, 0);
nOut = (int)(fLeftVoltage * nPeriod);
setReg(PWM_PWMVAL0, nOut);
} else {
setReg(PWM_PWMVAL0, 0);
fLeftVoltage = -fLeftVoltage;
nOut = (int)(fLeftVoltage * nPeriod);
setReg(PWM_PWMVAL1, nOut);
}
//--------------------------------------------------------------------------
if(fRightVoltage > 0) {
setReg(PWM_PWMVAL2, 0);
nOut = (int)(fRightVoltage * nPeriod);
setReg(PWM_PWMVAL3, nOut);
} else {
setReg(PWM_PWMVAL3, 0);
fRightVoltage = -fRightVoltage;
nOut = (int)(fRightVoltage * nPeriod);
setReg(PWM_PWMVAL2, nOut);
}
MOTOR_SETLOAD; // Reload the PWM value
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|