本帖最后由 jinglixixi 于 2023-8-12 11:29 编辑
#申请原创# @21小跑堂
HC32L196配有串口通信功能,并可对相应的串口设备加以控制,如控制MP3播放模块及舵机等。
1. 控制MP3播放模块 这里所选用的MP3模块具有串口控制功能,其引脚分布如图1所示。 图1 引脚分布
其中: RX连接PA09,TX连接PA10。
多串口引脚配置的函数为: void App_PortInit(void)
{
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //GPIO外设模块时钟使能
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortA,GpioPin9,&stcGpioCfg);
Gpio_SetAfMode(GpioPortA,GpioPin9,GpioAf1); //配置PA09 为UART0 TX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortA,GpioPin10,&stcGpioCfg);
Gpio_SetAfMode(GpioPortA,GpioPin10,GpioAf1); //配置PA10 为UART0 RX
}
对串口的初始化函数为: void App_UartCfg(void)
{
stc_uart_cfg_t stcCfg;
stc_uart_multimode_t stcMulti;
stc_uart_baud_t stcBaud;
DDL_ZERO_STRUCT(stcCfg);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBaud);
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); //UART0外设模块时钟使能
stcCfg.enRunMode = UartMskMode3; //模式3
stcCfg.enStopBit = UartMsk1bit; //1位停止位
stcCfg.enMmdorCk = UartMskEven; //偶校验
stcCfg.stcBaud.u32Baud = 9600; //波特率9600
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; //通道采样分频配置
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); //获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART0, &stcCfg); //串口初始化
Uart_ClrStatus(M0P_UART0,UartRC); //清接收请求
Uart_ClrStatus(M0P_UART0,UartTC); //清发送请求
Uart_EnableIrq(M0P_UART0,UartRxIrq); //使能串口接收中断
Uart_EnableIrq(M0P_UART0,UartTxIrq); //使能串口发送中断
}
在使用以下程序的情况下,可得到图2所示的音量与乐曲的播放指令输出。
设置音量程序: setVolume(15);
for(j=0;j<10;j++)
{
Uart_SendDataPoll(M0P_UART0,cmd6[j]);
delay_1us(5);
}
指定乐曲播放程序: playn(i);
for(j=0;j<10;j++)
{
Uart_SendDataPoll(M0P_UART0,cmd3[j]);
delay_1us(5);
}
图2 串口测试
MP3播放控制的整体电路如图3所示,稍感不足的是HC32L196是面向低功耗和低电压的,尽管它可以控制USB转TTL功能模块,但它却无法直接带动MP3播放模块,需加一级驱动才能工作。
好在MP3播放模块除了可以用串口来控制外,还可以通过GPIO口来控制。 图3 播放电路
在配合歌单的情况下,具有串口与GPIO口控制功能的MP3播放程序为: Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
while(1)
{
if(Gpio_GetInputIO(GpioPortA, GpioPin7)==0)
{
POINT_COLOR=RED ;
showhanzi16(18,71+i*20,28);
i=(i+1)%9;
POINT_COLOR=WHITE;
showhanzi16(18,71+i*20,28);
playn(i);
Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN);
for(j=0;j<10;j++)
{
Uart_SendDataPoll(M0P_UART0,cmd3[j]); //查询方式发送数据
delay_1us(5);
}
delay1ms(200);
Gpio_SetIO(STK_LED_PORT, STK_LED_PIN);
delay1ms(300);
}
delay1ms(500);
}
2. 控制舵机 这里所用的舵机是用来控制一个可进行双维调节的云台,共有2个舵机。 为了化简控制的难度,这里有配备了一个支持串口控制的双通道PWM调节模块,为此对电机的调节控制就转化成了串口通讯的问题。 所用的PWM调节模块,要求采用9600bps的波特率通讯,PWM的工作频率为 50Hz。 为便于调节控制,是将指令存放于指令数组中,其格式为: uint8_t MLF[7]={'S','1','F','0','5','0','T'}; uint8_t MLP[7]={'S','1','D','0','0','4','T'};
其中,数组MLF[]用于存放工作频率的设置指令,而数组MLP[]则用于存放转动角度的设置指令。
用于设置工作频率的程序为: for(j=0;j<7;j++)
{
Uart_SendDataPoll(M0P_UART0,MLF[j]);
delay_1us(5);
}
在连接串口的情况下,其测试效果如图4所示。 图4 设置工作频率
用于角度调节的程序为: i=3;
while(1)
{
if(Gpio_GetInputIO(GpioPortA, GpioPin7)==0)
{
MLP[4]=i/10+'0';
MLP[5]=i%10+'0';
for(j=0;j<7;j++)
{
Uart_SendDataPoll(M0P_UART0,MLP[j]); //查询方式发送数据
delay_1us(5);
}
delay1ms(500);
i=(i+1)%13;
if(i==0) i=3;
}
delay1ms(500);
}
通过串口助手软件,其测试效果如图5所示。 图5 测试角度调节
在完成整体电路连接的情况下,其调节效果如图6至图8所示,即每按下一次用户键,则舵机就转动一个调节角度。 图6 角度调节1
图7 角度调节2
图 8角度调节3
|