永发信息网

求助PID设置中采样周期与数字输出占空比周期的关系

答案:3  悬赏:70  手机版
解决时间 2021-12-22 12:32
  • 提问者网友:风月客
  • 2021-12-21 12:36
PID设置中采用数字量输出改变占空比达到控温的目的,我采用PID向导编写,请问采样周期是否应和占空比周期一样,如可不一样那谁周期应长一些?
最佳答案
  • 五星知识达人网友:春色三分
  • 2021-12-21 13:24
应该设成一样的,采样是检测温度的,然后反馈给CPU,通过PID计算得到占空比输出,所以采样的实时性对占空比有影响,最好设成一样长的时间.
全部回答
  • 1楼网友:由着我着迷
  • 2021-12-21 15:35
#include #include #define pcf8591 0x90 //pcf8591 地址 //else io sbit ls138a=p2^2; sbit ls138b=p2^3; sbit ls138c=p2^4; //此表为 led 的字模, 共阴数码管 0-9 - unsigned char code disp_tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char ad_channel; unsigned long xdata ledout[8]; unsigned int d[32]; bit dacconversion(unsigned char sla,unsigned char c, unsigned char val) { start_i2c(); //启动总线 sendbyte(sla); //发送器件地址 if(ack==0)return(0); sendbyte(c); //发送控制字节 if(ack==0)return(0); sendbyte(val); //发送dac的数值 if(ack==0)return(0); stop_i2c(); //结束总线 return(1); } bit isendbyte(unsigned char sla,unsigned char c) { start_i2c(); //启动总线 sendbyte(sla); //发送器件地址 if(ack==0)return(0); sendbyte(c); //发送数据 if(ack==0)return(0); stop_i2c(); //结束总线 return(1); } unsigned char ircvbyte(unsigned char sla) { unsigned char c; start_i2c(); //启动总线 sendbyte(sla+1); //发送器件地址 if(ack==0)return(0); c=rcvbyte(); //读取数据0 ack_i2c(1); //发送非就答位 stop_i2c(); //结束总线 return(c); } / main() { char i,j; while(1) { switch(ad_channel) { case 0: isendbyte(pcf8591,0x41); d[0]=ircvbyte(pcf8591)*2; //adc0 模数转换1 放大2倍显示 break; case 1: isendbyte(pcf8591,0x42); d[1]=ircvbyte(pcf8591)*2; //adc1 模数转换2 break; case 2: isendbyte(pcf8591,0x43); d[2]=ircvbyte(pcf8591)*2; //adc2模数转换3 break; case 3: isendbyte(pcf8591,0x40); d[3]=ircvbyte(pcf8591)*2; //adc3 模数转换4 break; case 4: dacconversion(pcf8591,0x40, d[4]/4); //dac 数模转换 break; } // d[4]=400; //数字--->>模拟输出 d[4]=d[0]; // 把模拟输入 采样的信号 通过数模转换输出 if(++ad_channel>4) ad_channel=0; ledout[0]=disp_tab[d[1]%10000/1000]; ledout[1]=disp_tab[d[1]%1000/100]; ledout[2]=disp_tab[d[1]%100/10]|0x80; ledout[3]=disp_tab[d[1]%10]; ledout[4]=disp_tab[d[0]%10000/1000]; ledout[5]=disp_tab[d[0]%1000/100]; ledout[6]=disp_tab[d[0]%100/10]|0x80; ledout[7]=disp_tab[d[0]%10]; for( i=0; i<8; i++) {p0 = ledout[i]; switch(i) //使用switch 语句控制138译码器 也可以是用查表的方式 学员可以试着自己修改 { case 0:ls138a=0; ls138b=0; ls138c=0; break; case 1:ls138a=1; ls138b=0; ls138c=0; break; case 2:ls138a=0; ls138b=1; ls138c=0; break; case 3:ls138a=1; ls138b=1; ls138c=0; break; case 4:ls138a=0; ls138b=0; ls138c=1; break; case 5:ls138a=1; ls138b=0; ls138c=1; break; case 6:ls138a=0; ls138b=1; ls138c=1; break; case 7:ls138a=1; ls138b=1; ls138c=1; break; } for (j = 0 ; j<90 ;j++) { ;} //扫描间隔时间 } p0 = 0; } }
  • 2楼网友:孤老序
  • 2021-12-21 14:26
按我的经验,没有特定关系。要上机调试。被控对象反映快,采样周期越短。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