![cathy的头像 cathy的头像](https://cdn.eetrend.com/files/styles/picture200/public/letter-avatars/u-593.png?itok=XTs2kpZ8)
例程资料链接如下(群文件也可下载):
BD网盘链接:
https://pan.baidu.com/s/187ePq84u2QjE1bsVPM6i3g?pwd=9jvv
提取码:9jvv
一、实验简介
本实验是使用CW32单片机制作一个入门的遥控循迹小车。遥控采用蓝牙配合手机APP进行遥控。循迹使用一个5路的循迹模块。使用OLED模块进行显示当前小车状态。
二、实验器材
本实验使用到了CW32F030C8小蓝板、智能小车底板、电机驱动模块、OLED模块、DX-BT04-E蓝牙模块、Wch-Link下载调试器、Keil5开发环境。
二、接线图
【DX-BT04-E模块与单片机连线】:
GND<-->GND
5V<-->5V
TXD<-->PA3
RXD<-->PA2
【Wch-Link模块与单片机连线】:
GND<-->GND
RXD<-->PB8
TXD<-->PB9
【TB6612电机驱动模块与单片机连线】:
VM<-->VM
GND<-->GND
VCC<-->VCC
AO1<-->AO1
AO2<-->AO2
BO1<-->BO1
BO2<-->BO2
PWMA<-->PA15
AN2<-->PA11
AN1<-->PA12
STBY<-->3.3V
BN1<-->PB4
BN2<-->PB5
PWMB<-->PB3
【OLED模块与单片机连线】:
GND<-->GND
VDD<-->3.3V
SCK<-->PB6
SDA<-->PB7
【循迹模块与单片机连线】:
GND<-->GND
VDD<-->5V
S1<-->PA0
S2<-->PA1
S3<-->PA7
S4<-->PA8
S5<-->PC14
实验完整接线图:
四、用到的外设
1.串口2:
串口2用于蓝牙模块,使手机和单片机通过蓝牙模块进行串口透传,从 而进行点对点通信。
2.高级定时器ATIM:
初始化高级定时器CH1B和CH2B进行PWM波输出,从而达到电机调速目的。
3.基本定时器BTIM1:
初始化基本定时器1,在基本定时器中断服务函数中对循迹模块进行扫描。将扫描的结果保存,以便在循迹模式中使用。
4.IIC1:
IIC1用于外挂OLED显示模块。
五、核心代码
// 基本定时器中断回调函数 // 在回调函数中对循迹模块进行扫描,将循迹模块的状态保存进sensor_data中 void BTIM1_IRQHandler(void) { if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV)) // 判断是否是通道1中断 { BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV); // 清除中断标志位 char t = 0x00; // 设置零时变量保存灰度传感器的值 // 保存灰度传感器的值 // 采用或运算,检测到黑线将相应的位设置为1 if (!GPIO_ReadPin(TRACKING_GPIOA, TRACKING_1)) { t |= 0x08; // 00001000 左边数第一个 } if (!GPIO_ReadPin(TRACKING_GPIOA, TRACKING_2)) { t |= 0x04; // 00000100 左边数第二个 } if (!GPIO_ReadPin(TRACKING_GPIOA, TRACKING_3)) { t |= 0x02; // 00000010 左边数以三个 } if (!GPIO_ReadPin(TRACKING_GPIOA, TRACKING_4)) { t |= 0x01; // 00000001 左边数第4个 } if (!GPIO_ReadPin(TRACKING_GPIOC, TRACKING_5)) { t |= 0x10; // 00010000 左边数第5个 } sensor_data = t; // 将灰度传感器的值赋值给sensor_data } } // 串口1中断处理函数 void UART1_IRQHandler(void) { unsigned char TxRxBuffer; if (USART_GetITStatus(CW_UART1, USART_IT_RC) != RESET) { USART_ClearITPendingBit(CW_UART1, USART_IT_RC); // 清除中断标志位 TxRxBuffer = USART_ReceiveData_8bit(CW_UART1); // 将接收到的数据放入TxRxBuffer USART_RX_BUF[rxIndex] = TxRxBuffer; // 将接收到的数据放入缓冲区 if (rxIndex < USART_REC_LEN - 1) // 做数据长度的限制,留一个字节用于结束字符或者溢出检测 { // 接收到的字符包含 \n 或者 \r 结束接收 if (USART_RX_BUF[rxIndex - 1] == '\n' || USART_RX_BUF[rxIndex - 1] == '\r') { USART_RX_BUF[rxIndex] = '\0'; // 在最后一个字节加上空字符,表示字符串结束 } else { rxIndex++; } } rxIndex = 0; // 清除数据标志 flag = 1; // 清除 } }
来源:CW32生态社区
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。