float zkc
int kkk
uint kp=4 //定团世义PID初始值
float ki=0.17
uint kd=16
uint uc=5000
float ek
float u_k
float uk
float uk1=0
float ek1=0
float ek2=0
uchar click=0//中断次数计数器变量
uint zhouqi=0
void deal(uint t)//加热控制函数
{ TR0=1
if(zhouqi==1) //进行PID算法,求新的占空比
{
zhouqi=0
ek=wendu_c-t//计算偏差
u_k=kp*(ek-ek1)+ki*ek+kd*(ek-2*ek1+ek2) //计算增量
uk=uk1+u_k
zkc=100*uk/uc
if (zkc>=95)
zkc=95
kkk=(int)zkc
}
if(t>=wendu_c) //大于设定值
shuchu=0 //输出高电平
else //小于设定值
{
ZKB=(int)zkc //调整新的脉宽拍斗定塌贺肢时,即新的占空比
if (click<=ZKB)// 判断脉宽定时周期是否到?当小于占空比值时输出高电平,高于时是低电平,从而实现占空比的调整
shuchu=1
else
shuchu=0
}
}
有PWM功能的单片机入STC12系列塌迹单片机,直接袜改给专用寄存器赋值开启相应定时器就可团好并以了。普通单单片机,PWM需要用自己来调配。比如:#include<reg51.h>
unsigned char pwhh,pwhl,pwlh,pwll
bit flag
sbit pwm=P1^0
void t0isr() interrupt 1
{
if(flag)
{
TH0=pwhh
TL0=pwhl
}
else
{
TH0=pwlh
TL0=pwll
}
pwm=~pwm
}
main()
{
TMOD=0x01
pwhh=(65536-1000)/256
pwhl=(65536-1000)%256
pwlh=(65536-500)/256
pwll=(65536-500)%256
TH0=pwhh
L0=pwhl
TR0=1
ET0=1
EA=1
while(1)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)