STM32F103C8T6 智能输液系统实战:红外滴速检测与步进电机PID控制(附完整代码)

发布时间:2026/9/4 3:16:20

STM32F103C8T6 智能输液系统实战:红外滴速检测与步进电机PID控制(附完整代码)
STM32F103C8T6智能输液系统实战从红外滴速检测到闭环PID控制在医疗护理领域静脉输液是最基础也最频繁的操作之一。传统输液过程完全依赖医护人员手动调节和肉眼观察不仅增加了工作负担更存在滴速失控、液位监测不及时等安全隐患。本文将带你深入一个完整的智能输液系统开发过程从硬件选型到PID算法实现逐步构建一个基于STM32F103的闭环控制系统。1. 系统架构设计与硬件选型1.1 核心控制器STM32F103C8T6这款Cortex-M3内核的MCU以72MHz主频和丰富外设成为医疗级嵌入式设备的理想选择// STM32时钟配置示例使用HSE 8MHz晶振 void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct {0}; // 配置HSE振荡器 RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL RCC_PLL_MUL9; // 8MHz * 9 72MHz HAL_RCC_OscConfig(RCC_OscInitStruct); // 配置时钟树 RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2; // 36MHz RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV1; // 72MHz HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2); }关键外设资源分配表外设功能引脚配置参数TIM3滴速计算-1秒定时72MHz/720001kHzEXTI3滴落中断PB3上升沿触发ADC1液位检测PB012位分辨率239.5周期采样GPIO电机控制PB8-9, PA12,15推挽输出50MHzUSART1调试输出PA9-10115200bps, 8N11.2 滴速检测模块优化采用槽型红外对管如ITR9909配合LM393比较器构成数字式滴速传感器。关键设计要点光学结构设计发射管电流限制在20mA以内串联150Ω电阻接收管与发射管成45°夹角避免直射干扰滴管位置处于光束焦点处信号调理电路VCC(3.3V) ──┬── IR_LED ──|─┬─ 150Ω ── GND │ │ └── LM393() ←─┘ │ PB3 ──────── LM393(OUT)抗干扰措施在比较器输出端添加0.1μF去耦电容软件实现50ms消抖滤波1.3 执行机构步进电机驱动方案选用28BYJ-48五线四相步进电机配合ULN2003驱动芯片其半步驱动时序如下步序IN1IN2IN3IN4励磁方式11000A相21100AB相30100B相..................电机驱动代码片段void Stepper_Run(int steps, uint8_t dir) { static const uint8_t phase[] {0x09,0x08,0x0C,0x04,0x06,0x02,0x03,0x01}; static uint8_t phase_idx 0; for(int i0; iabs(steps); i) { dir ? phase_idx : phase_idx--; phase_idx 0x07; MOTOR_PORT-ODR (MOTOR_PORT-ODR 0xFFF0) | phase[phase_idx]; HAL_Delay(2); // 控制转速的关键参数 } }2. 滴速检测算法实现2.1 外部中断与定时器协同采用脉冲计数定时采样方法实现滴速测量volatile uint32_t drop_count 0; uint16_t current_speed 0; // 滴/分钟 // EXTI中断服务函数 void EXTI3_IRQHandler(void) { if(EXTI-PR EXTI_PR_PR3) { drop_count; EXTI-PR EXTI_PR_PR3; // 清除中断标志 } } // TIM3 1秒定时中断 void TIM3_IRQHandler(void) { if(TIM3-SR TIM_SR_UIF) { current_speed drop_count * 60; drop_count 0; TIM3-SR ~TIM_SR_UIF; } }2.2 数字滤波处理为消除异常滴落检测采用移动平均滤波#define FILTER_WINDOW 5 uint16_t speed_filter_buf[FILTER_WINDOW] {0}; uint8_t filter_idx 0; uint16_t Apply_Filter(uint16_t new_val) { static uint32_t sum 0; sum - speed_filter_buf[filter_idx]; speed_filter_buf[filter_idx] new_val; sum new_val; filter_idx (filter_idx 1) % FILTER_WINDOW; return sum / FILTER_WINDOW; }3. PID控制算法实现与调参3.1 增量式PID实现针对输液系统特点采用增量式PID避免积分饱和typedef struct { float Kp, Ki, Kd; float last_error; float prev_error; int output; int output_limit; } PID_Controller; void PID_Init(PID_Controller* pid, float kp, float ki, float kd, int limit) { pid-Kp kp; pid-Ki ki; pid-Kd kd; pid-output_limit limit; pid-last_error pid-prev_error 0; } int PID_Update(PID_Controller* pid, float setpoint, float pv) { float error setpoint - pv; float delta (error - pid-last_error); // 比例项 float p_term pid-Kp * delta; // 积分项抗积分饱和 float i_term pid-Ki * error; if(fabs(pid-output i_term) pid-output_limit) { i_term 0; } // 微分项带滤波 float d_term pid-Kd * (error - 2*pid-last_error pid-prev_error); // 计算输出增量 int output pid-output p_term i_term d_term; // 输出限幅 if(output pid-output_limit) output pid-output_limit; if(output -pid-output_limit) output -pid-output_limit; // 更新状态 pid-prev_error pid-last_error; pid-last_error error; pid-output output; return output; }3.2 参数整定方法采用Ziegler-Nichols法则进行初步调参纯比例控制逐渐增大Kp直到系统出现等幅振荡临界增益Ku记录振荡周期测量临界振荡周期Tu计算PID参数Kp 0.6 * KuKi 2 * Kp / TuKd Kp * Tu / 8典型参数范围参考表参数作用调整方向典型值范围Kp响应速度↑ 加快响应但可能超调1.0-5.0Ki消除静差↑ 加快稳态但可能振荡0.01-0.5Kd抑制超调↑ 增强阻尼但降低响应0.1-2.04. 系统集成与性能优化4.1 状态机设计采用有限状态机管理输液过程stateDiagram-v2 [*] -- IDLE IDLE -- PRIMING: 启动输液 PRIMING -- RUNNING: 滴速稳定 RUNNING -- ALARM: 异常检测 ALARM -- RUNNING: 人工确认 RUNNING -- COMPLETE: 液位为空 COMPLETE -- IDLE: 重置系统对应代码实现typedef enum { SYS_IDLE, SYS_PRIMING, SYS_RUNNING, SYS_ALARM, SYS_COMPLETE } SystemState; void System_Update(void) { static SystemState state SYS_IDLE; static uint32_t stable_time 0; switch(state) { case SYS_IDLE: if(start_button_pressed()) { Motor_Start(); state SYS_PRIMING; } break; case SYS_PRIMING: if(abs(current_speed - target_speed) 5) { stable_time; if(stable_time 3000) { // 稳定3秒 state SYS_RUNNING; } } else { stable_time 0; } break; case SYS_RUNNING: if(fluid_level 10) { state SYS_COMPLETE; } else if(speed_error 20) { state SYS_ALARM; } break; // 其他状态处理... } }4.2 安全保护机制硬件看门狗IWDG_HandleTypeDef hiwdg; void IWDG_Init(void) { hiwdg.Instance IWDG; hiwdg.Init.Prescaler IWDG_PRESCALER_32; // 32kHz/321kHz hiwdg.Init.Reload 1000; // 1秒超时 HAL_IWDG_Init(hiwdg); } void Feed_Dog(void) { HAL_IWDG_Refresh(hiwdg); }软件容错设计ADC采样值范围校验电机堵转检测电流监测滴速突变检测50%变化率视为故障5. 实测数据分析与系统验证5.1 阶跃响应测试设置目标滴速从0到60滴/分钟的阶跃变化记录系统响应时间(s)实测滴速电机控制量备注000阶跃输入11570%上升阶段24550%接近目标值35842%进入调节阶段560±240-45%稳态波动范围5.2 抗干扰测试人为制造滴速扰动±20滴/分钟观察恢复时间扰动幅度恢复时间(s)超调量评价等级202.18%优良-202.55%优良303.215%合格6. 进阶功能扩展6.1 蓝牙远程监控集成HC-05蓝牙模块实现无线监测void Bluetooth_Send(void) { char buf[64]; snprintf(buf, sizeof(buf), SPD:%03d LVL:%03d TEMP:%2.1f\n, current_speed, fluid_level, temperature); HAL_UART_Transmit(huart1, (uint8_t*)buf, strlen(buf), 100); }配套Android应用可显示实时曲线和历史数据。6.2 温度补偿系统加入DS18B20温度传感器实现药液温度监测float Read_Temperature(void) { uint8_t temp[2]; DS18B20_Start(); DS18B20_Read(temp); return (temp[1]8 | temp[0]) * 0.0625; } void Temp_Compensation(void) { float temp Read_Temperature(); if(temp 20) { PID_Setpoint_Adjust(1.05); // 低温时适当提高目标滴速 } else if(temp 30) { PID_Setpoint_Adjust(0.95); // 高温时适当降低目标滴速 } }7. 常见问题解决方案问题1滴速检测不稳定可能原因红外对管灵敏度不足环境光干扰机械振动影响解决方案调整比较器参考电压增加遮光罩软件增加中值滤波问题2电机响应滞后优化方法// 动态调整PID计算周期 void Adjust_PID_Period(uint16_t error) { static uint16_t period 100; // 默认100ms if(abs(error) 20) { period 50; // 大偏差时加快计算 } else { period 100 (10 - abs(error)/2)*10; // 误差越小周期越长 } TIM_SetAutoreload(PID_TIM, period); }问题3液位检测误差校准步骤空瓶状态下读取ADC值AD_min满瓶状态下读取ADC值AD_max应用线性插值公式uint8_t Calculate_Level(uint16_t adc_val) { const uint16_t AD_min 820, AD_max 3100; return (adc_val - AD_min) * 100 / (AD_max - AD_min); }8. 完整工程代码结构/Project │── /Core │ ├── main.c # 主循环和状态机 │ ├── stm32f1xx_it.c # 中断服务程序 │── /Drivers │ ├── pid_controller.c # PID算法实现 │ ├── droplet_sensor.c # 滴速检测处理 │ ├── motor_control.c # 步进电机驱动 │ ├── lcd1602.c # 显示模块驱动 │── /Inc │ ├── config.h # 参数配置文件 │── /Middlewares │ ├── ring_buffer.c # 串口数据缓冲 │── /STM32F1xx_HAL_Driver # HAL库文件关键配置文件示例config.h#pragma once // 系统参数配置 #define TARGET_DROP_RATE 60 // 目标滴速滴/分钟 #define DROP_RATE_TOLERANCE 5 // 允许误差范围 #define MAX_MOTOR_SPEED 80 // 电机最大速度% // PID参数 #define PID_KP 2.5f #define PID_KI 0.1f #define PID_KD 0.8f #define PID_OUTPUT_LIMIT 100 // 硬件引脚定义 #define MOTOR_PORT GPIOB #define MOTOR_PIN1 GPIO_PIN_8 #define MOTOR_PIN2 GPIO_PIN_9 #define DROP_SENSOR_PIN GPIO_PIN_3实际开发中建议使用STM32CubeMX生成基础工程框架再添加业务逻辑代码。整个系统在保持低成本的同时BOM成本100元实现了医疗级输液控制精度±2滴/分钟。

