- 打卡等级:偶尔看看III
- 打卡总天数:50
- 最近打卡:2025-04-30 22:59:03
超级版主
- 积分
- 12073
|
发表于 2024-12-28 22:40:50
|
显示全部楼层
有3个转速计算:
用于PID计算的当前转速:转/秒
position = 190476.19f * SampleCnt / PhaseTimeSum; //计算当前位置(转速),
SampleCnt为采样次数,PhaseTimeSum为SampleCnt次采样8次换相时间的累加和,例子使用电机为7个磁极对。
当前位置(转速)=1/(7*t*3/4), 7为磁极对,t为8次换相时间之和,t*3/4为6次换相时间之和,则电机转一圈的时间为(7*t*3/4)。
换相时间单位为us,为了单位对齐,当前位置(转速)=1000000/(7*t*3/4)。本例t=PhaseTimeSum/SampleCnt,则转速:
position = 1000000 / (7*PhaseTimeSum/SampleCnt *3/4) = 190476.19 * SampleCnt / PhaseTimeSum,这个速度给PID计算用的,单位:Hz,即转/秒。
用于OLED显示的当前转速:转/秒
if(B_RUN) j = (u16)(1904761.9f * SpeedSumCnt / SpeedSum); // 计算当前转速(0.0转/秒)
原理同上,但是显示是带一位小数的,则将上述数据放大10倍,换相时间使用计算周期内的平均值,这样显示稳定。
当前转速(转/秒)=10*1000000/(7*t*3/4), 本例t=SpeedSum/SpeedSumCnt,SpeedSum为计算周期内SpeedSumCnt次采样的8次换相时间之和。
则当前转速(转/秒)=10*1000000/(7*SpeedSum/SpeedSumCnt*3/4)=1904761.9f * SpeedSumCnt / SpeedSum,单位0.1Hz,即0.1转/秒。
用于OLED显示的当前转速:转/分
if(B_RUN) j = (u16)(11428571.4f * SpeedSumCnt / SpeedSum); // 计算当前转速(转/分)
同理,就是上述“用于OLED显示的当前转速:转/秒”一样的计算,不过是乘以60:
当前转速(转/分)=60*1000000/(7*t*3/4)=60*1000000/(7*SpeedSum/SpeedSumCnt*3/4)=11428571.4 * SpeedSumCnt / SpeedSum,单位转/分。
|
|