求助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
按我的经验,没有特定关系。要上机调试。被控对象反映快,采样周期越短。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