EDN首页   博客首页

最新日志

发表于:2008-11-21 10:37:48
标签:浑浊度  传感器  

4

浑浊度传感器原理【原创】

这几天做了个小项目,做一个检测锅炉进水过滤器过滤效果的控制器,用到一个检测浑浊度的传感器,觉得这个传感器的设计思路很有趣,在这里和大家说一说。这个传感器是德国人造的,里面主要是靠红外光学分辨浑浊度,辅以电导率来分辨。

点击开大图

红外线发光管发射红外线,红外接收管1接收到的是透射光,红外接收管2接收到的是散射光,浑浊度的值=透射光/散射光。其实如果只检测透射光理论上也可以得到浑浊度,但是那样就要求发光管的发光强度一致性必须很好,它用了两个接收管通过比值来确定浑浊度就不用考虑发光管的发光强度一致性问题了。另外辅以电导率测量,防止了发光管被遮挡准确率得到了保障。这里的红外接收管和电极可以直接接到单片机的AD转换器,实现浑浊度的数字化,方便进一步的处理。

系统分类: 模拟技术   |    用户分类:    |    来源: 原创

评论(6) | 阅读(271)
发表于:2008-11-8 18:21:55
标签:protel  自动布线  

5

【原创】关于protel自动布线我的看法

    对自动布线反感的人是因为不知道如何使用自动布线,要知道自动布线是EDA的一个最最重要的功能。就99而言,自动布线的默认值是最短的导线长度和最少的过孔,其中过孔最少是优先的,这是因为印制板出错最大的可能就是过孔不通 。为什么你会看见一些线走的很乱,原因就是为了减少一个过孔。其次,它还遵循导线最短原则,一些导线在半路上几乎就是90°连在另一条导线上 ,原因就是这样连接导线最短。至于你图上的导线拐的弯很大 那是你的导线转弯配置的原因。默认值是2.54毫米才能转弯,你可以调节这个数值,你没有调整,只能说这个默认数字不符合你的要求,而不是自动布线的错 。

 

这个是很典型的转弯发生在2.54这个设置上,它必须在这个长度以后才能转弯,也所以才会有这个导线 。自动布线最大的优势就是在于你的设置,它能够轻易布下高频的线路,还能在你的敏感线路的两侧布下线,最大可能避免干扰,诸如此类 很多设置。而且通过原理图就可以对一些导线作出设置,比如设置线为1个毫米,这样在自动布线的时候就用1毫米线宽布置地线,其它线就用0.254毫米。一般说来,通过不同的设置自动布线几次以后,你就能拿到很满意的布线。比如做阻抗匹配的时候 

要求两根线等长,用手布线就很难办到,自动布线则一点问题都没有;比如你布置一个小电容或者一个小电感什么的,你用手布线几乎是不可能的。 

我的经验是自动布线最容易布通的,如果自动布线都有问题那你手动问题则多多。至于有些线大家看起来不舒服,不过那是有原则的,人家符合一定的规则,有一定的原因,至少能讲出一定的道理。你出来的线看起来舒服,但是说不出道理来。

人家的线敢号称电阻最小 。

你布的线敢说?

人家布的线敢宣称可靠性最好。 

你敢说? 

我一般就是自动布线,然后在整理整理,不过设置一定要先搞好,特别是转弯和间距,这两个参数几乎决定了你的线是不是好看。大家喜欢的布线都是DOS版的PROTEL3.3的版本,也就是横平竖直,设置合理,要看你的具体的技术要求。比如你就是一般的线 ,那就把间距设到最小 ,看看图,有绿色就说明你的布线设置有问题 

一般就是间距太大了,再缩小一点设置成多少mm。看你的元器件的间距,一般说来,在制造厂能够做到的情况下,越小越好,你调整间距,直到绿色消失。 

设置7MIL如何? 

现在很多厂家做7mil没有问题。 

你最好问问你的厂商,他们最小能做到多少、包括过孔的内径等,然后吧这些设置到你的PROTEL中。在合理的布局和合理的规则下,让protel尽情的自动布去吧!最后选一个最满意的,手动修饰一下就ok了! 

系统分类: 模拟技术   |    用户分类:    |    来源: 原创

评论(10) | 阅读(732)
发表于:2008-11-6 20:53:40
标签:STM32F  RTC  HT1380  时钟  

