换血大更新

This commit is contained in:
XerolySkinner
2023-03-06 12:44:58 +08:00
parent dcee54c50d
commit d14d2c5c95
933 changed files with 7422 additions and 2824 deletions

View File

@@ -0,0 +1,123 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_BMP.cpp
* @brief 用来构造BMP图片
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-24 20:22
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 头文件
#include "bsp_BMP.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类函数
/**
* @brief 设置像素
* @param x x像素
* @param y y像素
*/
void bsp_BMP::pels(u32 x, u32 y) {
bsp_BMP::BITMAPINFO.bmiHeader.biXPelsPerMeter = x;
bsp_BMP::BITMAPINFO.bmiHeader.biYPelsPerMeter = y;}
/**
* @brief 给予数据空间
* @return 返回给与的数据头
*/
u32 bsp_BMP::giveData(void) {
free(dat);
dat = (u8*)malloc(Size);
return (u32)dat;}
/**
* @brief 释放数据空间
*/
void bsp_BMP::delData(void) {
free(dat);}
/**
* @brief 设置调色板
* @param R 红色
* @param G 绿色
* @param B 蓝色
* @param i 索引号
*/
void bsp_BMP::ColorsSet(u8 R, u8 G, u8 B,u32 i) {
BITMAPINFO.bmiColors[i].rgbBlue = B;
BITMAPINFO.bmiColors[i].rgbGreen = G;
BITMAPINFO.bmiColors[i].rgbRed = R;
BITMAPINFO.bmiColors[i].rgbReserved = 0;}
/**
* @brief 设置图片大小
* @param Width 图片宽度
* @param Height 图片高度
*/
void bsp_BMP::sizeSet(u32 x, u32 y) {
free(dat);
Size = x * y;
BITMAPINFO.bmiHeader.biWidth = x; // 色彩宽度
BITMAPINFO.bmiHeader.biHeight = y; // 色彩高度
BITMAPINFO.bmfHeader.bfOffBits =
sizeof(_BITMAPINFO); // 位图数据偏倚
BITMAPINFO.bmfHeader.bfSize =
x * y +
BITMAPINFO.bmfHeader.bfOffBits; // 文件大小
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 构造函数
/**
* @brief 构造BMP数据头
* @param Width 图片宽度
* @param Height 图片高度
*/
bsp_BMP::bsp_BMP(u32 Width, u32 Height) {
bsp_BMP::dat = NULL;
bsp_BMP::Size = Width * Height;
BITMAPINFO.bmiHeader.biWidth = Width; // 色彩宽度
BITMAPINFO.bmiHeader.biHeight = Height; // 色彩高度
BITMAPINFO.bmfHeader.bfType = 0x4D42; // 恒为保护字
BITMAPINFO.bmfHeader.bfReserved1 = 0; // 保留字
BITMAPINFO.bmfHeader.bfReserved2 = 0; // 保留字
BITMAPINFO.bmiHeader.biCompression = 0; // 无压缩
BITMAPINFO.bmiHeader.biSizeImage = 0; // 无压缩下为0
BITMAPINFO.bmiHeader.biPlanes = 1; // 恒为保护字
BITMAPINFO.bmiHeader.biClrUsed = 0; // 使用全部颜色
BITMAPINFO.bmiHeader.biClrImportant = 0; // 全部颜色都重要
BITMAPINFO.bmiHeader.biXPelsPerMeter = 0; // 像素-不太重要
BITMAPINFO.bmiHeader.biYPelsPerMeter = 0; // 像素-不太重要
BITMAPINFO.bmiHeader.biSize = 40; // 信息头大小
BITMAPINFO.bmfHeader.bfOffBits =
sizeof(_BITMAPINFO); // 位图数据偏倚
BITMAPINFO.bmfHeader.bfSize =
Width * Height+
BITMAPINFO.bmfHeader.bfOffBits; // 文件大小
BITMAPINFO.bmiHeader.biBitCount = 8; // 色彩深度
}
//----------------------------------------------------------------------------------------------------
bsp_BMP::~bsp_BMP(void) {
free(dat);}
//////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,112 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_BMP.h
* @brief 用来构造BMP图片
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-24 20:22
*/
#pragma once
#ifdef __cplusplus
#include "varint.h"
#include <stdlib.h>
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 文件头
#pragma pack(1)
/**
* @brief 位图文件头
*/
typedef struct
{
u16 bfType; //文件标志.固定为'BM',用来识别BMP位图类型
u32 bfSize; //文件大小,占四个字节
u16 bfReserved1; //保留总为0
u16 bfReserved2; //保留总为0
u32 bfOffBits; //从文件开始到位图数据(bitmap data)开始之间的的偏移量
}_BITMAPFILEHEADER;
/**
* @brief 位图信息头
*/
typedef struct {
u32 biSize; //BITMAPINFOHEADER结构所需要的字数。
u32 biWidth; //图象的宽度,以象素为单位
u32 biHeight; //图象的高度,以象素为单位
u16 biPlanes; //为目标设备说明位面数其值将总是被设为1
u16 biBitCount; //比特数/象素其值为1、4、8、16、24、或32
u32 biCompression; //图象数据压缩的类型。其值可以是下述值之一:
//BI_RGB没有压缩
//BI_RLE8每个象素8比特的RLE压缩编码压缩格式由2字节组成(重复象素计数和颜色索引)
//BI_RLE4每个象素4比特的RLE压缩编码压缩格式由2字节组成
//BI_BITFIELDS每个象素的比特由指定的掩码决定。
u32 biSizeImage; //图象的大小以字节为单位。当用BI_RGB格式时可设置为0
u32 biXPelsPerMeter; //水平分辨率,用象素/米表示
u32 biYPelsPerMeter; //垂直分辨率,用象素/米表示
u32 biClrUsed; //位图实际使用的彩色表中的颜色索引数
u32 biClrImportant; //对图象显示有重要影响的颜色索引的数目如果是0表示都重要。
}_BITMAPINFOHEADER;
/**
* @brief 调色板
*/
typedef struct{
u8 rgbBlue; //指定蓝色强度
u8 rgbGreen; //指定绿色强度
u8 rgbRed; //指定红色强度
u8 rgbReserved; //保留设置为0
}_RGBQUAD;
/**
* @brief BMP文件头
*/
typedef struct{
_BITMAPFILEHEADER bmfHeader; //位图文件头
_BITMAPINFOHEADER bmiHeader; //位图信息头
_RGBQUAD bmiColors[256]; //调色板
}_BITMAPINFO;
#pragma pack()
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 头文件
/**
* @brief 构建一个BMP类
*/
class bsp_BMP {
public:
bsp_BMP(u32 Width, u32 Height);
~bsp_BMP(void);
public:
void pels(u32 x, u32 y);
u32 giveData(void);
void delData(void);
void ColorsSet(u8 R, u8 G, u8 B,u32 i);
void sizeSet(u32 x, u32 y);
public:
_BITMAPINFO BITMAPINFO; ///< 文件头
u32 Size; ///< 文件大小
u8* dat; ///< 数据区
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -0,0 +1,100 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_CRC.cpp
* @brief CRC16校验
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-21 04:10
*/
#include "bsp_CRC.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------------------------
// 函数
/// CRC-16-MODBUS-查表法-高字节数据表
static const u8 aucCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40
};
//--------------------------------------------------------------------------------------------------
/// CRC-16-MODBUS-查表法-低字节数据表
static const u8 aucCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,
0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,
0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,
0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,
0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,
0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,
0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
0x41, 0x81, 0x80, 0x40
};
////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------------------------
// 函数
u16 CRC16_MODBUS(u8 *pucFrame,u16 usLen){
u8 ucCRCHi = 0xFF;
u8 ucCRCLo = 0xFF;
u32 iIndex;
while (usLen--){
iIndex = ucCRCLo ^ *(pucFrame++);
ucCRCLo = (u8)(ucCRCHi ^ aucCRCHi[iIndex]);
ucCRCHi = aucCRCLo[iIndex];}
return ( u16 )( ucCRCHi << 8 | ucCRCLo );}
////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,39 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_CRC.h
* @brief CRC16校验
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-21 04:10
*/
#pragma once
#include "varint.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
//--------------------------------------------------------------------------------------------------
// 函数
u16 CRC16_MODBUS(u8 *pucFrame,u16 usLen);
////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,117 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_Calculus.cpp
* @brief 离散微积分
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-23 02:46
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 头文件
#include "bsp_Calculus.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类函数
/**
* @brief 对数据微分
* @param var 此处填入浮点数据
* @return 此时的微分值
*/
float bsp_Differential::Differential(float var) {
static float old=var;
float result= (var - old) / dt;
old = var;
return result;}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类函数
/**
* @brief 对数据积分
* @param var 此处填入浮点数据
* @return 从开始到现在的总积分值
*/
float bsp_Integral::Integral(float var) {
results += var * dt;
return results;}
//----------------------------------------------------------------------------------------------------
/**
* @brief 重设当前积分值
* @param var 要设置的积分值
*/
void bsp_Integral::Integral_set(float results) {
bsp_Integral::results = results;}
//----------------------------------------------------------------------------------------------------
/**
* @brief 赋予历史缓存长度
* @param var 分配的缓存长度
* @return 返回分配的内存位置,0为分配失败
*/
u32 bsp_Integral::Integral_makelist(u32 len) {
result_list = (float*)malloc(sizeof(float)* len);
result_len = len;
Integral_clslist();
return (u32)result_list;}
//----------------------------------------------------------------------------------------------------
/**
* @brief 进行带有缓冲区的积分
* @param var 需要积分的数值
* @return 返回积分值
*/
float bsp_Integral::Integral_list(float var) {
static u32 len=0;
results += var * dt;
// 保存历史
result_list[len] = var * dt;
// 轮盘转
++len;
if (len == result_len)len = 0;
// 去除尾值
if (len < result_len - 1)
results -= result_list[len + 1];
else
results -= result_list[0];
//
return results;}
//----------------------------------------------------------------------------------------------------
/**
* @brief 删除并释放历史缓冲区
*/
void bsp_Integral::Integral_dellist(void) {
free(result_list);
result_len = 0;
result_list = NULL;}
//----------------------------------------------------------------------------------------------------
/**
* @brief 清空历史缓存区
*/
void bsp_Integral::Integral_clslist(void) {
if (result_list == NULL)return;
for (u32 i = 0; i < result_len; i++)
result_list[i] = 0;}
//////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,83 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_Calculus.h
* @brief 离散微积分
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-23 02:46
*/
#pragma once
#ifdef __cplusplus
#include <stdlib.h>
#include "varint.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类目
/**
* @brief 一个微分对象
*/
class bsp_Differential{
public:
bsp_Differential(float dt) {
bsp_Differential::dt = dt;}
public:
float Differential(float var);
public:
float dt; ///< 时间参数
};
//----------------------------------------------------------------------------------------------------
/**
* @brief 一个积分对象
* @note 不应当混用Integral和Integral_list
* @note 选定一种方式(带缓冲区或者不带)后,就不应该更改使用方式
* @note 虽然带缓冲区方式对算法时间影响不大,但是为了避免浪费空间,不建议使用过大的缓冲区
*/
class bsp_Integral {
public:
bsp_Integral(float dt) {
bsp_Integral::result_list = NULL;
bsp_Integral::dt = dt;
bsp_Integral::results = 0;}
~bsp_Integral(void) {
free(result_list);
result_list = NULL;}
public:
float Integral(float var);
void Integral_set(float results);
float Integral_list(float var);
u32 Integral_makelist(u32 len);
void Integral_dellist(void);
void Integral_clslist(void);
public:
float *result_list; ///< 数据历史
u32 result_len; ///< 历史缓冲区长度
float results; ///< 积分缓存
float dt; ///< 时间参数
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -0,0 +1,207 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_PID.cpp
* @brief 实现了PID算法
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-09 03:12
*/
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 头文件
//
#include "bsp_PID.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类函数
//
/**
* @brief PID算法
* @param temp 目前变量
* @return 返回调整量
*/
float bsp_Position_PID::PID(float temp) {
float thisError;
thisError = target - temp; //当前误差等于设定值减去当前值
integral += thisError; //误差积分,把所有误差累加起来
result =
Kp * thisError +
Ki * integral +
Kd * (thisError - lasterror);
lasterror = thisError;
if (result_H == result_L)return result;
if (result >= result_H)result == result_H;
else if (result <= result_L)result == result_L;
return result;
}
//----------------------------------------------------------------------------------------------------
/**
* @brief PID算法
* @param temp 目前变量
* @return 返回调整量
*/
float bsp_Increment_PID::PID(float temp) {
float thisError=target - temp; //当前误差等于设定值减去当前值
float increment;
float pError, dError, iError;
pError = thisError - lasterror;
iError = thisError;
dError = thisError - 2 * lasterror + preerror;
increment =
Kp * pError +
Ki * iError +
Kd * dError; //增量计算
preerror = lasterror; //存放偏差用于下次运算
lasterror = thisError; //存放偏差用于下次运算
result += increment; //上次结果叠加增量
if (result_H == result_L)return result;
if (result >= result_H)result == result_H;
else if (result <= result_L)result == result_L;
return result;}
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
/**
* @brief 清理历史数据
* @return 清除PID运算数据
*/
void bsp_Position_PID::clean(void) {
integral = 0; //积分值
lasterror = 0; //前一拍偏差
result = 0; //输出值
}
//----------------------------------------------------------------------------------------------------
/**
* @brief 清理历史数据
* @return 清除PID运算数据
*/
void bsp_Increment_PID::clean(void) {
lasterror = 0; //前一拍偏差
preerror = 0; //前两拍偏差
result = 0; //输出值
}
//----------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------
/**
* @brief PID参数设置
* @param P P参数
* @param I I参数
* @param D D参数
*/
void bsp_Position_PID::set(float P, float I, float D) {
Kp = P; Ki = I; Kd = D;}
//----------------------------------------------------------------------------------------------------
/**
* @brief PID参数设置
* @param P P参数
* @param I I参数
* @param D D参数
*/
void bsp_Increment_PID::set(float P, float I, float D) {
Kp = P; Ki = I; Kd = D;}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 构造函数
//
bsp_Position_PID::bsp_Position_PID(void) {
bsp_Position_PID::target = 0;
bsp_Position_PID::lasterror = 0;
bsp_Position_PID::Kp = 0;
bsp_Position_PID::Ki = 0;
bsp_Position_PID::Kd = 0;
bsp_Position_PID::integral = 0;
bsp_Position_PID::result = 0;
bsp_Position_PID::result_H = 0;
bsp_Position_PID::result_L = 0;
}
//----------------------------------------------------------------------------------------------------
/**
* @brief PID算法
* @param Kp P参数
* @param Ki I参数
* @param Kd D参数
* @param target 目标值
* @param result_H 输出最大值
* @param result_L 输出最小值
*/
bsp_Position_PID::bsp_Position_PID(
float Kp, float Ki, float Kd, float target,
float result_H, float result_L) {
bsp_Position_PID::target = target;
bsp_Position_PID::lasterror = 0;
bsp_Position_PID::Kp = Kp;
bsp_Position_PID::Ki = Ki;
bsp_Position_PID::Kd = Kd;
bsp_Position_PID::integral = 0;
bsp_Position_PID::result = 0;
bsp_Position_PID::result_H = 0;
bsp_Position_PID::result_L = 0;
}
//----------------------------------------------------------------------------------------------------
bsp_Position_PID::~bsp_Position_PID(void) {}
//----------------------------------------------------------------------------------------------------
bsp_Increment_PID::bsp_Increment_PID(void) {
bsp_Increment_PID::target = 0;
bsp_Increment_PID::lasterror = 0;
bsp_Increment_PID::preerror = 0;
bsp_Increment_PID::Kp = 0;
bsp_Increment_PID::Ki = 0;
bsp_Increment_PID::Kd = 0;
bsp_Increment_PID::result = 0;
bsp_Increment_PID::result_H = 0;
bsp_Increment_PID::result_L = 0;
}
//----------------------------------------------------------------------------------------------------
/**
* @brief PID算法
* @param Kp P参数
* @param Ki I参数
* @param Kd D参数
* @param target 目标值
* @param result_H 输出最大值
* @param result_L 输出最小值
*/
bsp_Increment_PID::bsp_Increment_PID(
float Kp, float Ki, float Kd, float target,
float result_H, float result_L) {
bsp_Increment_PID::target = target;
bsp_Increment_PID::lasterror = 0;
bsp_Increment_PID::preerror = 0;
bsp_Increment_PID::Kp = Kp;
bsp_Increment_PID::Ki = Ki;
bsp_Increment_PID::Kd = Kd;
bsp_Increment_PID::result = 0;
bsp_Increment_PID::result_H = 0;
bsp_Increment_PID::result_L = 0;
}
//----------------------------------------------------------------------------------------------------
bsp_Increment_PID::~bsp_Increment_PID(void) {}
//////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,98 @@
/*----------------------------------------------------------------------------------------------------
#
# Copyright (c) 2022 Yuankang Liang(XerolySkinner)
#
# 本软件按原样提供,无任何明示或暗示
# 在任何情况下,作者都不承担任何损害赔偿责任
#
# 使用的许可声明:
# 1. 不得歪曲本软件的来源,你不能声称你编写了原始软件.
# 2. 免费授予以任何目的,前提是版权声明出现在所有副本中.
# 并且版权声明和许可声明同时出现.
# 3. 你有使用,复制,修改,分发,和销售本软件的许可.
# 4. 如果你在产品中使用,产品文档中的声明是赞赏的但不是必须的.
# 5. 本通知不得从任何来源删除或更改.
#
# Yuankang Liang(XerolySkinner)
# E-mail:zabbcccbbaz@163.com
# QQ:2715099320
# Mobile Phone:13005636215
#
# All rights reserved.
*/
/**
* @file bsp_PID.h
* @brief 实现了PID算法
* @mainpage 主要信息
* @author Yuankang Liang(XerolySkinner)
* @email zabbcccbbaz@163.com
* @version V1.0.0
* @date 2022-11-09 03:12
*/
#ifdef __cplusplus
#pragma once
#include "varint.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类目
/**
* @brief 位置法为基础的PID算法
*/
class bsp_Position_PID{
public:
bsp_Position_PID(void);
bsp_Position_PID(
float Kp, float Ki, float Kd, float target,
float result_H, float result_L);
~bsp_Position_PID(void);
public:
float PID(float temp);
void clean(void);
void set(float P, float I, float D);
public:
float target; ///< 设定值
float Kp; ///< 比例系数
float Kd; ///< 积分系数
float Ki; ///< 微分系数
float result; ///< 输出值
private:
float integral; ///< 积分值
float lasterror; ///< 前一拍偏差
float result_H; ///< 输出最高值
float result_L; ///< 输出最低值
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------
// 类目
/**
* @brief 增量法为基础的PID算法
*/
class bsp_Increment_PID {
public:
bsp_Increment_PID(void);
bsp_Increment_PID(
float Kp, float Ki, float Kd, float target,
float result_H, float result_L);
~bsp_Increment_PID(void);
public:
float PID(float temp);
void clean(void);
void set(float P, float I, float D);
public:
float target; ///< 设定值
float Kp; ///< 比例系数
float Kd; ///< 积分系数
float Ki; ///< 微分系数
float result; ///< 输出值
private:
float lasterror; ///< 前一拍偏差
float preerror; ///< 前两拍偏差
float result_H; ///< 输出最高值
float result_L; ///< 输出最低值
};
//////////////////////////////////////////////////////////////////////////////////////////////////////
#endif