STM32F103玩转智能车控制,你get了吗?
创作时间:
作者:
@小白创作中心
STM32F103玩转智能车控制,你get了吗?
引用
CSDN
等
9
来源
1.
https://blog.csdn.net/a11111ccc/article/details/113761005
2.
https://wenku.csdn.net/answer/7b178e7c2ba54b69a5431493e19acad4
3.
https://zhuanlan.zhihu.com/p/595886872
4.
https://blog.csdn.net/qq_67153941/article/details/142428709
5.
https://blog.csdn.net/weixin_44690557/article/details/125607583
6.
https://blog.csdn.net/m0_52679677/article/details/118682023
7.
https://cloud.baidu.com/article/3390774
8.
https://juejin.cn/post/7112239216871866382
9.
https://bbs.elecfans.com/jishu_1865112_1_1.html
@[01]{color}### 硬件搭建与选型
核心硬件选型
- 主控芯片:STM32F103ZET6(64引脚LQFP封装)
- 电机驱动:L298N模块(支持双路直流电机)
- 传感器:
- 红外避障传感器(5路)
- MPU6050六轴陀螺仪
- CCD摄像头(可选)
- 电源:18650锂电池*2(7.4V输出)
电路焊接要点
- 电源模块:使用LM2596将7.4V降至5V,供主控板使用
- 信号隔离:电机电源与控制信号电源需完全隔离
- 抗干扰设计:PWM信号线加磁环,减少电磁干扰
硬件连接示意图
@[02]{color}### 基础控制实现
电机控制代码示例
#include "stm32f10x.h"
#define MOTOR_PIN1 GPIO_Pin_0
#define MOTOR_PIN2 GPIO_Pin_1
#define MOTOR_TIM TIM3
void motor_init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 使能GPIO和定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 配置GPIO引脚为复用推挽输出
GPIO_InitStructure.GPIO_Pin = MOTOR_PIN1 | MOTOR_PIN2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置定时器
TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// 配置PWM输出
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
// 使能定时器
TIM_Cmd(TIM3, ENABLE);
}
void set_motor_speed(int speed) {
if (speed > 0) {
TIM_SetCompare1(TIM3, speed);
TIM_SetCompare2(TIM3, 0);
} else {
TIM_SetCompare1(TIM3, 0);
TIM_SetCompare2(TIM3, -speed);
}
}
红外避障传感器读取
uint8_t read_infrared_sensor(uint8_t channel) {
GPIO_InitTypeDef GPIO_InitStructure;
uint8_t value = 0;
// 配置GPIO为输入模式
GPIO_InitStructure.GPIO_Pin = 1 << channel;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 读取传感器状态
value = GPIO_ReadInputDataBit(GPIOB, 1 << channel);
return value;
}
@[03]{color}### 调试与测试
串口打印调试
#include "usart.h"
void debug_print(char *format, ...) {
va_list args;
va_start(args, format);
vsprintf((char *)tx_buffer, format, args);
USART_SendData(USART1, (uint8_t *)tx_buffer, strlen((char *)tx_buffer));
va_end(args);
}
上位机开发
使用Qt Creator开发上位机,实现以下功能:
- 实时图像传输
- 波形显示
- 参数调节
上位机与下位机通过串口或无线模块通信,可以实时查看传感器数据、调整PID参数等。
PID参数调优
使用Ziegler-Nichols法则进行PID参数整定:
- 先将Ki和Kd设为0,调整Kp使系统振荡
- 记录临界增益Kc和临界周期Tc
- 根据经验公式计算PID参数
无线调试方案
使用2.4GHz无线模块(如nRF24L01)实现无线数据传输,可以远程监控车辆状态和调整参数。
通过以上步骤,你可以快速搭建一个基于STM32F103的智能车控制系统。当然,实际竞赛中还需要不断优化算法和调试参数,以达到最佳性能。
热门推荐
蒋介石重庆谈判期间的“作秀”表现
Excel中CAGR的计算方法与应用
信仰对于人生的意义是什么(信仰,不可或缺的人生力量)
你的梦境,可能在警告你这些健康问题,别再不当回事!
2024年厦门大学高考录取分数线:最低490分能上
中医养生秘诀:咳嗽日常调理与预防
Spring Boot版本和JDK版本的依赖关系
治疗失眠的土方法是什么?自然简便的失眠调理技巧推荐!
法线方程的求法及其在几何中的应用解析
中考考生该如何放下心理包袱
工资延迟多久算违法?延迟复工薪资怎么算?
农村网格员一月多少钱?是你想象不到的
慢阻肺合并心血管疾病:风险评估与治疗策略的最新进展
老人飞蚊症是怎么引起的原因
能救命的家庭急救箱,必须满足这7个标准!速查你家达标没
探索心灵深处:弗洛伊德心理学与治疗的奥秘
掌握一技之长,成就更好的自己
医院出的伤情鉴定有效吗
中医现代师承制度研究
鱼缸里的小精灵:观赏虾的养护与观赏价值
2024年中国药食同源大健康产业消费洞察与产业发展分析报告
AI智能创作:诗歌、文学与人工智能的跨界融合实践
车险理赔争议:厘清责任与损失,公正化解赔偿纠纷
小型工商业光伏收益分析
天冷转冷皮肤过敏荨麻疹易多发,抓紧做一件事
尼泊尔文化之旅:探访加德满都古城, 感受古老印度教与佛教的和谐共存
手抖应该如何应对与预防
治愈系美食剧《深夜食堂》的艺术价值和社会价值
AI数字人直播领域的革新应用,AI数字人短视频的兴起有哪些影响?
智能算力:引领未来科技革命的新动力