2

【原创】stm32f的ht1380日历芯片驱动

ht1380和ds1302的时序基本一样,送给和我一样不太愿意用rtc的朋友!
#include "ht1380.h"
GPIO_InitTypeDef GPIO_InitStructure;
unsigned char week ;//?ü
void HT1380_write(unsigned char data);
int HT1380_read(void);
void dly_HT1380(void);
/*************?ìê±???óê±***********************************/
void dly_HT1380(void)
{
    unsigned long i ;
    for(i = 32;i > 0;i--); 
}
/*************?òHT1380?DD′ò???×??ú*************************/
void HT1380_write(unsigned char data)
{
    unsigned char i="0";
    clr_HT1380_io();
    for(i=8;i>0;i--)
    {
        dly_HT1380();
        if(data&0x01)
        {
            set_HT1380_io();
        }
        dly_HT1380();
        set_HT1380_sclk();
        dly_HT1380(); 
        clr_HT1380_sclk();
        dly_HT1380(); 
        clr_HT1380_io();
        data>>=1;
    }
}
/************************************************************
oˉêy1|?ü£o′óHT1380?D?áò???×??ú
ê?è?2?êy£o?T
·μ??2?êy£odata
*************************************************************/
int HT1380_read(void)
{
    unsigned char data="0";
    unsigned char i="0";
    set_HT1380_io();
    for(i=8;i>0;i--)
    {
        set_HT1380_sclk();
        dly_HT1380();
        data>>=1;     
        if(in_HT1380_io())
        {
            data |= 0x80;
        }
        else
        {
            data &= 0x07f;
        }
        clr_HT1380_sclk();
        dly_HT1380();
    }  
    return(data);   
}
/**********′óHT1380?D?áè??úoíê±??******************************/
void HT1380_read_time(void)
{
    clr_HT1380_rst();
    dly_HT1380();
    set_HT1380_rst(); //
    dly_HT1380();
    clr_HT1380_sclk();
    dly_HT1380();
    HT1380_write(0xbf); 
    dly_HT1380();
    second="HT1380"_read(); //??
    minute="HT1380"_read(); //·?
    hour="HT1380"_read(); //ê±
    day="HT1380"_read(); //è?
    month="HT1380"_read();//??
    week="HT1380"_read(); //?ü
    year="HT1380"_read(); //?ê
    dly_HT1380();
    clr_HT1380_rst();
}
/**********?òHT1380D′è??úoíê±??******************************/
void HT1380_write_time(void)
{
    clr_HT1380_rst();
    dly_HT1380();
    set_HT1380_rst(); //
    dly_HT1380();
    clr_HT1380_sclk();
    dly_HT1380();
    HT1380_write(0x8e);
    HT1380_write(0x00);  
    dly_HT1380();
    clr_HT1380_rst();
    dly_HT1380();
    set_HT1380_rst(); //
    HT1380_write(0x80);
    HT1380_write(0x00);
    dly_HT1380();
    clr_HT1380_rst();
    dly_HT1380();
    set_HT1380_rst(); //
    HT1380_write(0xbe);
    HT1380_write(second); // ??
    HT1380_write(minute); //·?
    HT1380_write(hour); //ê±
    HT1380_write(day); //è?
    HT1380_write(month); //??
    HT1380_write(week); //?ü
    HT1380_write(year); //?ê
    HT1380_write(0x00);  
    dly_HT1380();
    clr_HT1380_rst();
}

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(0) | 阅读(264)
发表于:2008-11-1 7:59:07
标签:STM32  MODBUS  485  通讯  

6

STM32F基于MODBUS-RTU规约的485通讯

开发环境IAR4.42A
/*****************************************************
          modbus-rtu 通讯规约
通讯方式:rs-485 半双功
校验方式:crc16
停止位:2位
编写:孙可
编写日期:2008年8月26日
版本:v0.3(励磁的通讯)
编程思路:
    1.串口中断允许自动接收总线上的信息,当接收的
    字节后超过3.5个字节时间没有新的字节认为本次
    接收完成,接收完成标志置1;如果接收完成标志已
    经置1又有数据进来则丢弃新来的数据。
    2.串口接收数据的处理, 当接收完成标志置1进入
    接收数据处理, (1)首先判断接收的第一位数据与
    本机地址是否相同,如果不相同清空接收缓存不发
    送任何信息; (2)接收的第一位数据与本机地址相
    同,则对接收缓存中的数据进行crc16校验,如果接
    收的校验位与本校验结果不相同清空接收缓存不发
    送任何信息;
    (3)如果crc16校验正确则根据数据串中的命令码进
    行相应的处理。
******************************************************/
#include "modbus.h"

