news 2026/4/3 2:33:36

基于 51 单片机的 PID 算法控制电机转速

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 51 单片机的 PID 算法控制电机转速

基于51单片机的pid算法控制电机转速 可以通过按键设置电机转速,结合定时器跟用外部中断检测脉冲,得出当前电机转速,再利用pid算法进行纠正,并将当前转速显示在LCD1602上面 包括程序代码+protues仿真

在嵌入式系统开发中,电机转速控制是一个经典且实用的问题。今天咱们就来聊聊如何基于 51 单片机,利用 PID 算法实现电机转速的精准控制,同时还能通过按键设置转速,并且把当前转速显示在 LCD1602 上。

整体思路

要实现这个功能,我们需要几个关键步骤。首先,利用按键来设置我们期望的电机转速;接着,借助定时器和外部中断检测电机的脉冲,从而计算出当前电机的实际转速;然后,使用 PID 算法对实际转速和期望转速进行比较,根据误差来调整电机的控制信号,让实际转速尽可能接近期望转速;最后,把当前的电机转速显示在 LCD1602 上。

硬件准备

我们主要用到 51 单片机、电机驱动模块、按键、LCD1602 显示屏以及电机。在 Proteus 仿真中,我们可以模拟这些硬件的连接和工作。

程序代码及分析

1. 初始化部分

#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit RS = P2^0; sbit EN = P2^1; sbit K1 = P3^2; // 按键 1,用于增加转速 sbit K2 = P3^3; // 按键 2,用于减少转速 sbit IN1 = P1^0; sbit IN2 = P1^1; sbit ENA = P1^2; uchar code table[] = "Speed:"; uint set_speed = 50; // 初始设定转速 uint real_speed = 0; // 实际转速 uint count = 0; // 脉冲计数 uint pid_output = 0; // 定时器 0 初始化 void Timer0_Init() { TMOD |= 0x01; TH0 = (65536 - 1000) / 256; TL0 = (65536 - 1000) % 256; ET0 = 1; EA = 1; TR0 = 1; } // 外部中断 0 初始化 void Int0_Init() { IT0 = 1; EX0 = 1; EA = 1; } // LCD1602 写命令 void Write_Command(uchar command) { RS = 0; P0 = command; EN = 1; _nop_(); EN = 0; delay(5); } // LCD1602 写数据 void Write_Data(uchar dat) { RS = 1; P0 = dat; EN = 1; _nop_(); EN = 0; delay(5); } // LCD1602 初始化 void LCD_Init() { Write_Command(0x38); Write_Command(0x0c); Write_Command(0x06); Write_Command(0x01); }

代码分析:这部分代码主要完成了一些初始化工作。包括定义了一些引脚和变量,对定时器 0 和外部中断 0 进行初始化,以及对 LCD1602 的初始化。定时器 0 用于定时,外部中断 0 用于检测电机的脉冲。LCD1602 的初始化则是为了后续能够正常显示转速信息。

2. 按键处理部分

// 按键扫描 void Key_Scan() { if (K1 == 0) { delay(10); if (K1 == 0) { set_speed += 10; if (set_speed > 255) set_speed = 255; while (K1 == 0); } } if (K2 == 0) { delay(10); if (K2 == 0) { set_speed -= 10; if (set_speed < 0) set_speed = 0; while (K2 == 0); } } }

代码分析:这个函数用于扫描按键。当检测到按键按下时,先进行消抖处理,然后根据按下的是哪个按键来增加或减少设定的转速。同时,对转速进行了范围限制,确保不会超出合理范围。

3. PID 算法部分

// PID 参数 float Kp = 1.0; float Ki = 0.1; float Kd = 0.01; float err = 0; float err_sum = 0; float err_last = 0; // PID 计算 uint PID_Calculate() { err = set_speed - real_speed; err_sum += err; pid_output = Kp * err + Ki * err_sum + Kd * (err - err_last); err_last = err; if (pid_output > 255) pid_output = 255; if (pid_output < 0) pid_output = 0; return (uint)pid_output; }

代码分析:PID 算法是整个系统的核心。这里定义了三个 PID 参数:比例系数Kp、积分系数Ki和微分系数Kd。通过计算设定转速和实际转速的误差err,并对误差进行积分和微分运算,得到最终的控制输出pid_output。同时,对输出进行了范围限制,确保不会超出 PWM 的范围。

4. 主函数部分

