Funpack5-1 - 基于NXP MCXA346实现三相无刷电机FOC控制
该项目使用了NXP MCXA346,实现了三相无刷电机驱动的设计,它的主要功能为:驱动三相无刷电机,可实现控制位置、速度、模拟旋钮。
标签
嵌入式系统
Funpack活动
开发板
游泳的鸟儿
更新2026-03-13
福州大学
22

一.项目介绍

基础题目:使用MCXA346开发板的高分辨率ADC,采集电压数据并显示。

进阶题目:使用MCXA346开发板和电机驱动板,实现三相无刷电机驱动。

题目如上,基础题目直接调用ADC外设即可,非常简单;进阶题目除了本次的开发板,还需要用到电机驱动板,由于MCXA346是2月初才到货,快要寒假了,没时间再画和调试电机驱动板了,所以直接使用TI的drv8305 BOOSTXL模块驱动电机。三相去刷电机可以用有感和无感控制,无感驱动相对硬件简单,但是无法实现零速控制、静态控制。为了实现用电机模拟旋钮的功能,故采用磁编码器有感控制。

二.硬件介绍

主控使用恩智浦的A346控制器。做电力电子主要关注控制器的ADC和PWM两大外设,该控制器支持16位高达3MSPS的ADC,在PWM上也有8对输出,足以应对一般的电力电子应用。除此之外还关注到其150MHz的主频,内部具有浮点运算单元等,足以应对电力电子中的三角函数、浮点运算等。

BOOSTXL-DRV8305EVM - DRV8305N 三相电机驱动 BoosterPack 评估模块 (top board image)

电机驱动板使用drv8305。个人比较喜欢德州仪器的几款电机驱动芯片,比如drv8301、drv8305、drv8323、drv8350。这几款驱动芯片内置只能驱动,可以设置mos管推拉电流,不需要像传统的驱动一样加上驱动电阻等,可以直连MOS。其次drv8305内置3个电流放大器,对MOS管下管连接的采样电阻两端电压放大,且可以设置10倍、20倍、40倍、80倍放大倍数。由于我的drv8305 BOOSTXL板子是自己焊的,取样电阻用的是10mR,而三相无刷电机是小云台电机,电流小,即使80倍放大ADC采样出来还是很小。故我使用6V的驱动电压去驱动电机,保证电机不发烫的情况下让同功率下电流尽量大点,勉强电流采样符合要求。

image.png

有感驱动的传感器使用MT6701,该传感器支持正交编码器输出、SPI输出、I2C输出,挺好用的。

硬件连接:

A346 -> drv8305 BOOSTXL A346 -> MT6701

P3_12 -> PWMHA P3_8 -> A

P3_13 -> PWMLA P3_9 -> B

P3_14 -> PWMHB P3_11 -> I

P3_15 -> PWMLB

P3_16 -> PWMHC

P3_17 -> PWMLC

P4_7 -> ENGATE

P2_5 -> ISENA

P1_14 -> ISENB

P1_0 -> SDI

P1_1 -> SCLK

P1_2 -> SDO

P1_3 -> SCS

P3_12 -> PWMHA

P3_13 -> PWMLA

P3_14 -> PWMHB

P3_15 -> PWMLB

P3_16 -> PWMHC

P3_17 -> PWMLC

P4_7 -> ENGATE

P2_5 -> ISENA

P1_14 -> ISENB

P1_0 -> SDI

P1_1 -> SCLK

P1_2 -> SDO

P1_3 -> SCS

三.程序设计

对于基础题目,直接ADC外设配置成16位,读取的到结果ADC_Result利用ADC_Result/65536*3.3即可计算出电压值。

下面的篇幅将介绍有感FOC驱动三相电机。本科时候学过永磁同步电机控制,常用的方法是id=0的控制方法,iq不为0,需要实时控制大小以实现控制转矩,这样磁场始终以90°牵着永磁转子跑,效率最高。

image.png