unsigned char Com0_id = 0x05;//本机串口0的通讯地址
unsigned char Uart0_rev_buff[100];//com0串口接收缓冲区
unsigned char Uart0_send_buff[100];//com0串口发送缓冲区
volatile unsigned char Uart0_rev_count;
vs8 Uart0_send_counter = 0;
volatile unsigned char Uart0_rev_comflag;
volatile unsigned char Crc_counter = 0;//com0校验计数器
volatile unsigned char *Uart0_send_pointer = Uart0_send_buff;//com0串口发送指针
vu16 Mkgz_bz = 0;//模块故障标志1:输入异常,2:过压,3:欠压,4:过温
vu16 Out_current = 50;//输出电流
vu16 Out_voltage = 240;//输出电压
vu16 Mkzt_bz = 0;//模块状态标志
vu16 OutX_current = 1000;//输出限流
vu16 Jc_voltage = 2530;//均充电压
vu16 Fc_voltage = 2400;//浮充电压
IAR的完整工程rar

系统分类: ARM   |    用户分类:    |    来源: 原创

评论(0) | 阅读(258)
发表于:2008-10-25 19:21:57
标签:电力载波  局域网  

2

关于电力载波局域网的设想[化无线为有线]

一、前因

现如今无线通讯十分流行无线电话、无线耳机、无线键盘鼠标、无线网络满天飞,以后可能还有无线显示器、无线音响等等,无线信号传输的介质无外乎超声波。我们都知道超声波是对人体有害的,但是具体有害到什么程度现在还没有医疗案例,也没有具体的统计。但是未来无线的设备多了,人们生活的空间中充满了无线信号,必然会成为污染,由时髦变成灾害。为了能让人们生活到一个清洁的空间,我设想在室内尽量消除无线电波。

二、实现方法

具体实现的方法,就是把需要进行数据交换的设备都直接接在电线上,这样只要能连上电线就可以同时获得电能和数据一举两得。在室内每个需要通讯的设备都有唯一的地址,通讯的频率可以根据分类固定,通讯信号和电源经过变压器隔离,然后用带通滤波器选出有用的信号。为了防止室内信息的泄漏和对电力网的干扰,需要在每家近户开关上加装带阻滤波器,把室内的高频信号拦截下来。

 三、结果

这样好处是,当我们回家或者进入办公室以后,只要关上手机设呼叫转移到座机就可以了,电脑只要能接上电源就可以上网,显示器、音箱、鼠标键盘、打印机等设备完全不必接到电脑主机上了,只要墙上有插排插上电就可以用了,主机后面不再需要大捆的信号线了。无论是卧室、客厅或者厨房只要插上电都可以上网或者控制其它设备,所有的智能家电需要受电脑控制只要接上电源就可以了。

水平有限,想得不够周全请大家补充,但我觉得这是一种发展方向。

系统分类: 模拟技术   |    用户分类:    |    来源: 原创

评论(0) | 阅读(164)
发表于:2008-10-23 18:29:33
标签:P521  电流互感器  

8

[原创]P521光耦做电流互感器的实战应用

今天说一下这个P521我在产品中的应用,在直流系统中+极和-极是不允许接地的,当有一个极接地的时候就是故障了,如果两个极都接地那就把直流电源短路了,呵呵那事就大了!所以当直流系统中有一个极发生接地就应该及时发现及时处理,即使不接地但是阻抗降低到一定数值也需要报警,我今天就要用这个P521做一个简单的直流系统绝缘电阻检测电路。

图中+KM、-KM是直流电源的正负极,他们之间的电压在180~260V之间,Ro是我们要测量的接地电阻,U1是送到CPU AD的模拟电压。当没有发生接地的时候+KM和-KM到地只有100K的电阻,但是地和+ -之间没有其它通路,就不会有电流,只有接入Ro之后才能产生电流Io.

绝缘电阻计算:

