【STM32】STM32F103C8T6实现直流电机速度PID控制

2023-05-16

系列文章目录

·【STM32】新建工程模板及配置

·【STM32】STM32与PC端、HC-06、ROS进行USART串口通信

·【ROS】ROS上位机使用Serial库和boost::asio库与STM32进行USART通讯

·【STM32】STM32F103C8T6+L298N通过PWM控制直流电机转速

·【STM32】STM32F103C8T6使用外部中断法和输入捕获法进行编码器测速

·【STM32】STM32F103C8T6实现直流电机速度PID控制

文章目录

系列文章目录

文章目录

前言

一、PID的基本原理

二、变式PID

三、Keil5程序

总结


前言

前面完成了基于STM32F103C8T6+L298N+MG513P30直流电机的PWM控制和两种方法的编码器实时速度反馈,拿到这个反馈值后我们就可以使用经典的PID算法,对电机的转速进行准确的控制了,这篇文章主要分享PID基本原理和Keil5的PID编程。

一、PID的基本原理

PID算法是上个世纪30年代左右提出的控制算法,大至航空航天、小至家庭温度调控都可以使用PID算法,虽然PID算法从提出到现在已经历经了快一个世纪,其后也出现了很多现代的智能算法,比如蒙特卡洛、智能控制等等,但现在PID仍然经久不衰,可以说目前80%以上的控制仍然使用PID算法。

PID算法是自动控制原理课程学习的一部分,但在课程中老师讲解的是最基本的原理,没有任何拓展,更别提应用了,首先,先简单说一下PID控制算法的原理。

上图为PID算法的控制框图,在我们控制电机速度时,期望输入就是电机的期望速度值,期望输入与由编码器测得的实际速度作差,求出的误差值传给PID的控制部分,算出需要输出的控制信号,将该控制信号传给控制器,也就是输出给电机驱动板L298N,这样形成一个循环,就实现了对电机速度的精准控制。

中间PID的控制部分的连续型公式如下:

U(t)=K_{p}\cdot Err+K_{i}\cdot\int Err(t) dt+K_{d}\cdot\frac{dErr}{dt}

但是在计算机中计算机很难实现连续型变量的积分或者微分操作,因此在计算机中,我们使用离散型的积分和微分,就是取时间间隔T为1,离散型PID公式如下:

U(n)=K_{p}\cdot Err+K_{i}\cdot \sum_{n}^{i} Err(i)+K_{d}\cdot(Err(n)-Err(n-1))

各个项的主要作业及效果如下:

  • P:增加快速性,过大会引起震荡和超调,P单独作用会一直有静态误差
  • I:减少静态误差,过大会引起震荡
  • D:减小超调,过大会使响应速度变慢

在实际的应用中,有可能不需要PID同时使用,比如在速度控制中一般只使用PI控制就够了,各种各样的PI、PD控制大家可以去B站或者看其他博主的博客,已经讲的很详细了。

二、变式PID

PID算法有很多进化版本,分类别的简单阐述一下

增量式PID

在电机的速度PID控制算法中,因为我们一般使用PI算法就够了,所以我们可以使用增量式PID算法,这样可以让我们的公式和代码更加简洁。

U(n)=U(n-1) + K_{p}\cdot (Err(n) - Err(n-1))+K_{i}\cdot Err(n)

积分限幅

因为积分的效果是累加,随着时间的推移,积分项的值会升到很高,积分本来的作用是用来减小静态误差,但积分项过大会引起过大的震荡,所以我们可以加一个判断函数if,当积分项的值达到一定值后,就让积分项保持这个值,避免引起更大的震荡。

积分分离

如果刚开始的误差比较大,那么积分项则会在刚开始就累计到了一个很大的数值,那么当第一次实际输出达到期望值时,不会立刻停止,而是会产生一个很大的过冲。这时就需要用到积分分离,就是当误差值过大时,我们就不使用积分项,只让PD项单独作用,当误差值较小后,在加入积分项,以减小静态误差。

三、Keil5程序

为了使用方便,我们先定一个PID结构体,结构体储存左右轮的PID参数、限幅值、误差等参数。

typedef struct
{
	 //相关速度PID参数
	float Velcity_Kp;
	float Velcity_Ki;
	float Velcity_Kd;
	float Ur;				//限幅值
	
	u8 PID_is_Enable;		//PID使能
	int Un;					//期望输出值
	int En_1;				//上一次的误差值
	int En_2;				//上上次的误差值
	int PWM;				//输出PWM值
	
}PID_InitDefStruct;

在程序初始化部分,定义一个初始化函数,对其中的参数进行初始化配置。

