当前位置: 首页 > news >正文

项目:循迹避障小车V5——基于STM32F103C8的循迹避障小车设计 设计;proteus ...

项目:循迹避障小车V5——基于STM32F103C8的循迹避障小车设计 设计;proteus 仿真(版本8.15-可提供软件安装包) 主控:STM32F103C8 外设:数码管,红外循迹传感器,红外避障传感器,电机L298N,按键 功能: 1. 2 路红外循迹 2. 2 路红外避障 3. 4 路PWM 调速控制 4. 数码管显示运行模式 5. L298N电机驱动(2轮) 程序:C语言,KEIL工程(注释详细,工程目录清晰,代码格式明了) 服务:可讲解代码,电路原理,如需实物可加工制作(费用另算) 本条包括:c语言(keil工程)+proteus仿真文件 注:stm32仿真版本为 8.15

最近在捣鼓一个基于STM32的智能小车项目,核心目标是让铁疙瘩能自己找路还不撞墙。这次用STM32F103C8做主控,Proteus仿真跑通了全流程,实测效果能稳定实现双红外循迹+避障,顺手还加了数码管状态显示,今天就把核心代码和实现思路掰开了说。

硬件配置走一波

直接上图(假装有接线图):两个红外循迹模块接PA0和PA1,避障传感器挂PA4和PA5,数码管用74HC595驱动接SPI接口,L298N的电机控制脚接PB6~PB9,PWM调速用TIM3的四个通道。这里有个坑——Proteus里L298N的使能端必须接高电平,不然电机打死不转。

先看电机驱动的骚操作

//TIM3初始化PWM void Motor_PWM_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler = psc; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //四个通道全开 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_OC3Init(TIM3, &TIM_OCInitStructure); TIM_OC4Init(TIM3, &TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); }

这段配置实现了四路PWM输出,重点在于TIMCtrlPWMOutputs这个函数——STM32F103的定时器需要显式开启PWM输出,新人特别容易漏这个导致没波形。调速时直接改CCRx寄存器的值,比如TIMSetCompare1(TIM3, speed)就能实时调整占空比。

项目:循迹避障小车V5——基于STM32F103C8的循迹避障小车设计 设计;proteus 仿真(版本8.15-可提供软件安装包) 主控:STM32F103C8 外设:数码管,红外循迹传感器,红外避障传感器,电机L298N,按键 功能: 1. 2 路红外循迹 2. 2 路红外避障 3. 4 路PWM 调速控制 4. 数码管显示运行模式 5. L298N电机驱动(2轮) 程序:C语言,KEIL工程(注释详细,工程目录清晰,代码格式明了) 服务:可讲解代码,电路原理,如需实物可加工制作(费用另算) 本条包括:c语言(keil工程)+proteus仿真文件 注:stm32仿真版本为 8.15

循迹避障的决策逻辑