U=180V~260V

R1=2K

K=15~25

这里的100就是上面的100K电阻。

根据这个公式就能计算出接地电阻了。

例如:

U=220V,R1=2K,K=20,U1=1V

Ro=(20*2*220-100*1)/2*1=4350欧

这个用法怎么样?觉得不错到左上角顶我一下吧

系统分类: 模拟技术   |    用户分类:    |    来源: 原创

评论(3) | 阅读(761)
发表于:2008-10-21 17:22:16
标签:P521  电流互感器  

5

[原创]P521光耦做电流互感器的应用

昨天说P521的输入和输出在1~2mA范围内是线性关系的,今天说说怎么用这个1mA.

应用1:测输入电压

当我的电路中R1、R2已知,根据V2我就可以求出V1。

应用2:测输入端电阻

当电路中的V1、V2、R2已知,可以求出R1的阻值。

说出来道理很简单,你想到了吗?没想到的请顶我一下,谢谢!

系统分类: 模拟技术   |    用户分类:    |    来源: 原创

评论(0) | 阅读(449)
发表于:2008-10-20 20:06:53
标签:P521  电流互感器  

4

[原创]P521光耦可以用来做电流互感器

经我们实验发现,P521这种电流型光耦原边的控制电流和副边的被控电流在1~2mA之间是成线性关系的,

Iin = (0.8~1)Iout.利用这个特性我们就可以用P521做1~2mA直流电流隔离测量。可能有很多朋友看了之后会说这么小范围的电流测量能干什么用啊?有同样想法的朋友你先别着急,你顶我一下我明天接着说怎么用这1mA的电流。

系统分类: 模拟技术   |    用户分类:    |    来源: 原创

评论(3) | 阅读(440)
发表于:2008-10-15 17:01:13
标签:fft  

6

嵌入式系统中FFT算法研究

 

摘 要:首先分析实数FFT算法的推导过程,然后给出一种具体实现FFT算法的C语言程序,可以直接应用于需要FFT运算的单片机或DSP等嵌入式系统中。
关键词:嵌入式系统 FFT算法 单片机 DSP
目前国内有关数字信号处理的教材在讲解快速傅里叶变换(FFT)时,都是以复数FFT为重点,实数FFT算法都是一笔带过,书中给出的具体实现程序多为BASIC或FORTRAN程序并且多数不能真正运行。鉴于目前在许多嵌入式系统中要用到FFT运算,如以DSP为核心的交流采样系统、频谱分析、相关分析等。本人结合自己的实际开发经验,研究了实数的FFT算法并给出具体的C语言函数,读者可以直接应用于自己的系统中。

1 倒位序算法分析

  按时间抽取(DIT)的FFT算法通常将原始数据倒位序存储,最后按正常顺序输出结果X(0),X(1),...,X(k),...。假设一开始,数据在数组 float dataR[128]中,我们将下标i表示为(b6b5b4b3b2b1b0)b,倒位序存放就是将原来第i个位置的元素存放到第(b0b1b2b3b4b5b6)b的位置上去.由于C语言的位操作能力很强,可以分别提取出b6、b5、b4、b3、b2、b1、b0,再重新组合成b0、b1、b2、b3、b4、b5、b6,即是倒位序的位置。程序段如下(假设128点FFT):
/* i为原始存放位置,最后得invert_pos为倒位序存放位置 */
 int b0=b1=b2=b3=b4=b5=6=0;
 b0=i&0x01; b1=(i/2)&0x01; b2=(i/4)&0x01;
 b3=(i/8)&0x01; b4=(i/16)&0x01; b5=(i/32)&0x01;
 b6=(i/64)&0x01; /*以上语句提取各比特的0、1值*/
 invert_pos=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;

  大家可以对比教科书上的倒位序程序,会发现这种算法充分利用了C语言的位操作能力,非常容易理解而且位操作的速度很快。

2 实数蝶形运算算法的推导

  我们首先看一下图1所示的蝶形图。

