1. 系统架构设计思路
做电赛视觉追踪系统,最关键的是要理清整个数据流的架构。我自己在调试过程中发现,很多队伍一开始没想明白数据怎么流动,结果做到一半各种问题就冒出来了。这里给大家分享一个经过实战验证的架构方案。
整个系统可以分为三个主要模块:图像采集模块(OpenMV)、核心控制模块(STM32F103)和执行机构模块(云台舵机)。OpenMV负责识别目标并获取坐标,通过串口将数据发送给STM32;STM32接收到坐标数据后,通过PID算法计算出舵机需要的PWM信号;最后驱动云台舵机转动,实现实时追踪。
为什么要用STM32F103?其实很简单,这款芯片性价比高,资源足够,而且标准库开发起来特别顺手。对于电赛这种对成本敏感的场景,F103系列完全能够胜任。我实测过,在72MHz的主频下,处理OpenMV传过来的坐标数据并运行PID算法,完全不会有性能瓶颈。
注意:OpenMV和STM32之间的供电一定要稳定。我最初用了一个廉价的LDO,结果电机一转电压就被拉低,导致OpenMV不断重启。后来换了个最大电流3A的稳压模块,问题就解决了。
2. 串口通信协议设计
串口通信是整个系统的"大动脉",这里要是出问题,后面全都白搭。我参考了江科大的代码框架,但做了重要改进来适应电赛的特殊需求。
OpenMV端发送的数据格式很重要。我们用的是FF x,y FE这样的结构,其中x和y是目标物体的坐标值。为什么选这个格式?因为0xFF和0xFE在正常坐标数据中出现的概率很低,可以有效避免数据帧混淆。
在STM32端,我们需要编写一个可靠的数据解析程序。这里我用的是状态机的方式,比简单的判断首尾字节更加可靠:
void USART1_IRQHandler(void)
{
static uint8_t RxState = 0; // 状态机状态
static uint8_t pRxPacket = 0; // 数据包位置
if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
{
uint8_t RxData = USART_ReceiveData(USART1);
switch (RxState)
{
case 0: // 等待包头
if (RxData == 0xFF)
{
RxState = 1;
pRxPacket = 0;
}
break;
case 1: // 接收数据
if (RxData == 0xFE) // 收到包尾
{
RxState =


1589

被折叠的 条评论
为什么被折叠?