void Track_Decision(void) { //读取传感器状态 uint8_t track_L = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0); uint8_t track_R = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1); uint8_t obstacle_L = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4); uint8_t obstacle_R = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5); //避障优先级最高 if(obstacle_L || obstacle_R){ Motor_Stop(); Buzzer_Alert(); return; } //循迹策略 if(!track_L && !track_R){ Motor_Forward(80); //全速前进 }else if(track_L && !track_R){ Motor_Turn_Left(60); //左轮减速实现左转 }else if(!track_L && track_R){ Motor_Turn_Right(60); }else{ Motor_Stop(); //异常情况急停 } }

这个状态机实现了三层决策:避障>循迹>停止。注意这里用了非阻塞式检测,实际部署时要加软件防抖。遇到同时触发双障碍的情况,直接刹车+蜂鸣告警,比原地打转更安全。

数码管显示的花式玩法

//模式显示编码 const u8 mode_code[] = { 0x3F, //0:停止 0x06, //1:前进 0x5B, //2:左转 0x4F, //3:右转 0x66 //4:警报 }; void Display_Mode(uint8_t mode) { static uint8_t pos=0; HC595_SendByte(1<<pos); //位选 HC595_SendByte(mode_code[mode]); //段选 HC595_Latch(); //锁存输出 pos = (pos+1)%4; //动态扫描 }

这里用74HC595实现了四位数码管的动态扫描,秘诀在于每20ms调用一次显示函数形成视觉暂留。模式编码表的设计暗藏玄机——最后一个0x66其实显示的是"E"(错误状态),比直接显示数字更直观。

实战踩坑记录

  1. 红外传感器在Proteus里要用模拟器件库里的IRLED模型,直接数字IO仿真会抽风
  2. STM32的GPIO速度别设太高,2MHz足够,否则导致PWM波形畸变
  3. 电机急停时记得先关PWM再拉低控制脚,避免L298N出现shoot-through电流
  4. 数码管显示闪烁?检查动态扫描频率是否大于50Hz

整套代码在Keil里编译后占用了约12KB ROM,完全在STM32F103C8的64KB闪存容量范围内。实测时发现循迹灵敏度与传感器安装高度强相关,建议通过PWM动态调整红外发射强度来适应不同反光率的地面。

最后说个骚操作:其实可以用一个ADC通道读取红外传感器的模拟量,比纯数字检测更能适应复杂环境。不过这次为了控制成本还是用的数字方案,毕竟十块钱的模块要啥自行车。下期可能尝试加上蓝牙遥控,到时候再和大家唠怎么用串口中断实现可靠通信。

http://www.jsqmd.com/news/534503/

相关文章:

  • Java生态中值得学习的框架
  • AKShare配对交易策略实战:如何避免常见陷阱并优化参数
  • Qwen2-VL-2B-Instruct入门指南:Streamlit界面分区逻辑与交互事件绑定
  • vLLM-v0.17.1在Ubuntu系统部署详解:从环境配置到服务上线
  • KAT-Dev-72B:重构AI编程范式的开源突破
  • 恶劣天气图像恢复新突破:手把手教你用Histoformer实现即插即用去雨去雾
  • PyTorch进阶(18)-- torch.stack()与torch.cat()的对比与应用场景
  • 三月七小助手:重新定义星穹铁道游戏体验的自动化解决方案
  • RetinaFace模型在老旧照片修复中的应用
  • Bypass Paywalls Clean:3步快速解锁付费内容的终极解决方案
  • Arduino IDE下ESP32的LittleFS文件系统配置全攻略(含手动下载依赖文件指南)
  • 中文开发者必看:BPE分词在中文场景的5大痛点与优化方案
  • 你的AI为什么会“胡说八道“?这项技术正在拯救它
  • NaViL-9B GPU算力优化实践:双24GB显卡高效部署全流程
  • C#开发者必备:5分钟搞定WinRAR自解压打包(附详细配置截图)
  • s2-pro部署实操手册:supervisor服务管理+日志排查全流程
  • Linux 驱动框架设计详解
  • ISP Tuning实战指南:从基础到高级的色彩与亮度优化
  • 基于K-L级数展开法与FLAC 3D 6.0的岩土体参数随机场模拟
  • GStreamer实战:RTSP相机流高效转存JPG图片的3种优化方案
  • 裁员40%股价却暴涨30%:Block的“AI大清洗”释放了什么信号?
  • Cortex-M4 FPU实战:从寄存器配置到Lazy Stacking性能优化
  • 英语中的双重否定(不推荐)‘If I remember correctly‘ vs. ‘If I don‘t remember incorrectly‘
  • 【LeetCode】Easy | 387. 字符串中的第一个唯一字符
  • 基于计算机网络技术的FaceRecon-3D分布式部署
  • 神经网络计算量那些事:FLOPs/MACs/MACCs到底怎么算?从公式到代码的完整对照
  • 避坑指南:STM32驱动Air780EG连接阿里云物联网平台,这些AT指令和配置细节别搞错
  • LangChain4j实战:从零构建企业级智能对话系统的核心模块与演进
  • RK3568摄像头图像方向问题全解析:从镜像到代码修改的完整指南
  • 深度视觉开发实战:SR300相机Python环境部署与应用指南