蝶形公式:
X(K) = X’(K) + X’(K+B)W PN ,
X(K+B) = X’(K) - X’(K+B) W PN
其中W PN= cos(2πP/N)- jsin(2πP/N)。
设 X(K+B) = XR(K+B) + jXI(K+B),
X(K) = XR(K) + jXI(K) ,
有:
XR(K)+jXI(K)= XR’(K)+jXI’(K)+[ XR’(K+B) + jXI’(K+B)]*[ cos(2πP/N)-jsin(2πP/N)];
继续分解得到下列两式:
XR(K)= XR’(K)+ XR’(K+B) cos(2πP/N)+ XI’(K+B) sin (2πP/N) (1)
XI(K)= XI’(K)-XR’(K+B) sin(2πP/N)+XI’(K+B)cos (2πP/N) (2)

  需要注意的是: XR(K)、XR’(K)的存储位置相同,所以经过(1)、(2)后,该位置上的值已经改变,而下面求X(K+B)要用到X’(K),因此在编程时要注意保存XR’(K)和XI’(K)到TR和TI两个临时变量中。

  同理: XR(K+B)+jXI(K+B)= XR’(K)+jXI’(K)- [ XR’(K+B)+jXI’(K+B)] *[ cos(2πP/N)-jsin(2πP/N)]继续分解得到下列两式:
XR(K+B)= XR’(K)-XR’(K+B) cos(2πP/N)- XI’(K+B) sin (2πP/N) (3)
XI(K+B)= XI’(K)+ XR’(K+B) sin(2πP/N)- XI’(K+B) cos (2πP/N) (4)
注意:
  ① 在编程时, 式(3)、(4)中的XR’(K)和 XI’(K)分别用TR和TI代替。

  ② 经过式(3)后, XR(K+B)的值已变化,而式(4)中要用到该位置上的上一级值,所以在执行式(3)前要先将上一级的值XR’(K+B)保存。

  ③ 在编程时, XR(K)和 XR’(K), XI(K)和 XI’(K)使用同一个变量。
  通过以上分析,我们只要将式(1)、(2)、(3)、(4)转换成C语言语句即可。要注意变量的中间保存,详见以下程序段。

/* 蝶形运算程序段 ,dataR[]存放实数部分,dataI[]存放虚部*/
/* cos、sin函数做成表格,直接查表加快运算速度 */
TR=dataR[k]; TI="dataI"[k]; temp="dataR"[k+b];/*保存变量,供后面语句使用*/
dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];
dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];
dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];
dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];

3 DIT FFT 算法的基本思想分析

  我们知道N点FFT运算可以分成LOGN2 级,每一级都有N/2个碟形。DIT FFT的基本思想是用3层循环完成全部运算(N点FFT)。

  第一层循环:由于N=2m需要m级计算,第一层循环对运算的级数进行控制。

  第二层循环:由于第L级有2L-1个蝶形因子(乘数),第二层循环根据乘数进行控制,保证对于每一个蝶形因子第三层循环要执行一次,这样,第三层循环在第二层循环控制下,每一级要进行2L-1次循环计算。

  第三层循环:由于第L级共有N/2L个群,并且同一级内不同群的乘数分布相同,当第二层循环确定某一乘数后,第三层循环要将本级中每个群中具有这一乘数的蝶形计算一次,即第三层循环每执行完一次要进行N/2L个碟形计算。

  可以得出结论:在每一级中,第三层循环完成N/2L个碟形计算;第二层循环使第三层循环进行 2L-1次,因此,第二层循环完成时,共进行2L-1 *N/2L=N/2个碟形计算。实质是:第二、第三层循环完成了第L级的计算。

  几个要注意的数据:

  ① 在第L级中,每个碟形的两个输入端相距b=2L-1个点。

  ② 同一乘数对应着相邻间隔为2L个点的N/2L个碟形。

  ③ 第L级的2L-1个碟形因子WPN 中的P,可表示为p = j*2m-L,其中j = 0,1,2,...,(2L-1-1)。

  以上对嵌入式系统中的FFT算法进行了分析与研究。读者可以将其算法直接应用到自己的系统中,欢迎来信共同讨论。(Email:xiaowanang@163.net)

  附128点DIT FFT函数:
