在上两贴中,已经选好了电机、驱动器、蓝牙模块,已经定义了接口连接。这一贴将开始程序编写。
五、NXP MCXA153的PWM
MCXA153的脉冲宽度调制(PWM)模块包含多个PWM子模块,每个子模块用于控制一个半桥功率级。该模块支持故障通道功能,能够生成多种开关模式,包括高度复杂的波形,适用于控制所有已知的开关模式电源(SMPS)拓扑结构。本项目通过eFlexPWM生成两路PWM信号,分别由子模块0、子模块1实现。子模块0可生成一对互补PWM:PWM A和PWM B。PWM A设置为1kHz频率、50%占空比,采用SignedCenterAligned(符号中心对齐)模式工作。PWM B以PWM A的互补模式运行,因此其占空比字段无需单独设置。为防止短路,设置了约650ns的死区时间。MasterSync模式下,子模块0可作为主模块生成控制信号来协调其他模块的工作。本程序采用中心对齐PWM模式,通过修改pwmVal值可调整PWM的占空比和相位位置。具体配置为:子模块0占空比为pwmVal;子模块1占空比为pwmVal的1/2。PWM_SetPwmLdok()可同时向多个子模块发出加载命令。若配置时选择kPWM_ReloadImmediate选项,数值将立即加载;否则将在下一个PWM重载点加载。
六、代码实现
1)PWM输出
PWM_SetupFaults(BOARD_PWM_BASEADDR, kPWM_Fault_0, &faultConfig);
PWM_SetupFaults(BOARD_PWM_BASEADDR,kPWM_Fault_1,&faultConfig); PWM_SetupFaultDisableMap(BOARD_PWM_BASEADDR, kPWM_Module_0, kPWM_PwmA,
kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 );
PWM_SetupFaultDisableMap(BOARD_PWM_BASEADDR, kPWM_Module_1, kPWM_PwmA, kPWM_faultchannel_0, kPWM_FaultDisable_0 | kPWM_FaultDisable_1 );
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);
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));
2)串口中断接收蓝牙数据
void DEMO_LPUART_IRQHandler(void)
{
uint8_t data;
uint16_t tmprxIndex = rxIndex;
uint16_t tmptxIndex = txIndex;
/* If new data arrived. */
if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(DEMO_LPUART))
{
data = LPUART_ReadByte(DEMO_LPUART);
/* If ring buffer is not full, add data to ring buffer. */
if (((tmprxIndex + 1) % DEMO_RING_BUFFER_SIZE) != tmptxIndex)
{
demoRingBuffer[rxIndex] = data;
rxIndex++;
rxIndex %= DEMO_RING_BUFFER_SIZE;
}
}
SDK_ISR_EXIT_BARRIER;
}
3)电机控制
while (kLPUART_TxDataRegEmptyFlag & LPUART_GetStatusFlags(DEMO_LPUART))
{
if( demoRingBuffer[1] == ‘1’) //run
{
port3_7_pin43_OFF(); port3_6_pin44_OFF();
for(uint8_t i=0;i<100;i++);
EN1_ON(); EN2_OFF(); EN3_ON(); EN4_OFF();
}
else if( demoRingBuffer[1] == ‘2’) // back
{
port3_7_pin43_OFF(); port3_6_pin44_OFF();
for(uint8_t i=0;i<100;i++);
EN1_OFF(); EN2_ON(); EN3_OFF(); EN4_ON();
}
else if(demoRingBuffer[1] == ‘3’) // left
{
port3_7_pin43_OFF(); port3_6_pin44_OFF();
for(uint8_t i=0;i<100;i++);
EN1_OFF(); EN2_OFF(); EN3_ON(); EN4_OFF();
}
else if( demoRingBuffer[1] == ‘4’) // right
{
port3_7_pin43_OFF(); port3_6_pin44_OFF();
for(uint8_t i=0;i<100;i++);
EN1_ON(); EN2_OFF(); EN3_OFF(); EN4_OFF();
}
else if( demoRingBuffer[1] == ‘0’) // stop
{
port3_7_pin43_OFF(); port3_6_pin44_OFF();
}
demoRingBuffer[1] = 0;
}
测试蓝牙小车的视频如下:分别测试前进,后退,左转,右转
七、小结
在本项目通过手机端软件与小车的蓝牙通信实现了小车的前进、后退、左转、右转。NXP MCXA153开发板的资源使用了IO功能,PWM功能,串口中断功能。在PWM功能的测试过程中花了较多时间,其他功能相对简单不少。