放上一张最经典的有感foc控制框图。图上有电流环和速度环,暂时没画位置环。分析控制框图都是从内环到外环来看,内环是电流环。利用位置传感器(磁编码器)得到电机转子的位置,三相电流isA、isB、isC经过Clark变换得到isα和isβ两相正交电流,根据位置传感器的信息利用Park变换把两相电流放到旋转坐标系中得到的就是直流量id和iq。在id=0算法中,id的给定为0,iq的给定为需要的力矩,经过电流控制器ACR闭环控制得到usq和usd给定值,再经过逆Park和逆Clark变换给SVPWM转成空间矢量正弦波,就可以把pwm信号给drv8305驱动mos管了。

iq的物理表征为力矩大小,如果需要控制电机力矩,直接给不同的iq给定值即可。如果需要控制电机的速度,就再加上一个速度环,速度环的输出为力矩大小,即iq。如果需要控制位置,则在速度环外面再套一个位置环,输出为速度给定值,这样就是最经典的电机三环控制。

基本原理如上,下面开始编写控制程序。对于这类实时控制,程序的大框架都是固定控制周期进行控制。PWM配置成25kHz,同时利用PWM去触发ADC,ADC采样结束后会触发中断,在中断中则是按照框图进行编程。读取电流ADC值、读取编码器角度、计算速度,对电流进行Clark、Park变换,位置环、速度环、电流环,逆Park变换、逆Clark变换,SVPWM计算,更新PWM。

 				A_current=(adc_result0.convValue>>3)-adc_result0_offset;
B_current=(adc_result2.convValue>>3)-adc_result2_offset;

ia=A_current*(1.0f/4095.0f);
ib=B_current*(1.0f/4095.0f);//电流归一化

电机三根线,根据基尔霍夫电压定律,ia+ib+ic=0,所以仅需采样两个电流即可。

				ialph=ia;//clark变换
ibeta=_1divsqrt3*(2*ib+ia);

id=ialph*cos_ElectricalAngle+ibeta*sin_ElectricalAngle;//park变换
iq=-ialph*sin_ElectricalAngle+ibeta*cos_ElectricalAngle;

Clark变换与Park变换,套公式即可

				V_ref=increment_pid(angle_ref-now_angle,0.05,-0.05,&PID_Angle);//位置闭环
iq_give=increment_pid(V_ref-VVV,0.03,-0.03,&PID_V);//速度闭环

uq_give=increment_pid(iq_give-iq,0.7,-0.7,&PID_Iq);
ud_give=increment_pid(0-id,0.7,-0.7,&PID_Id);

ualph_give=ud_give*cos_ElectricalAngle-uq_give*sin_ElectricalAngle;
ubeta_give=ud_give*sin_ElectricalAngle+uq_give*cos_ElectricalAngle;

位置环、速度环和电流环利用PI控制器即可。之后利用逆Park变换得到isα和isβ。

