当前位置: 首页 > news >正文

PID模块化__以stm32直流电机速度为例

文章目录

  • 前言
  • 一、相关PID源码
    • .c
    • .h
  • 二、如何使用
    • 1.创建变量
    • 2.初始化
    • 3.运算
    • 4.修改pid参数
  • 总结


前言

本篇使用到的基于这个STM32CubeMX 直流电机PID速度控制、HAL库、cubemx、PID、速度控制、增量式
由于上次使用的pid没有模块化,当多出使用pid的时候就会很麻烦
所以这次使用的模块化的


一、相关PID源码

.c

/* 包含头文件 ----------------------------------------------------------------*/
#include "pid.h"/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
/* 函数体 --------------------------------------------------------------------*/ 
void abs_limit(float *a, float ABS_MAX)// 对输入 a 进行限制,使其在 [-ABS_MAX, ABS_MAX] 区间内
{if (*a > ABS_MAX)*a = ABS_MAX;if (*a < -ABS_MAX)*a = -ABS_MAX;
}// 初始化 PID 参数
static void pid_param_init(pid_t*   pid,          // PID 控制器结构体uint32_t mode,         // PID 控制器模式uint32_t maxout,       // PID 控制器输出最大值uint32_t intergral_limit, // PID 控制器积分限制float    kp,           // PID 控制器 P 项系数float    ki,           // PID 控制器 I 项系数float    kd)           // PID 控制器 D 项系数
{pid->integral_limit = intergral_limit;pid->max_out        = maxout;pid->pid_mode       = mode;pid->p = kp;pid->i = ki;pid->d = kd;}
/*** @brief     modify pid parameter when code running* @param[in] pid: control pid struct* @param[in] p/i/d: pid parameter* @retval    none*/
static void pid_reset(pid_t *pid, float kp, float ki, float kd)// 重置 PID 控制器的参数
{pid->p = kp;pid->i = ki;pid->d = kd;pid->pout = 0;pid->iout = 0;pid->dout = 0;pid->out  = 0;}/*** @brief     calculate delta PID and position PID* @param[in] pid: control pid struct* @param[in] get: measure feedback value* @param[in] set: target value* @retval    pid calculate output */
float pid_calc(pid_t *pid, float get, float set)// 计算 PID 控制器的输出
{pid->get = get;pid->set = set;pid->err[NOW] = set - get;if ((pid->input_max_err != 0) && (pid->err[NOW] > pid->input_max_err))pid->err[NOW] = pid->input_max_err;if ((pid->input_min_err != 0) && (pid->err[NOW] < pid->input_min_err))pid->err[NOW] = pid->input_min_err;if (pid->pid_mode == POSITION_PID) //position PID// 位置式 PID 控制器{pid->pout = pid->p * pid->err[NOW];pid->iout += pid->i * pid->err[NOW];pid->dout = pid->d * (pid->err[NOW] - pid->err[LAST]);abs_limit(&(pid->iout), pid->integral_limit);pid->out = pid->pout + pid->iout + pid->dout;abs_limit(&(pid->out), pid->max_out);}else if (pid->pid_mode == DELTA_PID) //delta PID// 增量式 PID 控制器{pid->pout = pid->p * (pid->err[NOW] - pid->err[LAST]);pid->iout = pid->i * pid->err[NOW];pid->dout = pid->d * (pid->err[NOW] - 2 * pid->err[LAST] + pid->err[LLAST]);pid->out += pid->pout + pid->iout + pid->dout;abs_limit(&(pid->out), pid->max_out);}pid->err[LLAST] = pid->err[LAST];pid->err[LAST]  = pid->err[NOW];if ((pid->output_deadband != 0) && (fabs(pid->out) < pid->output_deadband))return 0;elsereturn pid->out;}
void pid_ClearIntegrals(pid_t*   pid)// 清除积分项
{pid->pout = 0;pid->iout = 0;pid->dout = 0;pid->out  = 0;
}
/*** @brief     initialize pid parameter* @retval    none*/
void PID_struct_init(		// 初始化 PID 结构体pid_t*   pid,uint32_t mode,uint32_t maxout,uint32_t intergral_limit,float kp,float ki,float kd)
{pid->f_param_init = pid_param_init;pid->f_pid_reset  = pid_reset;pid->f_pid_calc = pid_calc;pid->f_pid_ClearIntegrals = pid_ClearIntegrals;pid->f_param_init(pid, mode, maxout, intergral_limit, kp, ki, kd);pid->f_pid_reset(pid, kp, ki, kd);
}

.h

#ifndef __PID_H__
#define __PID_H__/* 包含头文件 ----------------------------------------------------------------*/
#include "stdint.h"
#include "math.h"
/* 类型定义 ------------------------------------------------------------------*/
enum
{LLAST = 0,LAST,NOW,POSITION_PID,DELTA_PID,
};
typedef struct pid_t
{float p;float i;float d;float set;float get;float err[3];float pout;float iout;float dout;float out;float input_max_err;    //input max err;float input_min_err;    //input max err;float output_deadband;  //output deadband;uint32_t pid_mode;uint32_t max_out;uint32_t integral_limit;void  (*f_param_init)(struct pid_t *pid, uint32_t      pid_mode,uint32_t      max_output,uint32_t      inte_limit,float         p,float         i,float         d);void  (*f_pid_reset)(struct pid_t *pid, float p, float i, float d);float (*f_pid_calc)(struct pid_t *pid, float get, float set);void  (*f_pid_ClearIntegrals)(struct pid_t*   pid);
} pid_t;
/* 宏定义 --------------------------------------------------------------------*/
/* 扩展变量 ------------------------------------------------------------------*/
/* 函数声明 ------------------------------------------------------------------*/
void PID_struct_init(pid_t*   pid,uint32_t mode,uint32_t maxout,uint32_t intergral_limit,float kp,float ki,float kd);
float pid_calc(pid_t *pid, float get, float set);
#endif  // __PID_H__

二、如何使用

1.创建变量

在main.c或者其他位置创建pid的变量

pid_t a_moto_pid;
pid_t b_moto_pid;

2.初始化

注意一定要在pid计算之前初始化all_moto_pid_init,不然会导致stm32硬件错误!!!!

void all_moto_pid_init(void)
{PID_struct_init(&a_moto_pid,              // PID 控制器对象DELTA_PID,      // 控制器模式7500,               // 输出最大值0,                // 积分限制45.0f,              // P 项系数25.0f,              // I 项系数0.0f               // D 项系数);PID_struct_init(&b_moto_pid,              // PID 控制器对象DELTA_PID,      // 控制器模式7500,               // 输出最大值0,                // 积分限制45.0f,              // P 项系数25.0f,              // I 项系数0.0f               // D 项系数);	}

3.运算


int a_moto_pid_calc(float current_value,float target_value)/*current_value当前值target_value目标值*/
{
// 使用 PID 控制器计算控制输出int control_output = a_moto_pid.f_pid_calc(&a_moto_pid, current_value, target_value);	return control_output;
}
int b_moto_pid_calc(float current_value,float target_value)/*current_value当前值target_value目标值*/
{
// 使用 PID 控制器计算控制输出int control_output = b_moto_pid.f_pid_calc(&b_moto_pid, current_value, target_value);	return control_output;
}

4.修改pid参数

/*
修改pid的值
*/
void angle_pid_set(float  p,float i ,float d )
{angle_pid.f_pid_reset(&angle_pid, p, i, d);
}

总结

简述一下,不喜勿喷谢谢。

相关文章:

PID模块化__以stm32直流电机速度为例

文章目录 前言一、相关PID源码.c.h 二、如何使用1.创建变量2.初始化3.运算4.修改pid参数 总结 前言 本篇使用到的基于这个STM32CubeMX 直流电机PID速度控制、HAL库、cubemx、PID、速度控制、增量式 由于上次使用的pid没有模块化&#xff0c;当多出使用pid的时候就会很麻烦 所以…...

Java ~ Collection/Executor ~ DelayQueue【总结】

前言 文章 相关系列&#xff1a;《Java ~ Collection【目录】》&#xff08;持续更新&#xff09;相关系列&#xff1a;《Java ~ Executor【目录】》&#xff08;持续更新&#xff09;相关系列&#xff1a;《Java ~ Collection/Executor ~ DelayQueue【源码】》&#xff08;学…...

前端高级面试题-安全相关

1 XSS 跨⽹站指令码&#xff08;英语&#xff1a; Cross-site scripting &#xff0c;通常简称为&#xff1a; XSS &#xff09;是⼀种⽹站应⽤程式的安全漏洞攻击&#xff0c;是代码注⼊的⼀种。 它允许恶意使⽤者将程式码注⼊到⽹⻚上&#xff0c;其他使⽤者在观看⽹⻚时就会…...

【前缀和】560.和为 K 的子数组

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 和为K的子数组 题目:示例:题解&#xff1a;解法一:解法二: 题目: 示例: 题解&#xff1a; 解法一: 暴力解法:我们很容易想到通过两个for循环去遍…...

【Docker】安全及日志管理

安全及日志管理 Docker 安全及日志管理一&#xff1a;Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 二&#xff1a;Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 三&#xff1a;Docker 架构缺陷与安全机制1. 容器之间的局域网攻击2. DDoS 攻击耗尽资源3.…...

基于x-scan扫描线的3D模型渲染算法

基于x-scan算法实现的z-buffer染色。c#语言&#xff0c;.net core framework 3.1运行。 模型是读取3D Max的obj模型。 x-scan算法实现&#xff1a; public List<Vertex3> xscan() {List<Vertex3> results new List<Vertex3>();SurfaceFormula formula g…...

LeetCode36.Valid-Sudoku<有效的数独>

题目&#xff1a; 思路&#xff1a; 这题并不难&#xff0c;它类似于N皇后问题。在N皇后问题中&#xff0c;行&#xff0c;列&#xff0c;对角线&#xff0c;写对角线&#xff0c;都不能出现连续的皇后。 本题类似&#xff0c;不过他是行&#xff0c;列&#xff0c;还有一个B…...

Linux中的pause函数

2023年7月29日&#xff0c;周六上午 函数原型 在Linux中&#xff0c;pause()函数用于使当前进程暂停执行&#xff0c;直到接收到一个信号。 #include <unistd.h>int pause(void);pause()函数不接受任何参数。 通常&#xff0c;pause()函数用于编写简单的信号处理程序&…...

CommonCollections6链分析

前面和CC1一样 优点是不限制jdk版本和cc的版本 先开一个ChainedTransformer 然后创LazyMap 我们顺便执行一下避免上面写错 能弹计算器 没问题 后面就是CC6不同的地方了 我们需要一个TiedMapEntry 因为需要一个类调用了get方法 在TiedMapEntry的getValue()方法中调用了get()…...

优化基于tcp,socket的ftp文件传输程序

原始程序&#xff1a; template_ftp_server_old.py&#xff1a; import socket import json import struct import os import time import pymysql.cursorssoc socket.socket(socket.AF_INET, socket.SOCK_STREAM) HOST 192.168.31.111 PORT 4101 soc.bind((HOST,PORT)) p…...

MySQL 数据库 【增删查改(二)】

目录 一、表的设计 1、一对一 2、一对多 3、多对多 二、新增 三、查询 1、聚合查询 &#xff08;1&#xff09;聚合函数&#xff1a; &#xff08;2&#xff09; group by 子句 &#xff08;3&#xff09;having 2、联合查询 (1)内连接 (2)外连接 (3)自链接 (4)…...

力扣 -- 978. 最长湍流子数组

一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int maxTurbulenceSize(vector<int>& nums) {int nnums.size();vector<int> f(n);…...

甘特图 Dhtmlx Gantt

介绍 在一些任务计划、日程进度等场景中我们会使用到甘特图&#xff0c;Dhtmlx Gantt 对于甘特图的实现支持很友好&#xff0c;文档API介绍全面&#xff0c;虽然增强版的收费&#xff0c;但免费版的足以够用。 官网&#xff1a;https://docs.dhtmlx.com/gantt/ 安装dhtml gannt…...

iOS 应用上架流程详解

iOS 应用上架流程详解 欢迎来到我的博客&#xff0c;今天我将为大家分享 iOS 应用上架的详细流程。在这个数字化时代&#xff0c;移动应用已经成为了人们生活中不可或缺的一部分&#xff0c;而 iOS 平台的 App Store 则是开发者们发布应用的主要渠道之一。因此&#xff0c;了解…...

Python入门【LEGB规则、面向对象简介、面向过程和面向对象思想、面向对象是什么? 对象的进化 、类的定义、对象完整内存结构 】(十三)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…...

【消息中间件】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

文章目录 视频演示效果前言一、分析二、全局注入MQTT连接1.引入库2.写入全局连接代码 二、PHP环境建立总结 视频演示效果 【uniapp】实现买定离手小游戏 前言 Mqtt不同环境问题太多&#xff0c;新手可以看下 《【MQTT】Esp32数据上传采集&#xff1a;最新mqtt插件&#xff08;支…...

【C语言初阶】指针篇—上

目录 1. 指针是什么&#xff1f;2. 指针和指针类型2.1 指针-整数2.2 指针的解引用 3. 野指针3.1 野指针成因1. 指针未初始化2. 指针越界访问3. 指针指向的空间释放 3.2 如何规避野指针 1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; > 1…...

基于FasterRCNN深度学习网络的车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ....................................................................... % 训练Faster R-…...

机器学习深度学习——多层感知机

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——感知机 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 上一节…...

Django模型将模型注释同步到数据库

1、安装django-comment-migrate库 pip install django-comment-migrate 2、将库注册到settings.py文件中 INSTALLED_APPS [...django_comment_migrate, # 表注释... ] 3、加注释 3.1、给模型&#xff08;表&#xff09;加注释 在模型的class Meta中编辑 verbose_name&…...

Hasklig 可变字体终极指南:单一文件实现多字重支持的完整教程

Hasklig 可变字体终极指南&#xff1a;单一文件实现多字重支持的完整教程 【免费下载链接】Hasklig Hasklig - a code font with monospaced ligatures 项目地址: https://gitcode.com/gh_mirrors/ha/Hasklig Hasklig 是一款专为程序员设计的开源代码字体&#xff0c;以…...

深入Fast DDS传输层:从UDP、TCP到共享内存,如何为你的ROS2应用选择最佳通信方式?

Fast DDS传输层深度解析&#xff1a;UDP、TCP与共享内存的工程实践指南 在分布式系统架构中&#xff0c;通信中间件的性能直接影响整个系统的响应速度和可靠性。作为ROS 2的默认通信中间件&#xff0c;Fast DDS提供了多种传输协议选择&#xff0c;但如何根据实际场景做出最优决…...

为什么你的Java车载模块在-40℃冷启动失败?温度敏感型JIT编译失效分析与AOT预编译加固方案(ISO 26262 Part 6实证)

第一章&#xff1a;Java车载系统实时性优化技巧在车载嵌入式环境中&#xff0c;Java虚拟机&#xff08;JVM&#xff09;的默认行为往往难以满足毫秒级响应、确定性调度与低抖动等硬实时需求。尽管Java并非传统实时语言&#xff0c;但通过深度配置与架构约束&#xff0c;可显著提…...

XMind快捷键背不会?试试我这套‘肌肉记忆’训练法,用这5个高频组合搞定80%的绘图

XMind快捷键肌肉记忆训练法&#xff1a;5个高频组合提升80%绘图效率 刚接触XMind时&#xff0c;我总在菜单栏里来回翻找功能按钮&#xff0c;每次画完一张思维导图手腕都隐隐发酸。直到发现产品总监小王能在十分钟内完成我半小时的工作量——他的双手几乎没离开过键盘&#xff…...

CasRel在电商商品知识图谱中的应用:标题-品牌-品类-功效三元组生成

CasRel在电商商品知识图谱中的应用&#xff1a;标题-品牌-品类-功效三元组生成 1. 理解CasRel关系抽取模型 CasRel&#xff08;Cascade Binary Tagging Framework&#xff09;是一个专门从文本中自动提取结构化信息的智能模型。想象一下&#xff0c;你有一大段描述商品的文字…...

如何高效捕获网页媒体资源?猫抓插件让智能嗅探变得如此简单

如何高效捕获网页媒体资源&#xff1f;猫抓插件让智能嗅探变得如此简单 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否遇到过想保存网页上的精彩视频却找不到下载按钮的尴尬&#xff1f;是否曾…...

SQLite Indexed By: 高效索引策略解析与应用

SQLite Indexed By: 高效索引策略解析与应用 引言 SQLite 是一款轻量级的关系型数据库管理系统,以其小巧的体积和强大的功能在移动应用、嵌入式系统和网络应用中得到了广泛的应用。索引是数据库中不可或缺的一部分,它能够极大地提高查询效率。本文将深入探讨 SQLite 的索引…...

3分钟打造个性化英雄联盟体验:LeaguePrank工具让段位展示彻底自定义

3分钟打造个性化英雄联盟体验&#xff1a;LeaguePrank工具让段位展示彻底自定义 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否曾想在好友面前展示独特的游戏段位&#xff1f;是否希望自己的游戏生涯页面与众不同&…...

SDMatte与前端框架React集成:打造交互式在线图片编辑工具

SDMatte与前端框架React集成&#xff1a;打造交互式在线图片编辑工具 1. 引言&#xff1a;为什么需要在线图片编辑工具 电商商家每天需要处理大量商品图片&#xff0c;传统PS操作门槛高且效率低下。而专业设计师又需要更灵活的工具进行创意表达。基于React框架和SDMatte构建的…...

如何完美解决MacBook触控板在Windows的三指拖动难题

如何完美解决MacBook触控板在Windows的三指拖动难题 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/ThreeFingersDragOnWindows …...