【单电阻-FOC方案】,基于【车规-STC32G8K64,RMB1.7】,
=====【运放,RMB0.07】
实物图:
(两条飞线是调试时便于示波器测试用的)
电路(嘉立创EDA专业版):
STCFOC_1.zip
(336.92 KB, 下载次数: 56)
程序(KEIL5):
STCFOC-LCW1.1.zip
(130.2 KB, 下载次数: 55)
波形显示器2.2A安装包(VB6.0写的,用于显示串口数据波形):
波形显示器2.2A安装包.rar
(6.66 MB, 下载次数: 37)
注意:
1.测试时注意电源限流,本人用的是移动电源的5V供电;
2.电机只测试过两种:XXD2212(KV1000?)、杂牌1806(KV2280),均正常转动;
3.本程序未用到clarke变换、park变换,也没有什么d轴、q轴,直接根据检测感应电动势角度来设置输出电压角度,可能与正规的FOC不一样;
4.电路未考虑低功耗,运放会持续耗电,若是做手持风扇类应用,建议运放供电用IO加以控制。
参考资料: 《无感无刷直流电机之电调设计全攻略》 《PMSM 无传感器FOC 的单分流三相电流重构算法(AN1299 )》
AN1299.pdf
(994.49 KB, 下载次数: 46)
<分享一个低成本STC8H1K08无刷小电调,支持oneshot125协议> https://www.stcaimcu.com/thread-17391-1-1.html
1.原理图
MCU为STC32G8K64,利用其带死区的互补PWM功能,驱动N沟道+P沟道的MOS管,母线电流经运放放大后进ADC采样。注意,电流放大电路为反相放大,计算电流时要注意极性。为加快边沿、减小死区,建议R1、R2、R3尽量小。
2.三相电流重构 原理参考文档AN1299,我这里采用了一个笨办法: 移相,使三相PWM的后沿相差固定的2us左右的时间;为了使得ADC采样时的电平是固定的,需要限制最低脉宽和最高脉宽,如下图:
移相原理参考《STC32G系列技术手册》中的例程“20.10.16产生3路相差120度的互补PWM波形(网友提供)”,一路PWM工作于“PWM模式1”,另两路工作于“翻转模式”。代码位于“main.c\void pwma_sr(void) interrupt 26”。
采集电流使用了DMA,启动DMA的时机较为重要,建议调试时先设置固定的相电压或开环转动,进行验证,电流采准了才好进行后续工作。 3.反电势估算 引用文档AN1078,假如有一只普通的直流电机,已知电阻R、电感L、供电电压Vs,根据这些参数就能估算出电流,再根据估算电流与实际检测电流is之差,可以估算出感应电动势es。在无刷电机里,这个模型相当于其中一相,当得到两个相的感应电动势之后,就可以估算出转子(磁铁)的位置了,然后通过驱动电路产生合适的磁场令其转动。
在我的程序中,R与L是自动计算的,对绕组施加固定的电压,通过前两个电流之差得到L,通过一段时间后的稳定电流得到R(类似于阶越响应);代码位于“stcfoclcw.c\ void MotInit(void)”。 文档AN1078中,对感应电动势的估算流程如下图: 而我觉得这里有点复杂,有限幅,有校正因子Z,我的程序中作了简化,原理如下图:
代码: // Mot_IestU为U相电流估算值 // Mot_IU为U相电流检测值 // Mot_EmfU为U相估算感应电动势
err=Mot_IestU-Mot_IU;//如果估算电流大于实测电流,则感应电动势应增加 Mot_EmfU+=err*Mot_Kslide; Mot_IestU+=((S32)Vu*500-Mot_IestU*Mot_R-Mot_EmfU)/Mot_L;//电感两端电压/电感 验证的代码及效果如下图:
4.转子位置估算 通过上面的算法,得到U相与V相的感应电动势(Mot_EmfU、Mot_EmfV),经低通滤波(Mot_EmfUlp、Mot_EmfVlp),再经类似C语言atan2(反正切)的算法后,即可得到转子位置(角度)。由于两个相电压之间的相位差是120度,而不是90度,所以不能直接用atan2计算;一种方法是利用Clarke变换(AN1078中有说明)将其变为90度的相位差后用atan2计算,另一种方法是手搓查表法。我这里用的就是“另一种方法”,实现过程如下: (1)对于相差120度的波形,作除法,以绝对值大的一方作分母,放大128倍,得到结果如橙色曲线;
(2)想办法让橙色曲线单调上升,如取负值,加偏移量,得到如同tan(正切)的效果;
(3)把橙色曲线存入数组tantab[],并反向查表,即可得到类似atan的效果,得到数组atantab[];
(4)验证算法,myatan()函数输入相差120度的两个波形,得到0~255的一条斜线,效果不错;
5.转起来; 先开环转动、加速,达到一定速度后进入闭环,根据感应电动势经myatant()得到的转子位置Mot_EmfDeglg,指定输出电压角度(Mot_Vp);经测,输出电压角度随转速的提高而越发的提前于转子位置,程序中加了一点关于转速的处理。
产生三相电压时,作了一点处理,统一下移并限制最小占空比。
闭环后发送的曲线(不太好看):
其它图:
|