秋招项目-基于STM32单片机智能送药小车设计:从硬件到软件的完整实现
招标
发布时间:
2025-11-09
发布于
--
收藏
公告内容
项目编号
立即查看
项目预算
立即查看
采购单位
立即查看
供应商
立即查看
采购代理
立即查看
公告详情
您当前为:【游客状态】,公告详情仅对登录用户开放,
登录/注册
后查看完整商机。全国免费咨询热线:400-888-7022

系统概述与设计思路

智能送药小车是一种结合嵌入式系统、传感器技术和自动控制算法的创新应用,特别适用于医院、养老院等需要频繁药品配送的场景。本文将详细介绍一款基于STM32单片机的智能送药小车设计方案,包含硬件选型、软件架构、核心算法以及完整实现代码,本项目历时2月从电路原理图设计到实物,软件调试,终于完成最初设计效果,现分享。

图注:搭载各类电子元件的智能送药小车原型,包含STM32主控板、电机驱动模块和多种传感器

该系统主要实现以下功能:

循迹导航:通过红外或灰度传感器识别地面引导线,实现自动路径跟踪 避障功能:利用超声波传感器检测前方障碍物,结合舵机调整探测角度 模式切换:通过按键在不同工作模式(循迹/避障)间切换 状态显示:OLED屏幕实时显示小车运行状态和传感器数据 精准控制:采用PID算法实现电机速度和方向的精确调节

硬件系统设计

核心控制器选型

系统采用STM32F103C8T6作为主控制器,这款ARM Cortex-M3内核的微控制器具有72MHz主频、64KB Flash和20KB RAM,提供丰富的外设接口,包括多个定时器、ADC、USART等,完全满足智能小车实时控制需求

传感器模块

循迹传感器:采用TCRT5000红外反射传感器阵列,通过LM393比较器处理信号,可检测黑色引导线与白色背景的对比度差异。

超声波测距模块:HC-SR04超声波模块用于障碍物检测,测量范围2cm-400cm,精度可达3mm,通过Trig引脚触发测距,Echo引脚接收回波。

姿态传感器:MPU6050六轴传感器(可选)提供加速度和角速度数据,用于更高级的运动控制。

电机驱动系统

L298N双H桥电机驱动模块驱动两个直流减速电机,支持PWM调速和正反转控制。该模块可提供2A持续电流(峰值4A),完全满足小车动力需求。

电源管理系统

7.2V锂电池组为系统供电,通过DRV模块转换为12V供电机使用,XL4015 DC-DC降压芯片提供5V和3.3V为控制电路和传感器供电

图注:整体系统框图

软件架构设计

主程序逻辑框架

系统软件采用模块化设计,主函数负责初始化各硬件模块并进入主循环,根据当前模式调用相应功能函数:

c

#include "stm32f10x.h"#include "Delay.h"#include "OLED.h"#include "Timer.h"#include "Car.h"#include "Key.h"#include "Tracking.h"#include "Obstacle.h"#include "SteeringEngine.h"int main(void){ unsigned char KeyNum, KeyFlag; float Distance = 0; /* 硬件模块初始化 */ Timer_Init(); // 定时器初始化 Tracking_Init(); // 循迹模块初始化 Car_Motor_Init(); // 电机驱动初始化 Servo_Init(); // 舵机初始化 HS_SR04_Init(); // 超声波初始化 Key_Init(); // 按键初始化 OLED_Init(); // OLED显示屏初始化 OLED_Clear(); while(1) { KeyNum = Key_GetNum(); // 获取按键状态 if(KeyNum == 1) // 模式切换键按下 { KeyFlag++; if(KeyFlag > 1) KeyFlag = 0; } if(KeyFlag == 0) // 循迹模式 { Car_Motor_SetSpeed(50, 50); // 设置基础速度 Tracking_Control(); // 执行循迹控制 OLED_ShowString(1, 1, "Track Mode"); } else // 避障模式 { Distance = Ultrasonic_Ranging(); // 获取距离数据 Delay_ms(50); Obstacle_Avoidance(Distance); // 执行避障算法 OLED_ShowString(1, 1, "Avoid Mode"); OLED_ShowFloat(2, 1, Distance); // 显示距离数据 } }}

关键功能模块实现

1. 循迹控制算法

循迹模块采用PID算法调节左右轮速差,使小车沿引导线行驶。红外传感器阵列返回的位置误差作为PID输入:

c// 循迹PID控制函数void Tracking_Control(void){ static float last_error = 0; static float integral = 0; float error = Get_Tracking_Error(); // 获取当前位置偏差 // PID计算 integral += error; float derivative = error - last_error; float output = KP * error + KI * integral + KD * derivative; last_error = error; // 应用控制量 Car_Motor_SetSpeed(BASE_SPEED + output, BASE_SPEED - output);}

2. 超声波避障算法

避障模式结合超声波测距和舵机扫描,实现全方位障碍物检测:

c

// 超声波避障主函数void Obstacle_Avoidance(float distance){ static uint8_t scan_dir = 0; static float left_dist, right_dist; if(distance < SAFE_DISTANCE) // 前方障碍物检测 { Car_Motor_Stop(); // 紧急停止 // 左右扫描寻找最佳路径 Servo_SetAngle(60); // 右转60度 Delay_ms(500); right_dist = Ultrasonic_Ranging(); Servo_SetAngle(-60); // 左转60度 Delay_ms(500); left_dist = Ultrasonic_Ranging(); Servo_SetAngle(0); // 回正 Delay_ms(200); // 选择较开阔方向转向 if(left_dist > right_dist) Car_Motor_TurnLeft(); else Car_Motor_TurnRight(); Delay_ms(300); // 转向持续时间 } else { Car_Motor_SetSpeed(50, 50); // 继续前进 }}