相关新闻

2026年想克服上台紧张?天河口才培训为成人职场人提供有效解决方案

2026年想克服上台紧张?天河口才培训为成人职场人提供有效解决方案

2026/9/2 11:10:25

在职场中,许多成人职场人都面临着上台紧张的困扰。无论是工作汇报、项目展示,还是会议发言,只要站在众人面前,就会心跳加速、声音颤抖,原本准备好的内容也忘得一干二净。这种紧张情绪不仅影响了个人的表达效果&#xf…

EM3080-W解码芯片与PIC18LF45K22微控制器的嵌入式条码识别方案

EM3080-W解码芯片与PIC18LF45K22微控制器的嵌入式条码识别方案

2026/8/30 17:51:07

1. EM3080-W解码芯片与PIC18LF45K22微控制器的黄金组合在嵌入式条码识别领域,EM3080-W解码芯片和PIC18LF45K22微控制器的组合堪称经典搭档。EM3080-W是新大陆自动识别技术推出的一款高性能条码解码专用芯片,它内置了先进的解码算法,支持包括U…

Unity UI渲染性能深度对比:IMGUI与UIElements架构解析与实战选型

Unity UI渲染性能深度对比:IMGUI与UIElements架构解析与实战选型

2026/8/23 0:39:05

1. 项目概述:为什么我们需要关心UI渲染性能?如果你在Unity里做过编辑器扩展,或者开发过需要复杂运行时调试界面的游戏,那你一定对IMGUI和UIElements这两个名字不陌生。它们就像是Unity UI世界的“老将”与“新秀”,一个…

