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的智能车控制系统。当然,实际竞赛中还需要不断优化算法和调试参数,以达到最佳性能。
热门推荐
十分钟的奇迹:日常简单运动助你健康升级
ENTP人格类型全解析:特点、优缺点及工作表现
业务招待费引起的涉税风险
二战各国步枪对比,历史、性能与设计理念
刘诗诗《掌心》首播热评解析:女性复仇悬疑剧的突围与争议
鲁迅人物介绍:从生平到写作风格的全面解读
考研对于个人职业规划和长远发展有何具体影响?
炮进三兵,开局必胜技巧(详解中炮进三兵的正确使用方法)
津门虎为什么要“囤积”边锋?
《三命通会》:五月紫火中,青龙要腾空。天乙贵人运到,得助
科普 | 半导体常用材料——硅的特性介绍
如何做好美国留学自我介绍
睡眠时间表:如何制定和调整适合自己的睡眠计划
封神演义中的元始天尊:法宝虽不显眼,但防御与预知能力堪称一绝
酒店OTA运营指南:提升流量与转化率的关键策略
生化危机人物小传:阿莱克西亚·阿什福德
曼巴精神永恒不灭:科比如何改变篮球世界!
如何优化App版本更新服务器以提高用户体验?
星座与沟通:改善你的交流技巧
如何进行抑郁症的医学检查?医生会进行哪些诊断步骤?
愚昧?无奈?清政府在日俄战争中如此作为,你怎么看?
射频工程师职业规划指南
龙珠:比克大魔王的最初设定是什么?龙珠大魔中预留的伏笔开始揭晓了
预防疾病致残,共享健康生活——开展第八个全国“残疾预防日”系列宣传教育活动
国产替代加速:光刻机产业链国内厂商梳理
租房水电费计算方法及注意事项
心脏不舒服去医院检查什么项目
金木水火土五行学说:属性、相生相克与命理应用详解
如何预防孩子网络沉迷?这些建议用起来
供应链优化策略:降低成本,提升效率,打造竞争优势