3. 电机驱动控制

L298N电机驱动模块通过PWM信号控制电机速度和方向:

c

// 电机速度控制函数void Car_Motor_SetSpeed(int16_t left, int16_t right){ // 限制速度范围 left = constrain(left, -255, 255); right = constrain(right, -255, 255); // 左电机控制 if(left > 0) { GPIO_SetBits(MOTOR_LEFT_IN1_PORT, MOTOR_LEFT_IN1_PIN); GPIO_ResetBits(MOTOR_LEFT_IN2_PORT, MOTOR_LEFT_IN2_PIN); } else { GPIO_ResetBits(MOTOR_LEFT_IN1_PORT, MOTOR_LEFT_IN1_PIN); GPIO_SetBits(MOTOR_LEFT_IN2_PORT, MOTOR_LEFT_IN2_PIN); } TIM_SetCompare1(TIM3, abs(left)); // 左电机PWM // 右电机控制 if(right > 0) { GPIO_SetBits(MOTOR_RIGHT_IN1_PORT, MOTOR_RIGHT_IN1_PIN); GPIO_ResetBits(MOTOR_RIGHT_IN2_PORT, MOTOR_RIGHT_IN2_PIN); } else { GPIO_ResetBits(MOTOR_RIGHT_IN1_PORT, MOTOR_RIGHT_IN1_PIN); GPIO_SetBits(MOTOR_RIGHT_IN2_PORT, MOTOR_RIGHT_IN2_PIN); } TIM_SetCompare2(TIM3, abs(right)); // 右电机PWM}

系统优化与高级功能

传感器数据滤波处理

为提高传感器数据稳定性,系统采用移动平均滤波和低通滤波算法:

c

// 超声波测距滤波处理float Ultrasonic_Filter(float new_value){ static float filter_buf[FILTER_NUM]; static uint8_t index = 0; static float sum = 0; sum -= filter_buf[index]; // 减去最旧值 filter_buf[index] = new_value; // 存储新值 sum += new_value; // 加上新值 index = (index + 1) % FILTER_NUM; return sum / FILTER_NUM; // 返回平均值}

// 红外传感器低通滤波float IR_LowPassFilter(float input){ static float last_output = 0; float output = ALPHA * input + (1 - ALPHA) * last_output; last_output = output; return output;}

串级PID控制算法

对于更高性能要求的应用,可采用串级PID控制,结合位置环和速度环实现更精准的运动控制:

c

// 串级PID控制器实现typedef struct { float Kp, Ki, Kd; float integral; float last_error; float output;} PID_Controller;void PID_Init(PID_Controller* pid, float kp, float ki, float kd){ pid->Kp = kp; pid->Ki = ki; pid->Kd = kd; pid->integral = 0; pid->last_error = 0; pid->output = 0;}float PID_Calculate(PID_Controller* pid, float setpoint, float input){ float error = setpoint - input; pid->integral += error; float derivative = error - pid->last_error; // 抗积分饱和处理 if(pid->integral > INTEGRAL_LIMIT) pid->integral = INTEGRAL_LIMIT; else if(pid->integral < -INTEGRAL_LIMIT) pid->integral = -INTEGRAL_LIMIT; pid->output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative; pid->last_error = error; return pid->output;}// 串级PID应用示例void Cascaded_PID_Control(void){ static PID_Controller pos_pid, vel_pid; float position = Get_Position(); float velocity = Get_Velocity(); // 位置环计算期望速度 float target_vel = PID_Calculate(&pos_pid, TARGET_POS, position); // 速度环计算最终输出 float output = PID_Calculate(&vel_pid, target_vel, velocity); // 应用控制量 Car_Motor_SetSpeed(output, output);}

图注:智能送药小车内部电路结构,展示STM32主控板、传感器接口和电机驱动模块的连接方式

系统原理图设计

智能送药小车的硬件连接原理图主要包含以下几个部分:

STM32最小系统:包含复位电路、时钟电路和电源滤波电路 电机驱动电路:L298N与STM32的PWM信号连接 传感器接口电路

红外传感器阵列通过比较器接入STM32 GPIO

超声波模块Trig和Echo引脚连接

按键电路采用上拉电阻设计

电源管理电路:包含DC-DC降压和滤波电路

提供了详细的全国产化电路设计方案,包括元器件选型和PCB布局建议。

图注:电路原理图

开发与调试建议

分模块调试:先单独测试每个传感器和驱动模块,确保基础功能正常 参数整定:PID参数应从小开始逐步增加,观察系统响应 可视化调试:利用OLED显示屏实时显示关键变量值 上位机辅助:可通过串口将数据发送到PC端进行波形分析

总结与展望

本文详细介绍了基于STM32单片机的智能送药小车设计方案,从硬件选型到软件实现,涵盖了循迹、避障、电机控制等核心功能。系统采用模块化设计思想,便于功能扩展和维护。未来可考虑以下改进方向:

增加无线通信:通过Wi-Fi或蓝牙实现远程监控和控制 视觉导航:结合OpenMV或K210实现更复杂的路径识别 多车协同:实现多辆送药小车的任务分配和路径规划 能耗优化:加入低功耗模式延长工作时间

通过不断完善,这种智能送药系统可广泛应用于医疗、物流等领域,提高配送效率和准确性。

若您读完本篇文章后,请从主函数入手进行模块化调试编译分析,在分析过程中有任何疑问及好的建议,可关注我公众号

后台私信联系我,亦可在此基础上二次开发!

潜在客户预测
点击查看详情>
合作机会