阳极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;
}
posted @ 2023-05-26 05:23  dage0709  阅读(41)  评论(0)    收藏  举报