1. 系统功能介绍
点击链接下载设计资料:https://download.csdn.net/download/m0_51061483/91926477
本设计基于 51 单片机实现直流电机 PID 调速电压电流功率控制系统。系统采用按键输入目标转速值,通过速度采集模块实时检测电机实际转速,并利用 PID 控制算法调节驱动 PWM 占空比,使实际转速快速且稳定地追踪设定目标。为提高系统可视化与可操作性,设计中加入 LCD 显示模块,用于实时显示电机运行参数,包括目标转速、实际转速、电流、电压及当前输出功率,便于用户监控电机运行状态与负载变化情况。
整个系统兼顾精度、稳定性与可扩展性,通过 PID 控制保证电机在不同负载变化下保持稳定速度。同时在电压电流测量基础上计算出实时功率,使系统不仅具备调速能力,还具备运行状态监测和能耗分析能力,适用于教学实验、智能风机、自动化设备以及电机性能测试平台等场合。
2. 系统电路设计
系统硬件整体由单片机最小系统、直流电机驱动电路、霍尔测速模块、电压采样电路、电流检测模块(如 ACS712)、按键输入模块、LCD1602 显示模块、电源调理模块等部分组成。本节将从各模块的功能与电路原理出发,详细介绍设计细节。
2.1 单片机最小系统电路
系统核心采用 STC89C52(兼容 51 架构),负责整个控制逻辑的执行、数据采集、PID 运算与显示驱动。
其最小系统包括:
- 晶振电路:使用 12MHz 晶振,配合 22pF 电容,保证稳定时钟。
- 复位电路:由按键、电解电容、上拉电阻组成,上电自动复位,必要时手动复位。
- 电源电路:由 DC-DC 转换模块提供稳定 5V,保证单片机与传感器稳定工作。
单片机提供 PWM 输出端用于控制电机驱动器的占空比,同时需通过外接计数输入脚读取霍尔测速信号。
2.2 直流电机驱动模块(L298N 或 BTS7960)
为了驱动直流电机,系统选择常用 H 桥驱动模块:
- L298N 驱动器
- 支持直流电机正反转
- PWM 控制占空比调节电机速度
- 最大电流 2A,可满足一般实验需求
- BTS7960 驱动器(大电流场景)
- 双全桥结构,持续电流可达 43A
- 驱动效率更高,适合大功率电机
驱动模块输入 PWM 信号即可调节电机转速,通过 OUTA、OUTB 输出端连接电机两极,内部包含续流保护二极管。
2.3 霍尔测速模块
为了获取实际转速,系统采用霍尔式测速模块或红外光电测速模块。
其原理:
测速模块输出为 TTL 数字电平,可直接输入 51 计数器 T0 或 T1 的计数口。
测速公式示例:
实际转速 RPM = (脉冲数 / 每转脉冲数) × 60 / 测量周期
2.4 电压采样模块
为了计算电机运行状态中的电压值,本设计通过分压电路将电机供电电压采样并输入 ADC 模块:
采样值将还原为原始电机电压用于功率计算。
2.5 电流检测模块(ACS712)
系统采用霍尔电流传感器 ACS712 用于电流测量:
- ACS712-5A 型:适合小功率电机
- 输出模拟电压与电流线性对应
- 需输入 ADC 执行采样
采样到的电流值用于:
- 功率计算(P = U × I)
- 保护策略(如过流提示)
2.6 按键输入模块
按键主要用于:
- 设置目标转速
- 调节参数(可选:PID 参数调节)
- 切换显示页面(可选)
按键采用上拉输入结构,按下为低电平,配合软件去抖处理。
2.7 LCD1602 显示模块
采用 LCD1602 或带 I²C 扩展的 LCD1602:
- 实时显示:
- 目标转速
- 实际转速
- 电压值、电流值
- 输出功率
- 显示稳定、直观
模块通过 4 位或 I²C 接口与单片机通信。
2.8 电源模块
整套系统电源包含两部分:
- 电机供电(如 12V)
- 控制系统供电(5V DC-DC 稳压)
3. 系统程序设计
程序以单片机为核心,采用循环查询 + 中断计数方式,完成数据采集、PID 计算、电机驱动、按键处理与显示等功能。系统采用模块化结构,便于维护升级。
3.1 主程序整体结构
主函数负责初始化与循环调度:
void main()
{
Init_All();
while(1)
{
Key_Process();
Read_Speed();
Read_Voltage();
Read_Current();
Calculate_Power();
PID_Calc();
Update_PWM();
LCD_Update();
}
}
程序按照固定周期读取传感器、计算 PID 并刷新 PWM,实现闭环控制。
3.2 速度采集程序
利用定时器计数功能测量每一周期脉冲数:
void Read_Speed()
{
pulse = Get_Pulse_Count();
speed = pulse * 60 / Pulse_Per_Turn;
}
通过测得 speed 与目标转速 targetSpeed 比较,为 PID 提供输入。
3.3 电压采集程序
unsigned int Read_Voltage()
{
adc = ADC_Read(0);
voltage = adc * Vref / 1023 * Divider_Ratio;
return voltage;
}
通过分压比恢复真实电压。
3.4 电流采集程序(ACS712)
float Read_Current()
{
adc = ADC_Read(1);
float Vout = adc * 5.0 / 1023;
current = (Vout - 2.5) / 0.185;
return current;
}
公式依据 ACS712 输出特性(每 A 电流对应 185mV)。
3.5 功率计算程序
void Calculate_Power()
{
power = voltage * current;
}
用于显示与负载分析。
3.6 PID 调节程序
PID 控制核心:
float PID_Calc()
{
error = targetSpeed - speed;
integral += error;
derivative = error - lastError;
output = Kp*error + Ki*integral + Kd*derivative;
lastError = error;
return output;
}
为防止积分过大,可加入积分限幅:
if(integral > 200) integral = 200;
if(integral < -200) integral = -200;
3.7 PWM 输出更新程序
void Update_PWM()
{
if(output > 255) output = 255;
if(output < 0) output = 0;
PWM_SetDuty(output);
}
输出限制防止 PWM 越界。
3.8 按键程序设计
void Key_Process()
{
if(KEY_UP == 0) { Delay(10); if(KEY_UP == 0) targetSpeed += 10; }
if(KEY_DOWN == 0) { Delay(10); if(KEY_DOWN == 0) targetSpeed -= 10; }
}
用户可通过按键灵活设置目标转速。
3.9 LCD 显示程序
void LCD_Update()
{
LCD_ShowString(0,0,"T:");
LCD_ShowNum(2,0,targetSpeed);
LCD_ShowString(8,0,"S:");
LCD_ShowNum(10,0,speed);
LCD_ShowString(0,1,"U:");
LCD_ShowNum(2,1,voltage);
LCD_ShowString(6,1,"I:");
LCD_ShowNum(8,1,current);
LCD_ShowString(12,1,"P:");
LCD_ShowNum(14,1,power);
}
清晰显示各关键运行参数。
4. 总结
本设计构建了基于 51 单片机的直流电机 PID 调速电压电流功率控制系统,利用霍尔测速模块实现转速采集,通过 PID 控制算法实时计算电机 PWM 输出信号,稳健实现直流电机的精确调速。同时通过电压、电流测量模块实现运行参数监测,并在 LCD 上实时显示,使系统具备监控、分析、调节三合一的完整功能结构。
系统具有结构清晰、控制精准、扩展性强等特点,可用于教学、实验、电机测试平台以及智能电机调速应用场景。
4025