haiming8685 发表于 2024-12-28 18:49:50

电机说明是6极电机,转速为20rps-70rps,我的从串口看到最大转速显示

haiming8685 发表于 2024-12-28 18:51:37

不知道显示这个转速是不是电机的真是转速

haiming8685 发表于 2024-12-28 18:55:17

这一句也不明白请梁工帮解释一下,谢谢!

haiming8685 发表于 2024-12-28 18:56:35

这个数值是怎么得来的

haiming8685 发表于 2024-12-28 19:00:50

这是最高转素时相输出波形

梁工 发表于 2024-12-28 22:40:50

haiming8685 发表于 2024-12-28 18:55
这一句也不明白请梁工帮解释一下,谢谢!

有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,单位转/分。

梁工 发表于 2024-12-28 22:42:59

haiming8685 发表于 2024-12-28 18:51
不知道显示这个转速是不是电机的真是转速

跟磁极对有关,我的例子是针对7对磁极的,如果你的电机不是7对磁极的,则要改下计算式子的磁极对数。

梁工 发表于 2024-12-28 22:45:06

haiming8685 发表于 2024-12-28 19:00
这是最高转素时相输出波形

波形很好,对称,可以看到明显的退磁线(就是线圈反电动势,注意不是电机反电动势)。

haiming8685 发表于 2024-12-29 09:25:28

谢谢梁工!解释的很详细。

haiming8685 发表于 2024-12-29 09:27:04

我再修改一下程序调试一下看看,多谢梁工。
页: 1 2 3 4 5 6 7 8 9 [10] 11 12
查看完整版本: 三相无刷电机驱动-32G系列-无HALL-PID控制-OLED显示-串口绘图 启动改进版本