void main() { Timer0_Init(); Int0_Init(); LCD_Init(); while (1) { Key_Scan(); pid_output = PID_Calculate(); ENA = pid_output; // 输出 PWM 控制电机 // 显示转速 Write_Command(0x80); for (uchar i = 0; i < 6; i++) { Write_Data(table[i]); } Write_Command(0x86); Write_Data(real_speed / 100 + 0x30); Write_Data((real_speed % 100) / 10 + 0x30); Write_Data(real_speed % 10 + 0x30); } } // 定时器 0 中断服务函数 void Timer0_ISR() interrupt 1 { TH0 = (65536 - 1000) / 256; TL0 = (65536 - 1000) % 256; real_speed = count; // 计算实际转速 count = 0; } // 外部中断 0 服务函数 void Int0_ISR() interrupt 0 { count++; }

代码分析:主函数中首先进行了各种初始化操作,然后进入一个无限循环。在循环中,不断扫描按键,调用 PID 算法进行计算,并将计算结果输出到电机驱动引脚ENA上,实现对电机转速的控制。同时,将当前的实际转速显示在 LCD1602 上。定时器 0 中断服务函数用于定时计算实际转速,外部中断 0 服务函数用于检测电机的脉冲,每检测到一个脉冲,count就加 1。

Proteus 仿真

在 Proteus 中,我们可以搭建好硬件电路,将编写好的程序烧录到 51 单片机中进行仿真。通过观察电机的转速变化以及 LCD1602 上显示的转速信息,来验证我们的程序是否正常工作。

总结

通过以上的步骤,我们就实现了基于 51 单片机的 PID 算法控制电机转速的功能。利用按键可以方便地设置期望转速,通过定时器和外部中断检测实际转速,再借助 PID 算法进行调整,最终将转速信息显示在 LCD1602 上。这个项目不仅加深了我们对 51 单片机的理解,也让我们对 PID 算法有了更深入的认识。

基于51单片机的pid算法控制电机转速 可以通过按键设置电机转速,结合定时器跟用外部中断检测脉冲,得出当前电机转速,再利用pid算法进行纠正,并将当前转速显示在LCD1602上面 包括程序代码+protues仿真

大家在实现的过程中可能会遇到一些问题,比如 PID 参数的调整。不同的电机和应用场景可能需要不同的 PID 参数,大家可以多尝试,找到最适合自己的参数。希望这篇文章对大家有所帮助!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 6:08:09

OpCore Simplify:告别复杂配置的黑苹果自动化革命

OpCore Simplify&#xff1a;告别复杂配置的黑苹果自动化革命 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为繁琐的OpenCore EFI配置而头疼吗&…

作者头像 李华
网站建设 2026/4/1 6:18:03

中文逆文本标准化工具深度解析|FST ITN-ZH镜像应用指南

中文逆文本标准化工具深度解析&#xff5c;FST ITN-ZH镜像应用指南 1. 工具简介与核心价值 在中文自然语言处理的实际场景中&#xff0c;我们经常遇到一个看似简单却极具挑战的问题&#xff1a;如何将口语化、非标准的中文表达转换为统一、规范的书面格式&#xff1f;比如“二…

作者头像 李华
网站建设 2026/3/30 15:13:59

Paraformer-large医疗场景应用:医生口述病历转录系统搭建教程

Paraformer-large医疗场景应用&#xff1a;医生口述病历转录系统搭建教程 1. 医疗语音识别的痛点与解决方案 在日常诊疗过程中&#xff0c;医生需要花费大量时间撰写病历、整理问诊记录。传统手动录入方式效率低、易出错&#xff0c;而专业速录员成本高昂且难以普及。如何将医…

作者头像 李华
网站建设 2026/3/27 19:43:01

Sambert支持macOS吗?Apple Silicon适配部署案例

Sambert支持macOS吗&#xff1f;Apple Silicon适配部署案例 1. Sambert 多情感中文语音合成——开箱即用版 你是不是也遇到过这样的问题&#xff1a;想在自己的 Mac 上跑一个中文语音合成模型&#xff0c;结果发现依赖报错、环境冲突、GPU 不兼容&#xff0c;折腾半天还是跑不…

作者头像 李华
网站建设 2026/3/24 12:40:01

Qwen3-1.7B情感分析应用:社交媒体舆情监控系统搭建

Qwen3-1.7B情感分析应用&#xff1a;社交媒体舆情监控系统搭建 在当今信息爆炸的时代&#xff0c;社交媒体成为公众表达观点、情绪和态度的重要平台。企业、政府机构乃至个人品牌都需要实时掌握网络舆论动向&#xff0c;以便及时应对负面舆情、优化传播策略。而传统人工监测方…

作者头像 李华
网站建设 2026/3/18 21:25:02

LLM Guard:AI对话系统安全防护的完整解决方案

LLM Guard&#xff1a;AI对话系统安全防护的完整解决方案 【免费下载链接】llm-guard The Security Toolkit for LLM Interactions 项目地址: https://gitcode.com/gh_mirrors/llm/llm-guard 在人工智能技术快速发展的今天&#xff0c;大型语言模型(Large Language Mode…

作者头像 李华