|
楼主 |
发表于 2011-6-30 11:07:32
|
显示全部楼层
前两天有个问题一直困惑着我,本来还能正反转的,怎么搞成传感器向一面倾斜是正常的可调速度,向另一面倾斜就变成了同向的几乎见不到可调的高速度?昨天终于调通了,原来是C语言数据类型的问题。
原来的程序段:
u16 hYval,hZval;
u16 mid_Piont=337;// 1024/5.1*1.65=337
...
if (hZval>=mid_Piont)
{
BLDC_Set_Duty_cycle((u8)((hZval-mid_Piont) /4));
}
else
{
BLDC_Set_Duty_cycle((u8)((mid_Piont-hZval)/4));
}
if (hZval>=mid_Piont)
{
// GPIOA->ODR |= BIT6; //亮灯
PhaseSteps = PhaseSteps_CW;
bHallSteps = bHallSteps_CW;
}
else
{
// GPIOA->ODR &= (u8)(~BIT6); //灭灯
PhaseSteps = PhaseSteps_CCW;
bHallSteps = bHallSteps_CCW;
}
虽然没有滤波导致抖动大,但工作是正常的。
后来为了滤波方便引用原有的储存值,大小的比较改成了跟0的比较,编译器就开始有提示warning了:Compare out of range,类似于这样的:
if ((hZval-mid_Piont) >= 0)
{
BLDC_Set_Duty_cycle((u8)((hZval-mid_Piont) /4));
}
else
{
BLDC_Set_Duty_cycle((u8)((mid_Piont-hZval)/4));
}
我把比较式中的=号去掉,就不再有警告了,但工作状态出乎我的意料。幸好有一个指示灯可以帮助指示程序路径,才发现,原来unsign的数据类型计算结果还是unsign,结果如果小于0,那就得到一个符号位当成一个高权值的unsign结果。明白了这点,程序终于调通了。
按说这时我就应该可以让车子立起来测试它挺不挺了,可是由于前期驱动不稳定,电机的转动力量和惯性都大,导致车轴和防转垫片以及车架的方孔出现了较大的间隙,如不处理也很难站好。 |
|