/* 采样来的数据放在dataR[ ]数组中,运算前dataI[ ]数组初始化为0 */
void FFT(float dataR[],float dataI[])
{int x0,x1,x2,x3,x4,x5,x6;
int L,j,k,b,p;
float TR,TI,temp;
/********** following code invert sequence ************/
for(i=0;i<128;i++)
{ x0=x1=x2=x3=x4=x5=x6=0;
x0=i&0x01; x1=(i/2)&0x01; x2=(i/4)&0x01; x3=(i/8)&0x01;x4=(i/16)&0x01; x5=(i/32)&0x01; x6=(i/64)&0x01;
xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6;
dataI[xx]=dataR[i];
}
for(i=0;i<128;i++)
{ dataR[i]=dataI[i]; dataI[i]=0; }
/************** following code FFT *******************/
for(L=1;L<=7;L++) { /* for(1) */
b=1; i="L-1";
while(i>0)
{b=b*2; i--;} /* b= 2^(L-1) */
for(j=0;j<=b-1;j++) /* for (2) */
{ p="1"; i="7-L";
while(i>0) /* p="pow"(2,7-L)*j; */
{p=p*2; i--;}
p=p*j;
for(k=j;k<128;k=k+2*b) /* for (3) */
{ TR="dataR"[k]; TI="dataI"[k]; temp="dataR"[k+b];
dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p];
dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p];
dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p];
dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p];
} /* END for (3) */
} /* END for (2) */
} /* END for (1) */
for(i=0;i<32;i++){ /* 只需要32次以下的谐波进行分析 */
w[i]=sqrt(dataR[i]*dataR[i]+dataI[i]*dataI[i]);
w[i]=w[i]/64;}
w[0]=w[0]/2;
} /* END FFT */

系统分类: 嵌入式   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(237)
发表于:2008-10-15 15:03:35
标签:PID  

3

PID调节解释,写给非自动化人员及菜鸟的教程

转自:http://www.stmfans.com/bbs/?fromuid=200    作者:qmycy

关于PID控制器的解释:
err偏差=设定值-实际值。比如水位测量是0-100,如果我设定到50,而实际值为30。
P,比例系数,P的倒数为比例带。实际应用中,多用比例带。
比如上例设定50,实际30,偏差=50-30=20,如果比例系数为1,比例调节的输出是20,如果是控制变频器,变频器输出20Hz(这里讲绝对型)
I,积分系数,将偏差连续累加。
积分的意义,就是曲线的与X轴组成的面的面积。
即积分偏差=(上一次)偏差+(本次)偏差,C语言表示就是,积分偏差+=偏差。
只有连续累加的值为零是,才没有输出。如果没有I调节,只有P,当P达到最大灵敏度的时候,就会有波动,即当变频器输出20hz水位会一直缓慢上升,而降到19hz的时候水位又缓慢下降,会成周期型的波动,如果是阀门会来回不停的调节,阀门寿命缩短。(实际变频器的精度较高,我只是举个例子),如果有积分调节,当产生负偏差的时候(实际大于设定)连续累加,就会额外减小一点输出,PI=P*err+i*sumerr,特别是对阀门,变频器这种输入与输出呈非线性关系,控制量。这样P调节,在死区的时候(死区deadband)P没作用的时候,I可以稳定输出。如果波动是高频,低幅度的,累加值为0,也是没有输出的,在偏差在设定值上方或下方连续出现,即累加值很大且水位控制在死区,通过I很小的输出即可稳定。当然还要防止积分饱和,即累加值要设定累加最大值,否则累加值很大,输出会从0-100大幅波动。甚至P调节都被覆盖了。
D,微分调节:
微分的意义就是反应曲线的切线,即曲线的变化趋势。
比如出现如下两种情况:
实际水位已经到50,但是是从高于50的上方,快速下降而来的。
实际水位已经到50,但是是从低于50的下方,快速上升而来的。
上两种情况,我们知道,水位在50是稳定不了的,因为水位会继续下降或上升。
我们知道下降的趋势越大,斜率越大,这个时候进行微分调节,如第一种情况,水位到50了,偏差为0,比例输出为零
但是水位变化是快速下降,这个时候得到上一周期的斜率值(pid有正调节,负调节,此种情况斜率为负值,但是取正值),提前增加输出,减缓水位下降的趋势,从而减小大幅波动。同理第二种情况要提前减小输出。
增量型PID,本次PID总输出与上一次PID总输出相减。
这样了解了PID调节的意义,希望对大家阅读源代码有帮助。
本人才疏学浅,斗胆原创,希望高手指正本人理解错误的地方

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(218)
23456下一页总共 , 当前 /