一、设备
主控:MSPM0G3507
电机驱动:TB6612
循迹:感为八路
电机:310电机
二、遇见的一些问题:
2.1 锁芯片
TI这个就很烦,我同批次买了两块最小系统板,一块被锁一块不会,被锁的那块按网上的步骤也解锁不了,只能按RST和BSL烧录,也没法步进调试,给我们代码编写过程带来了很大的不便。
2.2 串口总是会卡死
这道题最合理的方式就是得得到角度,然后进行角度PID确保路线,我们赛前买了个正点原子的IMU九轴模块,他是使用串口来通信的,TI这颗芯片不知道为什么总是会串口接收卡死,而且时会时不会,该做的清中断,等待发数据都做了,并且把接收中断优先级提升到最高,还是会出现这些情况,用STM32就不会,我们吭哧吭哧调试了两天,最后还是放弃了,还是吃了资料太少的亏。
有考虑过用MPU6050模块,他用I2C通信,最后能稳定的读数据了,但是又有零漂,没接触过,一时半会找不到办法解决,最后我们放弃角度PID的方案了,后文讲讲我们的方案。
2.3 编码器
我这颗芯片64Pin只有一个硬件编码器,所以只能采取中断的办法来获取编码器的值,值得注意的是,这种方法编码器倍频是2,STM32硬件的那种是4,部分代码如下:(在中断服务函数里)
// 中断服务函数:外部中断模拟编码器信号、按键外部中断
void GROUP1_IRQHandler(void)//Group1的中断服务函数
{
/* 获取中断信号 */
gpio_interrup = DL_GPIO_getEnabledInterruptStatus(GPIOA, ENCODERA_E1A_PIN | ENCODERA_E1B_PIN | ENCODERB_E2A_PIN | ENCODERB_E2B_PIN);
//encoderA
if((gpio_interrup & ENCODERA_E1A_PIN) == ENCODERA_E1A_PIN)
{
if(!DL_GPIO_readPins(GPIOA, ENCODERA_E1B_PIN))
g_encoder1_count--;
else
g_encoder1_count++;
}
else if((gpio_interrup & ENCODERA_E1B_PIN) == ENCODERA_E1B_PIN)
{
if(!DL_GPIO_readPins(GPIOA, ENCODERA_E1A_PIN))
g_encoder1_count++;
else
g_encoder1_count--;
}
//encoderB
if((gpio_interrup & ENCODERB_E2A_PIN) == ENCODERB_E2A_PIN)
{
if(!DL_GPIO_readPins(GPIOA, ENCODERB_E2B_PIN))
g_encoder2_count--;
else
g_encoder2_count++;
}
else if((gpio_interrup & ENCODERB_E2B_PIN) == ENCODERB_E2B_PIN)
{
if(!DL_GPIO_readPins(GPIOA, ENCODERB_E2A_PIN))
g_encoder2_count++;
else
g_encoder2_count--;
}
DL_GPIO_clearInterruptStatus(GPIOA,ENCODERA_E1A_PIN|ENCODERA_E1B_PIN|ENCODERB_E2A_PIN|ENCODERB_E2B_PIN;
}
三、方案:
我们采用速度PID + 红外循迹PID(可看我主页2022电赛C那篇文章)+ 两轮差速PID来控制小车。
速度PID:控制小车转速是为了能快速稳定的达到你预期的速度
红外循迹PID:为了控制小车能稳定的在黑线投影上
两轮差速PID:为了控制小车在空白地图可以直线行驶,因为两个轮子多少有一些转速差异,会导致小车偏移,这是为了弥补没有角度的缺陷。
四、演示视频:
题目1:
1
题目2:
2
题目3:
3
题目4:
4
五、总结
我们前期花了两天看角度串口,那两天啥也没搞出来,所以实际上这个方案只花了一天半吧,所以速度都没敢提高,而且由于没有角度,走直线还是不太稳定,容易偏移,希望这篇文章能对备战2026年省赛的师弟师妹有帮助!
需要源码可以留下你的邮箱,电赛时间很赶,代码写的很烂说实话,全局变量满天飞。
底板原理图有需要也可以发给你,基本上串口屏,OLED屏,舵机,openmv这些电赛常见外设我都有在上面画好了。
如果有用的话,希望大家帮我点个赞啦,谢谢!