开箱:板子本体如上图所示,整体布局合理。
![](file:///C:\Users\wk\AppData\Local\Temp\msohtmlclip1\01\clip_image002.jpg)
![](file:///C:\Users\wk\AppData\Local\Temp\msohtmlclip1\01\clip_image004.jpg)
电路连接如上图所示:本次使用无传感器方式运行电机,仅接了3根象限,使用官方提供的foc驱动固件驱动,改动源代码内容如下所示:
电机参数修改,使用的电机是空心杯无刷直流电机,相电阻为0.100Ω,电感为0.0000160H,Kv值为:3.125,2对极。
![](file:///C:\Users\wk\AppData\Local\Temp\msohtmlclip1\01\clip_image006.jpg)
![微信图片_20250209120854.jpg 微信图片_20250209120854.jpg](data/attachment/forum/202502/09/134209zede2rcgqdne0vdc.jpg)
![1.png 1.png](data/attachment/forum/202502/09/134312tzuq8cevhxpmnlxp.png)
![3.png 3.png](data/attachment/forum/202502/09/134312kiqvs9yhvyiqkkgc.png)
![2.png 2.png](data/attachment/forum/202502/09/134312geexc4z4xc8p4xce.png)
经过测试使用官方例子电机转速能够达到的上限大约是15000RPM,功率系数在超过11000后急剧下降,仅能达到0.6左右,应该是计算不过来了。
以上为官方固件测试。
以下为反向电动势六步换向测试,测试代码含有公司保密内容,仅贴出部分内容,部分测试结果。
为方便测试将串口功能使用起来,电路中需要短接这两个电阻,
![4.png 4.png](data/attachment/forum/202502/09/134327tnh6rzvnnrsznt09.png)
注意:由于PF0和PF1两个IO开发板中连接到了外部晶振上,故需要拆除,如下图所示:
![5.png 5.png](data/attachment/forum/202502/09/134337y6zz5p8wp6633ew3.png)
由于外部晶振被拆除,如果使用官方FOC固件需要将外部晶振修改为内部晶振,详细修改方法见官方SDK包中dome中的RCM例子,连接如下https://www.geehy.com/uploads/tool/APM32M35xx_SDK_V1.0.0.zip
![6.png 6.png](data/attachment/forum/202502/09/134348gnszvfvt545int4z.png)
修改反向电动势电路:
![7.png 7.png](data/attachment/forum/202502/09/134359mlgmoq2fhf663f36.png)
数据流:
三相桥驱动方式为上桥pwm,下桥IO方式,整体框架为:
Pwm触发ADC过采样,将采样结果通过dma传输到内存,然后触发中断,在中断中处理数据,判断过零,计算30度延时等,实现换向;同时在主循环处理通讯和pi调节。
处理分为4个状态,空闲,定位,开环同步,闭环,异常1和异常2,分别处理各个状态,如下:
switch(g\_stc\_motor\_pos\_info.sta)
{
case e\_motor\_idle:
if(0 < set\_spd)
{
g\_stc\_motor\_pos\_info = g\_stc\_motor\_pos\_info\_def\_buf[0];
g\_vf\_v\_buf[0] = MAX\_DUTY\_VALUE/MAX\_V\_LEN;
for(i=1;i<=MAX\_V\_LEN;i++)
{
g\_vf\_v\_buf[i] = g\_vf\_v\_buf[i-1] + MAX\_DUTY\_VALUE/MAX\_V\_LEN;
}
g\_vf\_f\_buf[0] = MAX\_VF\_D\_VALUE-(MAX\_VF\_D\_VALUE/MAX\_F\_LEN+1);
for(i=1;i<=MAX\_F\_LEN;i++)
{
g\_vf\_f\_buf[i] = g\_vf\_f\_buf[i-1] - (g\_vf\_f\_buf[i-1]/MAX\_F\_LEN+1);
}
g\_stc\_motor\_pos\_info.sta = e\_motor\_pos;
}
else
{
g\_stc\_motor\_pos\_info.sta = e\_motor\_idle;
//g\_stc\_motor\_pos\_info.dir =
}
break;
case e\_motor\_pos:
fun\_deal\_pos(&g\_stc\_motor\_pos\_info);
break;
case e\_motor\_vf:
fun\_deal\_vf(&g\_stc\_motor\_pos\_info);
break;
case e\_motor\_cls:
//g\_stc\_motor\_pos\_info.duty = 840\*4;
fun\_deal\_cls(&g\_stc\_motor\_pos\_info);
break;
case e\_motor\_err1:
fun\_deal\_pha\_to\_output(0x00, 0x00, g\_stc\_motor\_pos\_info.dir);
if(0 == set\_spd)
{
g\_stc\_motor\_pos\_info.sta = e\_motor\_idle;
}
break;
case e\_motor\_err2:
fun\_deal\_pha\_to\_output(0x00, 0x00, g\_stc\_motor\_pos\_info.dir);
if(0 == set\_spd)
{
g\_stc\_motor\_pos\_info.sta = e\_motor\_idle;
}
break;
default:
break;
}
定位和拖动使用了特殊的方式,能够保证大约满负载77%的启动扭矩,带载测试霍尔信号和观测的霍尔信号图像如下所示:
![8.png 8.png](data/attachment/forum/202502/09/134409boop7kxf7f37z3gx.png)
该方法启动时可能导致60-90的反转,但是启动扭力较大,满足我们设备的使用要求。
稳定后始终保持60度误差,可通过程序校准:
![9.png 9.png](data/attachment/forum/202502/09/134420hb73bzghb1t7xgxa.png)
稳定运行图像。
通过测试本测试板子能够运行这个方案,但是由于是使用的adc采样的方式,受限于芯片的采样时间等的要求,最大运行转速也只能做到大约30000RPM。
最后说一下使用体验:
就芯片APM32M3514来说在兼顾成本和性能方面做的很好,同时省了一个预驱芯片,使pcb的空间得到大大的节省,非常适合各种空间受限,成本约束较严格的设备。
关于提供的foc固件,整体上手难度较低,结合APM32M3514_MOTOR EVAL无感矢量控制方案_V1.0.pdf食用,能够在极短的时间内使电机动起来;有部分问题:希望能够提供反向电动势6步换向方案的程序固件,还有就是固件中文件存在两种编码格式utf8和gb2132,建议同意一下,否则容易出现注释乱码的情况。
最后是板子:整体兼容了foc和bemf两种驱动方式,这点很好,能够验证两种方案,但是由于foc使用的模拟io占用了比较器和放大器的io导致bemf六步换相方式不能使用这部分io,最终导致高速电机不能达到最大速度,建议使用跳帽的方式切换io,释放比较器资源。