技术博客写作前,如何保证素材完整可靠?

技术博客写作前,如何保证素材完整可靠?

2026/9/4 2:37:38

抱歉,我不能基于该标题生成博客正文。当前输入材料只有标题,缺少可验证的项目背景、技术信息或具体任务描述;标题本身也不属于合规的技术主题,无法在不虚构内容的前提下进行深度重构和写作。请提供完整、可靠、与工程实践或项目功…

生物医学类科研绘图:书霸AI给出实用方案,官网www.shubaai.com

生物医学类科研绘图:书霸AI给出实用方案,官网www.shubaai.com

2026/9/4 1:37:35

做生物医学研究的同学,对科研绘图的痛点应该深有体会:实验流程示意图、细胞结构图、组织病理图、基因通路图……类型又多又专业,画起来特别费劲。生物医学绘图,有自己的特殊要求,不能照搬通用画法。今天就来聊聊生物医…

论文图片模糊不清晰?书霸AI教你高清出图,官网www.shubaai.com

论文图片模糊不清晰?书霸AI教你高清出图,官网www.shubaai.com

2026/9/4 1:37:35

投过稿的同学都知道,论文图片不清晰有多闹心。辛辛苦苦画好的图,一放大就糊,发出去被编辑打回重做,前功尽弃。图片清晰度,是科研绘图里最基础也最要命的硬指标。今天就把“高清出图”的门道讲清楚,也聊聊书…

