完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
这程序是整个程序中PID控制部分,在中断服务部分它直接定义了i,然后直接i++,这应该有问题吧? 还有它在pID控制之后生成PWM波感觉也很有问题啊。看一看,各位前辈。 //***********************初始化***********************// void chushihua(void) {dbuf[3]=24; dbuf[2]=24; dbuf[1]=24; dbuf[0]=24; display(); TMOD=0x01; TH0=(65536-200)/256; TL0=(65536-200)%256; EA=1; ET0=1; TR0=1; } //********************PID计算***********************// void pid(void) {float ek, ek1, ek2, ek_sum; //本次偏差,上次偏差,上上一次偏差,偏差积分 ek=temp_set-temp; if((ek>15)||(ek==15)) {EA=0; pwm=1; } if((ek<0)||(ek==0)) {EA=0; pwm=0; } if((ek>0)&&(ek<15)) {EA=1; ek2=ek1; ek1=ek; ek_sum+=ek; uk=kp*ek+ki*ek_sum+kd*(ek1-ek2); } } void disp_temp(void) { ReadTemperature(); if(temp
else if(temp>temp_h) {alm_l=1;alm_h=0;tgt=1;} else if((temp>temp_set-1)&&(temp
else { alm_l=1;alm_h=1;tgt=1;} bcd(temp*10); display(); } //********************中断服务***********************// void to(void) interrupt 1 {uchar i; TH0=60536/256; TL0=60536%256; i++; if(i==uk) pwm=0; if(i==100) {pwm=1;i=0;} } void main(void) {chushihua(); kp=4; ki=0.0015; kd=0; while(1) { key_set(); key_add1(); key_add10(); key_swon(); key_check(); while(flag==1) { EA=0; disp_temp(); pid(); key_set(); key_swon(); delayms(500); } delayms(550); } } |
|
相关推荐
1个回答
|
|
|
请各位看一下中断部分是怎么调节PWM的
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
528 浏览 0 评论
654 浏览 0 评论
858 浏览 0 评论
837 浏览 0 评论
RT-Thread与英飞凌(infineon)合作得板子PSOC 6 板子学习
770 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
17060 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-14 13:18 , Processed in 0.862354 second(s), Total 42, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
4076