换血大更新
This commit is contained in:
123
bsp_Device/bsp_math/bsp_BMP.cpp
Normal file
123
bsp_Device/bsp_math/bsp_BMP.cpp
Normal 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);}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
112
bsp_Device/bsp_math/bsp_BMP.h
Normal file
112
bsp_Device/bsp_math/bsp_BMP.h
Normal 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
|
||||
100
bsp_Device/bsp_math/bsp_CRC.cpp
Normal file
100
bsp_Device/bsp_math/bsp_CRC.cpp
Normal 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 );}
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
39
bsp_Device/bsp_math/bsp_CRC.h
Normal file
39
bsp_Device/bsp_math/bsp_CRC.h
Normal 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);
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
117
bsp_Device/bsp_math/bsp_Calculus.cpp
Normal file
117
bsp_Device/bsp_math/bsp_Calculus.cpp
Normal 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;}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
83
bsp_Device/bsp_math/bsp_Calculus.h
Normal file
83
bsp_Device/bsp_math/bsp_Calculus.h
Normal 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
|
||||
207
bsp_Device/bsp_math/bsp_PID.cpp
Normal file
207
bsp_Device/bsp_math/bsp_PID.cpp
Normal 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) {}
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
98
bsp_Device/bsp_math/bsp_PID.h
Normal file
98
bsp_Device/bsp_math/bsp_PID.h
Normal 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
|
||||
Reference in New Issue
Block a user