void PID_Init(PID_InitDefStruct* p)
{
	p->Velcity_Kp = 5;
	p->Velcity_Ki = 0.5;
	p->Velcity_Kd = 0;
	p->Ur = 7100;
	p->PID_is_Enable = 1;
	p->Un = 0;
	p->En_1 = 0;
	p->En_2 = 0;
	p->PWM = 0;
}

当编码器的定时器,每隔10ms反馈一次编码器测出的实际速度后,调用PID函数,求解输出给电机驱动板的PWM值,然后通过Set_Pwm函数进行设置,以此控制电机转速。

void Velocity_PID(int TargetVelocity,int CurrentVelocity,PID_InitDefStruct* p)
{
	if(p->PID_is_Enable == 1)
	{
		int En = TargetVelocity - CurrentVelocity;//误差值                                                     
	
		p->Un += p->Velcity_Kp*(En - p->En_1) + p->Velcity_Ki*En + p->Velcity_Kd*(En - 2*p->En_1 + p->En_2);//增量式PID
		
		p->En_2=p->En_1;
		p->En_1=En;
		
		p->PWM = p->Un;
		
		/*输出限幅*/
		if(p->PWM>p->Ur) p->PWM=p->Ur;
		if(p->PWM<-p->Ur) p->PWM=-p->Ur;
	}
	else
	{
		PID_Init(p);
	}
	
}

测试给电机输入理想转速为1500mm/s,随便设置了一组PI参数,得到实验结果如下:

可以通过上位机看一下波形,可以看到在稳定状态的静差是比较小的


总结

对于PID算法这才是万里长征的第一步吧,想要调出完美地控制程序,还需要复杂的PID参数整定,这里可以配合上位机进行调试,以后调出来在分享。