void SVPWM(float uap,float ube){
float U_DC_1,Ualpha,Ubeta,dutyA,dutyB,dutyC,min,max,max_1;
U_DC_1=5.5f/6;
Ualpha=uap*U_DC_1;
Ubeta=ube*U_DC_1;

dutyA=0;
dutyB=dutyA-1.2247f*Ualpha+0.7071f*Ubeta;
dutyC=dutyA-1.2247f*Ualpha-0.7071f*Ubeta;

min=dutyA;
if(min>dutyB)min=dutyB;
if(min>dutyC)min=dutyC;
if(min<0.0f){
dutyA=dutyA-min;
dutyB=dutyB-min;
dutyC=dutyC-min;
}

max=dutyA;
if(max<dutyB)max=dutyB;
if(max<dutyC)max=dutyC;
if(max>0.9f){
max_1=0.9/max;
dutyA=dutyA*max_1;
dutyB=dutyB*max_1;
dutyC=dutyC*max_1;
}

/* Update duty cycles for all 3 PWM signals */
PWM_UpdatePwmDutycycleHighAccuracy(FLEXPWM1_PERIPHERAL, kPWM_Module_0, kPWM_PwmA, kPWM_CenterAligned, ((65535U * dutyC*100.0f) + 50U) / 100U);
PWM_UpdatePwmDutycycleHighAccuracy(FLEXPWM1_PERIPHERAL, kPWM_Module_1, kPWM_PwmA, kPWM_CenterAligned, ((65535U * dutyB*100.0f) + 50U) / 100U);
PWM_UpdatePwmDutycycleHighAccuracy(FLEXPWM1_PERIPHERAL, kPWM_Module_2, kPWM_PwmA, kPWM_CenterAligned, ((65535U * dutyA*100.0f) + 50U) / 100U);
/* Set the load okay bit for all submodules to load registers from their buffer */
PWM_SetPwmLdok(FLEXPWM1_PERIPHERAL, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
}

SVPWM和逆Clark变换代码如上。使用计算法可以直接得到三相的占空比,相比传统的扇区判断的方法速度更快。

至此,三相永磁同步电机的基本三环控制已完成,下面将展示使用电机制作旋钮。

				 float target=(float)round(now_angle*1.2732395f)*0.7853982f;//target=round(now_angle/(45.0f*3.141592653587f/180.0f))*(45.0f*3.141592653587f/180.0f);
iq_give=kp1*(target-now_angle);

旋钮一般都有很多档,会自然地卡在特定位置,当偏离位置是会自动回位,当转过分界线时会自动回位到下一档。因此利用round四舍五入函数,可以自然地让旋钮找到稳定的位置。只需要电流环单环,控制电机的力矩,当电机偏移稳定位置时,力矩随着偏移的变大而变大,当电机越过分界线时,则力矩随着偏移下一个稳定位置而变。

				 iq_give=-kp2*VVV;
if(iq_give>0.5f)iq_give=0.5f;
if(iq_give<-0.5f)iq_give=-0.5f;

阻尼模式,用手转动电机,会感到明显的阻尼感,其原理就是控制电机反向的力矩随着速度而变,速度越大反向力矩越大。

 				 iq_give=kp3*VVV;
if(iq_give>0.03f)iq_give=0.03f;
if(iq_give<-0.03f)iq_give=-0.03f;

润滑模式,用手轻转电机,电机会顺滑地向前转并慢慢停,其原理是控制电机正向力矩随电机速度而变,速度越小正向力矩越小,电机自然慢慢挺住。该模式可用来制作抽奖转盘。

				 if(now_angle<0.0f)iq_give=kp4*(0.0f-now_angle);
if(now_angle>3.0f)iq_give=kp4*(3.0f-now_angle);
if(iq_give>0.03f)iq_give=0.03f;
if(iq_give<-0.03f)iq_give=-0.03f;

有边界的旋钮模式。在一定范围内可以自由用手转动,当到达预设边界时,随着偏离边界越远力矩越大。

至此,四种好玩的旋钮模式也实现了。

四、功能展示图

IMG_20260220_125404.jpg

image.png

以上的各个模式目前是通过Xpress里的调试模式里对变量的改变来实现控制。调试模式下运行,在Global Variables功能框中,更改mode的值可以改变模式。mode=0是位置控制模式,改变angle_ref角度可以改变电机固定的角度,角度的单位是弧度值。mode=1是速度模式,改变V_ref可以改变目标速度值。mode=2是旋钮模式、mode=3是阻尼模式、mode=4是润滑模式、mode=5是旋钮边界模式。由于时间紧,目前只是用调试模式来控制,以后进一步完善代码,也可以使用串口和can进行控制。

五、项目中遇到的难题和解决方法

难题一:最初在上手开发板时,配置spi没有配好,把引脚配到了jtag脚上,烧录进去就导致mcu无法连接调试器了。

解决方法:利用恩智浦的MCUXpress Secure Provisioning软件,通过串口对芯片flash全擦,这样又可以连接调试器了。

难题二:利用图形化配置,配置flepwm触发lpadc时,老是无法触发。

解决方法:经过自己研究例程,发现其有一句inputmux的程序,而图形化无法配置inputmux。所以手写了配置inputmux的车光绪即可。

六:心得体会

本次体验了大名鼎鼎的恩智浦的MCU,图形化配置还是很方便的降低了上手门槛。A346定位时电机控制和电源控制,其flepwm数量足够,但是功能相比TI的c2000或ST的G474、F334来比还是存在不足。但是A346的16位ADC还是很吸引人的。总体而言,在追求高精度输出的电力电子应用上还是值得使用A346的。

附件下载
frdmmcxa346_FOC.zip
团队介绍
游泳的鸟儿
团队成员
游泳的鸟儿
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号