生成一个PID算法的代码,用在两轮平衡小车上,使用keil5软件,stm32F103C8T6芯片,标准库,请写好注释和全套代码,c和h文件
时间: 2023-06-12 22:06:58 浏览: 89
注释版PID算法代码(包含C和H文件):
pid.h文件
```c
#ifndef __PID_H
#define __PID_H
#include "stm32f10x.h"
typedef struct{
float SetSpeed; //设定速度
float ActualSpeed; //实际速度
float err; //误差
float err_last; //上一个误差
float Kp,Ki,Kd; //比例、积分、微分系数
float voltage; //控制电压
float integral; //积分值
float umax; //最大输出值
float umin; //最小输出值
}PID;
void PID_Init(PID *pid);
float PID_calc(PID *pid,float speed);
#endif
```
pid.c文件
```c
#include "pid.h"
void PID_Init(PID *pid)
{
pid->SetSpeed = 0.0; //设定速度初值
pid->ActualSpeed = 0.0; //实际速度初值
pid->err = 0.0; //误差初值
pid->err_last = 0.0; //上一个误差初值
pid->integral = 0.0; //积分值初值
pid->Kp = 0.1; //比例系数
pid->Ki = 0.015; //积分系数
pid->Kd = 0.2; //微分系数
pid->umax = 5000.0; //最大输出值
pid->umin = -5000.0; //最小输出值
}
float PID_calc(PID *pid,float speed)
{
pid->SetSpeed = speed; //设定速度
pid->err = pid->SetSpeed - pid->ActualSpeed; //误差
pid->integral += pid->err; //积分值
pid->voltage = pid->Kp*pid->err + pid->Ki*pid->integral + pid->Kd*(pid->err - pid->err_last); //控制电压
pid->err_last = pid->err; //保存误差值
if (pid->voltage > pid->umax) //输出限幅
pid->voltage = pid->umax;
else if (pid->voltage < pid->umin)
pid->voltage = pid->umin;
pid->ActualSpeed = pid->voltage / 10.0; //实际速度
return pid->ActualSpeed;
}
```
在main函数中调用PID_Init函数初始化PID参数,然后在主循环中调用PID_calc函数计算输出电压并控制小车达到设定速度。具体代码如下:
```c
#include "stm32f10x.h"
#include "pid.h"
int main()
{
PID pid;
float speed = 100.0; //设定速度为100.0
float actual_speed;
PID_Init(&pid); //初始化PID参数
while(1)
{
actual_speed = PID_calc(&pid,speed); //计算输出电压并控制小车达到设定速度
//其他控制代码
}
}
```
阅读全文