临近开学时间比较仓促,写的挺简单的,大家有问题欢迎私信或者评论,我们一起讨论。


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32】STM32F103C8T6实现直流电机速度PID控制 的相关文章

  • 第7章 HBase操作

    文章目录 一 xff1a 判断题二 xff1a 单选题三 xff1a 主观题1 xff1a 创建学生表scores xff0c 列族为grade 年级 course 课程 xff0c 学生姓名name作为行健的代码 2 xff1a 查看创建
  • Python/Pytorch常用函数大汇总(持续更新中)

    python装饰器 def dec1 func print 34 1111 34 def one print 34 2222 34 func print 34 3333 34 return one def dec2 func print 3
  • 将uc/OS其移植到stm32并完成相关任务

    目录 一 uc OS的介绍 1 概述 2 工作原理 3 主要特点 二 创建cubemx项目 1 选择stm32f103c8 2 配置RCC 编辑 3 配置SYS 4 生成项目 三 移植和keil5相关操作 1 进入官网下载 xff1a ht
  • 匿名飞控TI版_PID部分,串级PID,微分先行,前馈控制

    文章目录 PID介绍有趣的故事控制模型位置式PID和增量式PID位置式PID增量式PID 串级PID前馈控制微分先行匿名代码分析 PID介绍 PID介绍 有趣的故事 PID的故事 space space space space space
  • c#委托的定义和使用

    什么是委托 xff1f 当你需要将方法当成一个参数传递的时候就需要使用委托 xff0c 委托是一个类型 xff0c 可以赋值一个方法的引用 具体怎么使用下面就简单展示一下 1 定义委托 delegate void MyDelegate in
  • ssh登录出现 “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”解决办法

    问题场景 xff1a 第一次ssh板子成功登录后 xff0c 换了另外一块同样型号的开发板 xff0c 重新ssh远程登录 xff0c 出现了WARNING REMOTE HOST IDENTIFICATION HAS CHANGED 问题
  • 多线程及网络编程

    目录 实验目的及要求 一 实验原理 xff1a 二 操作步骤 xff1a 三 实验数据 1 模拟火车站4个窗口同时卖50张票 2 使用UDP协议实现用户信息的发送和接收功能 3 运用TCP协议实现向服务器上传文件 实验结果及分析 个人简介
  • 阿里云在线扩容磁盘,最简化,但不一定适用你的ECS版本

    在扩展系统盘扩展分区和文件系统前 xff0c 请提前完成以下工作 已创建快照备份数据 为防止操作失误导致数据丢失 xff0c 建议您操作前使用快照备份数据 若尚未创建快照 xff0c 请参见创建快照 已扩容云盘 若尚未扩容 xff0c 请参
  • AD学习笔记(二)原理图库以及原理图绘制

    文章目录 AD学习笔记第二讲 原理图库以及原理图绘制一 认识原理图二 原理图库绘制三 原理图绘制1 原理图纸的操作2 原理图库的调用放置3 导线及网络标识的添加4 原理图可读性优化处理5 原理图统一编号设置6 PCB封装名称的统一添加与管理
  • C工程与寄存器封装

    目录 一 C语言工程简介 二 启动代码分析 三 C语言实现LED 四 寄存器的封装方式 五 寄存器操作的标准化 六 流水灯 一 C语言工程简介 先将工程模板解压 include里是 h文件 src里是 c文件 start里面是 s启动文件
  • Python第三章函数

    函数 文章目录 函数一 函数基础1 参数2 拆分参数列表3 参数传递位置传递地址传递传对象引用 4 函数返回值5 变量的作用域局部变量全局变量nonlocal关键字 7 包8 猴子补丁9 python标准库的应用1 random模块2 ti
  • 无显示器怎么玩树莓派

    无显示器怎么玩树莓派 文章目录 无显示器怎么玩树莓派 前言一 给树莓派烧系统二 设置WiFi及ssh端口三 远程连接四 注意事项 前言 很多时候我们在使用树莓派的时候身边都没有显示器 xff0c 关于这个问题 xff0c 我也十分苦恼 xf
  • ROS智能车定位导航仿真(Gazebo搭建赛道)

    ROS智能车定位导航仿真 xff08 Gazebo搭建赛道 xff09 前言一 ROS仿真功能包下载二 安装运行所需的插件三 racecar功能包编译四 测试程序运行五 运行功能包赛道六 注意事项 前言 Ubuntu版本 xff1a 18
  • 阿木实验室PX4开发课程整理

    1 1 xff1a alt 43 ctrl 43 t 打开终端 cd Desktop 进入到桌面目录 cd 返回上次访问目录 cd 返回上一目录 gedit circular cpp 进入某文件 roscd px4 control 进入文件
  • Java并发编程—CompletableFuture的异步执行案例

    在博主前几篇博客中 xff0c https blog csdn net qq 52545155 article details 128167519 spm 61 1001 2014 3001 5501 xff0c 给大家分享了关于多线程中异
  • 手写rtos的第一天

    唉 xff0c 不自不觉已经大三了啊 xff0c 大二的智能车生涯已经结束了 xff0c 不得不说 xff0c 省二是我不太能接受的 结果 xff0c 虽然嘴上说着没啥 xff0c 真正面对全省排名的时候 xff0c 内心的寂寥真的难以言表
  • FreeRTOS任务(动态)创建与删除(一)

    FreeRTOS学习总结 文章目录 前言一 浅浅了解二 创建任务1 动态任务创建2 动态实践 总结 前言 听朋友说 xff0c FreeRTOS很好用 xff0c 就在无聊的上网课期间浅学一下 提示 xff1a 以下是本篇文章正文内容 xf
  • FreeRTOS操作系统队列及队列API函数(五)

    FreeRTOS学习总结 文章目录 前言一 队列功能1 数据存储2 多任务访问3 出队阻塞4 入队阻塞 二 队列操作过程图示1 创建队列2 向队列发送第一个消息3 向队列发送第二个消息4 从队列中读取消息 二 API函数1 队列创建函数2
  • php导出word文件,打开损坏或者乱码

    下载Word文件 fileinfo 61 pathinfo fullname ob end clean header 39 Content type application x 39 fileinfo 39 extension 39 hea
  • FreeRTOS操作系统优先级翻转问题(八)

    FreeRTOS总结 文章目录 前言一 浅浅了解优先级翻转二 模拟 优先级翻转实验1 代码 总结 前言 在使用二值信号量的时候会遇到很常见的一个问题 优先级翻转 xff0c 优先级翻转在可剥夺 内核中是非常常见的 xff0c 在实时系统中不

