tec控制pid程序_单片机中实现模糊控制PID程序

#define KPU 0.01

#define KIU 0.0005

#define KDU 0.1

#define KE 0.06

#define KEC 3

char code dkp[13][13]={

{6,6,6,5,4,4,4,3,3,2,0,0,0},

{6,6,6,5,4,3,3,3,3,2,0,-1,-1},

{6,6,6,5,4,3,3,3,3,2,0,-1,-2},

{5,5,5,5,4,3,3,2,2,0,-1,-1,-2},

{4,4,4,4,4,3,3,2,0,-1,-2,-2,-2},

{4,4,4,3,3,2,2,0,-1,-1,-3,-3,-3},

{4,4,4,3,3,2,0,-1,-2,-3,-3,-3,-3},

{3,3,3,2,2,0,-1,-1,-2,-3,-3,-3,-3},

{3,3,3,2,0,-1,-2,-2,-2,-3,-3,-3,-3},

{3,2,2,0,-1,-1,-3,-3,-3,-3,-3,-4,-4},

{3,2,0,-1,-2,-3,-3,-3,-3,-3,-3,-4,-6},

{2,2,0,-1,-3,-3,-3,-3,-3,-4,-4,-4,-5},

{0,0,0,-1,-3,-3,-3,-3,-3,-4,-6,-5,-6}

}; //K模糊控制表

char code dki[13][13]={{-6,-5,-6,-4,-3,-3,-3,-3,-2,-1,0,0,0},

{-5,-5,-5,-4,-3,-3,-3,-3,-2,-1,0,0,0},

{-6,-5,-6,-4,-3,-3,-2,-2,-2,-1,0,0,0},

{-5,-4,-4,-3,-3,-3,-2,-1,-1,0,2,2,2},

{-6,-4,-3,-3,-2,-2,-2,-1,0,2,3,3,3},

{-4,-4,-3,-3,-2,-1,-1,0,2,2,3,3,3},

{-3,-3,-3,-3,-2,-1,0,2,3,3,4,4,4},

{-3,-3,-3,-1,-1,0,2,2,3,3,4,5,5},

{-3,-3,-2,-1,0,2,3,3,3,3,4,5,6},

{-1,-1,-1,0,2,2,3,3,3,4,5,5,6},

{0,0,0,2,3,3,3,3,4,5,6,6,6},

{0,0,0,2,3,3,3,3,4,5,6,6,6},

{0,0,0,2,3,3,4,4,4,5,6,6,6}

};

char code dkd[13][13]={{3,0,-2,-3,-6,-5,-6,-5,-6,-4,-3,0,3},

{3,0,-2,-3,-5,-4,-4,-4,-4,-3,-3,0,2},

{3,0,-2,-3,-6,-4,-3,-3,-3,-3,-2,-1,0},

{2,0,-2,-3,-4,-4,-3,-3,-3,-3,-2,-1,0},

{0,-1,-2,-3,-3,-3,-3,-3,-2,-2,-2,-1,0},

{0,-1,-2,-3,-3,-3,-3,-3,-2,-2,-2,-1,0},

{0,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,0},

{0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0},

{0,0,0,0,0,0,0,0,0,0,0,0,0},

{2,1,-1,0,2,2,2,2,2,2,2,2,2},

{6,1,-2,0,3,3,3,3,3,3,3,4,6},

{6,2,1,2,3,3,3,3,3,3,3,4,6},

{6,5,4,4,4,4,4,3,3,3,3,4,6}

};

/*===========================================

函数功能:温度自动调节函数

============================================*/

void fuzzypid(void)

{

uchar te=0,tec=0;

float kp,ki,kd;

kp=0.35;

ki=0.001;kd=1.8;

Error = setPoint - rellytemp;

sumError+=Error;

dError =Error - LastError;

LastError=Error;

te=(uchar)(KE*Error+0.5)+6;

tec=(uchar)(KEC*dError+0.5)+6;

kp=kp+KPU*dkp[te][tec];

ki=ki+KIU*dki[te][tec];

kd=kd+KDU*dkd[te][tec];

uout=kp*Error+ki*sumError+kd*dError;

open_time=(int)(uout+0.5);

if(open_time>40)//PID限幅

open_time=40;

if(open_time<1)

open_time=0;

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PID控制器是一种常见的控制器,用于控制实际系统的输出与期望输出之间的误差。TEC(温控电器)是一种温度调节设备,用于控制温度。下面是一个基于PID控制器的TEC控制程序的示例代码: ```c #include <PID_v1.h> // 设置PID控制器参数 double Setpoint, Input, Output; double Kp = 2, Ki = 5, Kd = 1; PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); // 设置TEC控制相关变量 const int TEC_PIN = 9; const int TEMP_SENSOR_PIN = A0; const int MAX_TEMP = 40; const int MIN_TEMP = 20; void setup() { // 初始化串口通信 Serial.begin(9600); // 设置TEC引脚为输出模式 pinMode(TEC_PIN, OUTPUT); // 初始化PID控制器 myPID.SetMode(AUTOMATIC); myPID.SetOutputLimits(0, 255); // 设置温度传感器引脚为输入模式 pinMode(TEMP_SENSOR_PIN, INPUT); } void loop() { // 读取温度传感器 int tempReading = analogRead(TEMP_SENSOR_PIN); double temp = map(tempReading, 0, 1023, 0, 50); // 设置期望温度 Setpoint = 30; // 更新PID控制器输入 Input = temp; // 计算PID输出 myPID.Compute(); // 设置TEC电压输出 int tecOutput = map(Output, 0, 255, 0, 5); analogWrite(TEC_PIN, tecOutput); // 输出调试信息 Serial.print("Temp: "); Serial.println(temp); Serial.print("Output: "); Serial.println(tecOutput); // 等待一段时间,使得控制效果更加平滑 delay(1000); } ``` 在这个示例代码,我们使用了一个名为PID_v1的库,它提供了一个PID控制器的实现。在setup()函数,我们设置了PID控制器的参数,初始化了TEC控制相关的变量,并且初始化了串口通信。在loop()函数,我们先读取温度传感器的值,然后设置期望温度。接着,我们更新PID控制器的输入并计算输出,最后将输出映射到TEC电压输出上。在每次循环,我们还会输出调试信息,以便观察控制器的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值