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的智能车控制系统。当然,实际竞赛中还需要不断优化算法和调试参数,以达到最佳性能。
热门推荐
大便时闻到臭味,相当于吃屎?提醒:劝你别在厕所里做这个动作,真的等于“吃屎”
王者荣耀巅峰赛荣耀战力规则详解:计算方式与分数规则全解析
烘焙原料选购全攻略:从基础到装饰一文掌握
后土娘娘的来历:从神话传说中的大地之母到道教尊神
有机硅树脂为什么可以耐高温,看完你就知道了
嗓子糊痰困扰:揭秘原因,轻松应对
数字监控摄像头怎么连接显示器
保重身体问候语:温暖人心的真诚关怀
肺气肿和肺水肿的区别:从发病机制到临床表现的全面解析
公元536年的"神秘雾霾"
如何识别空头力竭?掌握这四大信号,轻松避开市场陷阱!
如何识别和避免空头陷阱?空头陷阱的特征有哪些?
铱金火花塞与铂金火花塞:性能对比与选购指南
怎么确定车是国几排放标准?不同排放标准的车有何区别?
房产证婚后加女方名字要什么费用
怀孕初期如何放松心情?先了解4个孕妇会有压力的原因
如何制定有效的美国高二留学计划
幼儿园教师简谱弹唱技能培训指南
团队领导问责如何回应他
什么材质的菜板最好最安全
社会考生参加高考和普通高考有区别吗?
血液透析内瘘维护:除了喜辽妥还有这些方法
原产地标识是什么?如何正确使用和展示?
什么是原产地证书?
鸡尾酒装饰教程
呼吸碱中毒的症状表现
防火保险箱必学选购指南:揭秘防火等级与安全防护
增重容易减重难?健康生活方式来支招
福州汤里的乾坤
保持FITC荧光标记抗体完整性:存储和操作建议