随机推荐

  • 伽马分布,指数分布,卡方分布三者关系

    1 伽马分布是一个连续概率分布 xff0c 具有两个参数 alpha 和 lambda xff0c 记为
  • 数据结构 马踏棋盘 栈应用 C++

    include lt iostream gt 包含其它头文件 using namespace std const int StackInitSize 61 10 const int StackInc 61 10 typedef int SE
  • STM32智能小车------红外遥控

    文章目录 一 原理讲解1 实物图2 工作原理 xff1a 3 接线 xff1a 二 软件驱动代码1 驱动函数2 获取键值 总结最终效果 大家好哇 xff01 我是小光 xff0c 嵌入式爱好者 xff0c 一个想要成为系统架构师的普通大学生
  • UCOS学习(一)——前后台系统、RTOS系统

    大家好哇 xff01 我是小光 xff0c 嵌入式爱好者 xff0c 一个想要成为系统架构师的大二学生 最近开始学习UCOS操作系统 xff0c 后面会更新一些关于UCOS学习笔记 今天了解了UCOS操作系统 xff0c 总结一下知识点 感
  • UCOS学习(二)——UCOS-II、UCOS-III移植到STM32F103

    大家好哇 xff01 我是小光 xff0c 嵌入式爱好者 xff0c 一个想要成为系统架构师的大二学生 最近开始学习UCOS操作系统 xff0c 后面会更新一些关于UCOS学习笔记 今天学习了如何将UCOS II和UCOS III移植到ST
  • UCOS学习(三)——任务管理基础

    大家好哇 xff01 我是小光 xff0c 嵌入式爱好者 xff0c 一个想要成为系统架构师的大二学生 最近开始学习UCOS操作系统 xff0c 后面会更新一些关于UCOS学习笔记 今天学习了任务管理基础知识 感谢你的阅读 xff0c 不对
  • UCOS学习(七)——信号量详解

    信号量 信号量简介信号量保护共享资源举个栗子 xff1a 如果不使用信号量信号量解决公共资源问题创建信号量 xff1a 信号量实现任务同步总结 信号量简介 信号量像是一种上锁机制 xff0c 代码必须获得对应的钥匙才能继续执行 xff0c
  • Altium Designer(AD)的简易使用

    一 绘制原理图 原理图库 首先来说明原理图的概念 根据百度百科 xff0c 原理图 xff0c 顾名思义就是表示电路板上各器件之间连接原理的图表 也就是表示芯片上的引脚连接什么元件 xff0c 各个元件谁和谁相连 xff0c 电源电压的大小
  • STM32CubeIDE---HAL库PWM使用速记

    一 如何计算 理论分析 xff1a HAL库函数之呼吸灯 PWM波 简书 jianshu com 预分频系数 PSC 自动重装载值 ARR 捕获 比较寄存器值 CCR 频率计算 xff1a 定时器频率 PSC 43 1 ARR 43 1 占
  • mac常用命令

    mac清除电脑DNS缓存 sudo dscacheutil flushcache
  • IMU初介绍及里程计相关补充

    IMU原理 xff1a 以牛顿力学定律为基础 xff0c 通过测量载体在惯性参考系的加速度 xff0c 将它对时间进行积分 xff0c 且把它变换到导航坐标系中 xff0c 就能够得到在导航坐标系中的速度 偏航角和位置等信息 IMU xff
  • C语言变量的定义与声明,为什么全局变量不能赋值

    文章目录 一 对C语言程序的一些补充二 定义域声明2 1 什么是变量2 2 如何定义变量2 3 为什么要定义变量2 4 定义变量的本质2 5 变量声明的本质2 6 定义和声明的区别 三 全局变量无法赋值 一 对C语言程序的一些补充 对于一个
  • 野火PID上位机通信移植

    野火PID上位机通信移植 一 简介 在调试pid参数的时候 xff0c 需要用到上位机 xff0c 这里选用 野火多功能调试助手 使用调试助手 xff0c 需要下位机与上位机之间的通信协议 xff0c 下载野火关于电机的相关例程 xff0c
  • 实验报告数字图像的基本操作

    一 实验目的 了解Matlab的基本功能及操作方法练习图像读写和显示函数的使用方法掌握如何利用MATLAB来获取图像的大小 颜色 高度 宽度等等相关信息熟悉常用的图像文件格式与格式转换 xff1b 二 实验环境 PC计算机MatLab软件
  • 【meArm机械臂】第二篇·Arduino控制程序

    系列文章目录 meArm机械臂 第一篇 结构设计及搭建 meArm机械臂 第二篇 Arduino控制程序 文章目录 系列文章目录前言一 测试程序1 单个电机测试程序2 四舵机控制测试程序3 极限位置测量 二 基本控制程序三 最终控制程序总结
  • 【树莓派4B】安装Ubuntu Mate20.04+ROS Noetic+使用电脑自带的xrdp和VNC进行PC端远程控制

    目录 前言 一 烧录Ubuntu Mate20 04 1 下载Ubuntu Mate 20 04 2 格式化SD卡并烧录系统 3 打开SSH功能 二 配置Ubuntu环境 1 初次开机进行简单的配置 2 更换国内源 3 更新软件列表和软件
  • 【STM32】STM32F103C8T6+L298N通过PWM控制直流电机转速

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1
  • 【ROS】ROS上位机使用Serial库和boost::asio库与STM32进行USART通讯

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1
  • 【STM32】STM32F103C8T6使用外部中断法和输入捕获法进行编码器测速

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1
  • 【STM32】STM32F103C8T6实现直流电机速度PID控制

    系列文章目录 STM32 新建工程模板及配置 STM32 STM32与PC端 HC 06 ROS进行USART串口通信 ROS ROS上位机使用Serial库和boost asio库与STM32进行USART通讯 STM32 STM32F1