阳极PID
/* 阳极状态:
* 1. 0.8 ->boost;
* 2. 1.3 ->run;
* 3. 1.8 ->brake;
* 4. 0V ->idle.
0.6->1->1.4
*/
TIM1 0.1ms进入一次中断
RotorMainCur_Buf =ADC2->DR; //ADC2 IN14
RotorMainCur_dot1ms +=RotorMainCur_Buf; //0.1ms累计
RotorMainCur_1ms =RotorMainCur_dot1ms/10; //1ms将累计10次的值求平均值
RotorMainCur_dot1ms =0; //1ms累计值清零
对反馈值消抖,输出:RotorMainCur_1ms
TIM2 1ms 进入一次中断
RotorMainCur_10ms +=RotorMainCur_1ms; //1ms累计
rotor_10ms_temp =RotorMainCur_10ms / 10; //10ms累计10次的值求平均值
RotorStandbyCur_Ain = rotor_10ms_temp;
if(RotorStandbyCur_Ain > MAX_ROTOR_RUN_CUR)
连续10000ms报:阳极静态电流高 999
Precharge信号关闭,停止阳极供电
RotorMainCur_Ain = rotor_10ms_temp; //6A=2V
阳极run的情况下:
if(RotorMainCur_Ain < MIN_ROTOR_MAIN_CUR) //90 0.6A
连续500ms报:主绕组欠电流 62
if(RotorMainCur_Ain > MAX_ROTOR_RUN_CUR) //680
连续500ms报:阳极主绕组电流高 998
PID例子
比例(P)项根据当前误差进行计算,以产生与误差成正比的输出。
积分(I)项采用误差随时间变化的积分,以消除稳态误差并增强控制器对慢速变化的响应。
微分(D)项采用误差变化率的导数,以抑制快速变化并提高控制器对快速变化的响应。
#include <stdio.h>
float Kp = 1.0; // 比例系数
float Ki = 0.5; // 积分系数
float Kd = 0.2; // 微分系数
float target = 50.0; // 目标值
float feedback = 0.0; // 反馈值
float error = 0.0; // 误差
float last_error = 0.0; // 上一次的误差
float integral = 0.0; // 积分误差
int main() {
while(1) {
feedback = get_feedback(); // 获取当前反馈值,例如传感器读数
error = target - feedback; // 计算误差
integral += error; // 累加积分误差
float derivative = error - last_error; // 计算微分误差
last_error = error; // 更新上一次误差
float output = Kp * error + Ki * integral + Kd * derivative; // 计算PID输出
set_output(output); // 设置控制器输出,例如执行器控制
}
return 0;
}
浙公网安备 33010602011771号