【DigiKey&NXP】 NXP FRDM MCXA153 直流无刷电机控制测试

一、直流无刷电机
有刷电机通过碳刷和换向器的物理接触来改变绕组中的电流方向,从而让转子持续旋转。但这个结构存在摩擦、火花、噪音和寿命短等问题。
直流无刷电机从根本上取消了碳刷和换向器。它的定子是线圈(电枢),转子是永磁体。通过电子换向来实现转动:控制器通过霍尔传感器或反电动势检测转子的当前位置。根据转子的位置,控制器以精确的顺序向定子的各相绕组通电。定子绕组产生的磁场吸引或排斥转子的永磁体,从而驱动转子持续旋转。
直流无刷电机是一种高性能的电机,它结合了直流电机优良的调速性能和交流电机结构简单、维护方便的优点。广泛应用于各个领域。
二、电机驱动
选用L293D来用于电机驱动。是一款非常经典且常用的双H桥电机驱动芯片。它的核心功能是接收来自微控制器(如Arduino, Raspberry Pi, STM32等)的微弱控制信号,然后驱动更大功率的负载(如直流电机、步进电机等)。
该芯片可同时驱动两个直流电机的正转、反转和速度(通过PWM)。可驱动一个双相四线步进电机,精确控制步进电机的步进角度和方向。
具有隔离和保护功能,将控制电路和电机动力电路隔离开,防止电机产生的反向电动势和噪声损坏精密的微控制器。
L293D的每个通道可以提供高达600mA的峰值电流,持续工作电流约400-500mA。
本次测试接线如下

电机接入L293D的OUT1和OUT2。P3_9(IN1)和P3_11(IN2)的高低电平用于控制电机的转向,比如P3_9(高)和P3_11(低)电机正向, 那么P3_9(低)和P3_11(高)则电机反向,P3_9(低)和P3_11(低)电机自由停止,P3_9(高)和P3_11(高)电机刹车。P3_6接入PWM调压用于控制电机转速。这几个引脚都是从开发板的J3接口引出。
三、代码实现
引脚的功能定义,初始化了输出引脚,定义了IO的输出高低电平。
#define EN1_INIT(output)
GPIO_PinWrite(BOARD_EN1_GPIO, BOARD_EN1_GPIO_PIN, output);
BOARD_EN1_GPIO->PDDR |= (1U << BOARD_EN1_GPIO_PIN)
#define EN1_ON()
GPIO_PinWrite(BOARD_EN1_GPIO, BOARD_EN1_GPIO_PIN, LOGIC_LED_ON)
#define EN1_OFF()
GPIO_PinWrite(BOARD_EN1_GPIO, BOARD_EN1_GPIO_PIN, LOGIC_LED_OFF)
#define EN2_INIT(output)
GPIO_PinWrite(BOARD_EN2_GPIO, BOARD_EN2_GPIO_PIN, output);
BOARD_EN2_GPIO->PDDR |= (1U << BOARD_EN2_GPIO_PIN)
#define EN2_ON()
GPIO_PinWrite(BOARD_EN2_GPIO, BOARD_EN2_GPIO_PIN, LOGIC_LED_ON)
#define EN2_OFF()
GPIO_PinWrite(BOARD_EN2_GPIO, BOARD_EN2_GPIO_PIN, LOGIC_LED_OFF)

引脚初始化,定义IO口的port和pin
#define BOARD_INITPINS_EN1_GPIO GPIO3
#define BOARD_INITPINS_EN1_GPIO_PIN 9U
#define BOARD_INITPINS_EN1_GPIO_PIN_MASK (1U << 9U)
#define BOARD_INITPINS_EN1_PORT PORT3
#define BOARD_INITPINS_EN1_PIN 9U
#define BOARD_INITPINS_EN1_PIN_MASK (1U << 9U)
#define BOARD_INITPINS_EN2_GPIO GPIO3
#define BOARD_INITPINS_EN2_GPIO_PIN 11U
#define BOARD_INITPINS_EN2_GPIO_PIN_MASK (1U << 11U)
#define BOARD_INITPINS_EN2_PORT PORT3
#define BOARD_INITPINS_EN2_PIN 11U
#define BOARD_INITPINS_EN2_PIN_MASK (1U << 11U)

控制代码实现,实现4路PWM输出,本项目中只用到一路PWM,
PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_0, &faultConfig);
PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_1, &faultConfig);
PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_2, &faultConfig);
PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_3, &faultConfig);
PWM_SetupFaultDisableMap(BOARD_PWM_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_faultchannel_0,
kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);
PWM_SetupFaultDisableMap(BOARD_PWM_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_faultchannel_0,
kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);
PWM_SetupFaultDisableMap(BOARD_PWM_BASEADDR, kPWM_Module_2, kPWM_PwmA, kPWM_faultchannel_0,
kPWM_FaultDisable_0 | kPWM_FaultDisable_1 | kPWM_FaultDisable_2 | kPWM_FaultDisable_3);

PWM_DRV_Init3PhPwm();
PWM_SetPwmLdok(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
PWM_StartTimer(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2);
while (1U)
{
SDK_DelayAtLeastUs((1000000U / APP_DEFAULT_PWM_FREQUENCY) * 100, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
pwmVal = pwmVal + 4;
if (pwmVal > 100)
{
pwmVal = 4;
}
PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_0, kPWM_PwmA, kPWM_SignedCenterAligned, pwmVal);
PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_SignedCenterAligned, (pwmVal >> 1));
PWM_UpdatePwmDutycycle(BOARD_PWM_BASEADDR, kPWM_Module_2, kPWM_PwmA, kPWM_SignedCenterAligned, (pwmVal >> 2));

    PWM_SetPwmLdok(BOARD_PWM_BASEADDR, kPWM_Control_Module_0 | kPWM_Control_Module_1 | kPWM_Control_Module_2, true);
}

测试直流电机的视频如下:

三、小结
通过定义P3_6为PWM,定义P3_9和P3_11为IO功能,实现了电机控制。在NXP提供的PWM例程中提供了3个频率的IO输出,稍加修改就可以用于控制直流电机转速。