news 2026/2/7 6:58:58

基于 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/2/5 22:40:29

5分钟快速部署PETRV2-BEV模型,星图AI平台让自动驾驶训练更简单

5分钟快速部署PETRV2-BEV模型&#xff0c;星图AI平台让自动驾驶训练更简单 你是否还在为复杂的环境配置、繁琐的数据准备和漫长的模型训练流程头疼&#xff1f;尤其是在做自动驾驶感知任务时&#xff0c;BEV&#xff08;鸟瞰图&#xff09;模型的搭建动辄需要数小时甚至几天的…

作者头像 李华
网站建设 2026/2/5 13:59:18

猫抓资源嗅探器:网页多媒体资源高效下载解决方案

猫抓资源嗅探器&#xff1a;网页多媒体资源高效下载解决方案 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓资源嗅探器是一款功能强大的浏览器扩展工具&#xff0c;专门用于检测和下载网页中的各…

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

小白亲测Z-Image-Turbo_UI:浏览器访问7860端口秒出图

小白亲测Z-Image-Turbo_UI&#xff1a;浏览器访问7860端口秒出图 Z-Image-Turbo_UI AI图像生成 本地部署 一键启动 7860端口 Gradio界面 图片生成教程 本文带你从零开始&#xff0c;手把手使用 Z-Image-Turbo_UI 镜像&#xff0c;在本地快速启动一个可通过浏览器访问的 AI 图像…

作者头像 李华
网站建设 2026/2/5 13:50:21

如何永久解决IDM激活问题:2025年最新方案

如何永久解决IDM激活问题&#xff1a;2025年最新方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 还在为Internet Download Manager的激活弹窗而烦恼&#xf…

作者头像 李华
网站建设 2026/2/4 3:50:05

BongoCat终极指南:打造你的专属桌面互动伴侣

BongoCat终极指南&#xff1a;打造你的专属桌面互动伴侣 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作&#xff0c;每一次输入都充满趣味与活力&#xff01; 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 还在为单调的电脑…

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

MinerU降本部署案例:GPU按需使用,成本节省60%实操手册

MinerU降本部署案例&#xff1a;GPU按需使用&#xff0c;成本节省60%实操手册 1. 背景与痛点&#xff1a;PDF提取为何这么难&#xff1f; 你有没有遇到过这种情况&#xff1a;手头有一堆科研论文、技术文档或财务报表&#xff0c;全是PDF格式&#xff0c;想把内容转成Markdow…

作者头像 李华