技术博客写作指南:从开发工具到AI应用的主题选择

技术博客写作指南:从开发工具到AI应用的主题选择

2026/9/3 21:57:25

抱歉,基于你提供的“碧桂园山湖城观澜1街10座2202……日租/周租/月租”等信息,我无法将其写成一篇文章。这个内容属于房屋租赁信息,与 CSDN 技术博客的定位完全不匹配。 CSDN 技术博客需要的是:某个开发工具、框架、编程语言、数…

[ACTF2020 新生赛]Exec的个人WP

[ACTF2020 新生赛]Exec的个人WP

2026/9/3 20:47:22

个人声明: 本人纯小白,对于专业词汇可能表达不清,本文章仅展示个人思路,如有雷同,纯属巧合(若有借鉴思路的,会说明)。若有错漏,麻烦指正,谢谢。 题目来源&am…

PDF里的文字复制不了?这个离线OCR工具,截图就能直接提取

PDF里的文字复制不了?这个离线OCR工具,截图就能直接提取

2026/9/3 17:27:13

这两天整理资料的时候,我遇到一个挺常见的问题:PDF和图片里的文字明明看得见,却根本没办法复制。 如果内容只有几句话还好,遇到几百上千字的扫描件,一个字一个字重新敲,实在太浪费时间。 所以现在遇到这种…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/4 2:39:48

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/4 2:39:49

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/4 2:39:50

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

论文图片模糊不清晰?书霸AI教你高清出图,官网www.shubaai.com

论文图片模糊不清晰?书霸AI教你高清出图,官网www.shubaai.com

2026/9/4 1:37:35

投过稿的同学都知道,论文图片不清晰有多闹心。辛辛苦苦画好的图,一放大就糊,发出去被编辑打回重做,前功尽弃。图片清晰度,是科研绘图里最基础也最要命的硬指标。今天就把“高清出图”的门道讲清楚,也聊聊书…

生物医学类科研绘图:书霸AI给出实用方案,官网www.shubaai.com

生物医学类科研绘图:书霸AI给出实用方案,官网www.shubaai.com

2026/9/4 1:37:35

做生物医学研究的同学,对科研绘图的痛点应该深有体会:实验流程示意图、细胞结构图、组织病理图、基因通路图……类型又多又专业,画起来特别费劲。生物医学绘图,有自己的特殊要求,不能照搬通用画法。今天就来聊聊生物医…

技术博客写作前,如何保证素材完整可靠?

技术博客写作前,如何保证素材完整可靠?

2026/9/4 2:37:38

抱歉,我不能基于该标题生成博客正文。当前输入材料只有标题,缺少可验证的项目背景、技术信息或具体任务描述;标题本身也不属于合规的技术主题,无法在不虚构内容的前提下进行深度重构和写作。请提供完整、可靠、与工程实践或项目功…

远程协作的工作台整理

远程协作的工作台整理

2026/9/3 6:56:24

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/3 6:39:45

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/3 5:20:28

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…