liguangqang 发表于 2009-8-1 08:22:23

PID温控仪制作成功显示精度+-0.2度

先上几张自已写的串口曲线图片
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_466327.JPG
(原文件名:aa.JPG)

liguangqang 发表于 2009-8-1 08:25:43

设定在50度,本次实测显示为+-0.1内。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_466328.JPG
(原文件名:bb.JPG)

kalo 发表于 2009-8-1 08:37:02

顶!

liguangqang 发表于 2009-8-1 08:39:32

本温控仪是采用18B20采集,双向可控硅输出给发热体实现恒温。设计在精度为+-1度,反应时间限制在20分钟内。选用位置式PID,调试过程比我想的要好调很多。由于时间较长,所以比例放大选得较小。选好后再选积分常量,积分是用于减少静态误差的,在PI时一般会有超调现像。我尽可能让这个波动得比较平坦一些。最后再加上微分后显示的曲线就接近系统要求了,真高兴呀,呵呵

liguangqang 发表于 2009-8-1 08:46:10

PID计算采用羚羊的如下,由于是可控硅采用周波调功所有作了一点修改,增加if(iLocPID<0) iLocPID=0; 我觉得这直接强制转换会有符号问题,也许是我理解错误,反正我增加后才行。



//-----------------------------------------------------------                                          
//原型: int16_t PID_LocCalc(int16_t NextPoint)
//功能: 位置式PID计算
//参数: NextPoint: 下一值
//-----------------------------------------------------------
uint16_t PID_LocCalc(int16_t NextPoint)
{
   int16_t iError,dError,iLocPID;
   
   iError=sPtr->SetPoint-NextPoint;             //当前误差
   sPtr->SunError += iError;                  //积分误差
   dError = iError - sPtr->LastError;         //微分误差      
   sPtr->LastError = iError;

   iLocPID= (sPtr->Proportion* iError         //比例项
            +sPtr->Integral    * sPtr->SunError   //积分项
            +sPtr->Derivative* dError);         //微分项

   if(iLocPID<0) iLocPID=0;
   return iLocPID;
}
//=======================end=================================

eaglelpx 发表于 2009-8-1 08:48:41

真是高手啊,能做到+ -0.1。我们公司的都只是到+ -1

liguangqang 发表于 2009-8-1 08:52:47

楼主这个是显示精度,其实18b20采集的精度为+-0.5度,这个显示值是不准的,我要温控器要求不高。

deepin 发表于 2009-8-1 08:57:59

这个上位机软件可以共享吗?

介绍一下PID应用吧。。。

eaglelpx 发表于 2009-8-1 09:05:33

其实我也说PID的控制精度

liguangqang 发表于 2009-8-1 09:07:47

没问题是用VS2008 C#写的,要有.net 的运行库。只是为了调试写的,功能只用于这个调试。
点击此处下载 ourdev_466333.rar(文件大小:11K) (原文件名:UartLine.rar)

liguangqang 发表于 2009-8-1 09:10:11

用C#写很简单,自定义一个用户控制,写上代码如下,然后加一个串口控制和自定的的这个控制,接收数据显示就行:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace UartLine
{
    public partial class Curve : UserControl
    {
      private int[] nodes = new int;
      private int pNodes = 899;
      private Size grid = new Size(20,20); //栅格大小
      public Curve()
      {
            InitializeComponent();
      }
      public Size Grid
      {
            get
            {
                return grid;
            }
            set
            {
                if ((value.Width > 0) && (value.Width < 100)
                  && (value.Height > 0) && (value.Height < 100))
                {
                  grid = value;
                }
            }
      }      
      //绘制背景栅格并清屏
      public void DrawGrid(Graphics g)
      {
            Pen pen = new Pen(Color.DarkSlateBlue);
            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;

            //清屏
            g.FillRectangle(new SolidBrush(Color.Black), this.ClientRectangle);
            //绘栅格
            for (int i = this.Height; i >0; )
            {
                g.DrawLine(pen, new Point(0, i), new Point(this.Width, i));
                i -= grid.Height;
            }
            for (int j = 0; j < this.Width ;)
            {
                g.DrawLine(pen, new Point(j,this.Height), new Point(j,0));
                j += grid.Width;
            }
      }
      //绘制曲线
      public void DrawLine(Graphics g)
      {
            Pen pen = new Pen(Color.White);
            for (int i = 0; i < pNodes; i++)
            {
                g.DrawLine(pen, new Point(i, this.Height - nodes), new Point(i + 1, this.Height - nodes));
            }
      }
      //绘制节点
      public void DrawNode(Graphics g,int p)
      {

            Pen pen = new Pen(Color.Red);
            Font drawFont = new Font("Arial", 12);
            SolidBrush drawBrush = new SolidBrush(Color.Red);
   
            g.DrawLine(pen, new Point(p, Height), new Point(p, 0));
            g.DrawLine(pen, new Point(0, Height - nodes), new Point(Width, Height - nodes));

            Point strPos=new Point(p+10,Height - nodes);
            if (strPos.X > this.Width - 100)
            {
                strPos.X -= 100;
            }
            if (strPos.Y > this.Height - 40)
            {
                strPos.Y -= 20;
            }

            g.DrawString(String.Format("X:{0} Y:{1}", p, nodes), drawFont, drawBrush, strPos);

      }
      //重绘
      private void OnPaint(object sender, PaintEventArgs e)
      {
            DrawGrid(e.Graphics);
            DrawLine(e.Graphics);
      }
      //装载
      private void Curve_Load(object sender, EventArgs e)
      {
      }
      //点击关键点
      private void OnClick(object sender, MouseEventArgs e)
      {
            Graphics g = this.CreateGraphics();

            this.Refresh();
            if (e.Button == MouseButtons.Left)
            {
                DrawNode(g, e.X);
            }
      }
      //增加节点
      public void AddNode(int p)
      {
            Graphics g = this.CreateGraphics();
            Pen pen = new Pen(Color.White);

            if (pNodes < 899)
            {
                pNodes++;
                nodes = p;
                g.DrawLine(pen, new Point(pNodes - 1, Height - nodes),
                              new Point(pNodes, Height - nodes));
            }
            else
            {
                pNodes = 0;
                DrawGrid(g);
                DrawLine(g);
            }
      }
    }
}

sunmj 发表于 2009-8-1 11:02:59

学习了

af00 发表于 2009-8-1 11:23:30

顶了

z_zt 发表于 2009-8-1 13:38:54

好贴!

soco_da 发表于 2009-8-1 14:06:14

9楼的软件不能打开,有试过吗?

szxszx 发表于 2009-8-1 14:30:27

mark

anxiangbo 发表于 2009-8-1 14:45:15

mark

liguangqang 发表于 2009-8-1 15:32:24

上面不是写了吗,是用.net写的直接运行当然打不开

steven 发表于 2009-8-1 15:53:35

楼主厉害,顶一下!

lcw_swust 发表于 2009-8-1 16:39:33

18B20的小数是4位二进制,也就是把1分成16等分,0.0625度.
我已经做到+ -0.1度了,PID控制的,用AD590效果更好.

liguangqang 发表于 2009-8-1 16:53:49

刚看了下,AD590非线性误差+-0.3,好不到那里去,还不能直接和单片机相连。

guantingwei 发表于 2009-8-1 19:20:49

问题是,测试条件和测试环境是什么?我想,如果测试环境不同的话,所谓的精度也会完全不同的。

比方说,在一个开放的环境下和密闭的环境下;在不同的风速下;在不同体积的容器内;加热器功率的匹配程度;传感器和热源的距离或是方位,等等等等,得出的结果肯定是不同的。

并且,如果没有风扇等设备的话,空气等肯定存在一个较大的温度场,则在不同位置温度也不回相同。

所以说显示精度和控温精度是有差别的,另外显示精度和环境也是密切相关的。

johu 发表于 2009-8-1 19:25:46

z这测温点只有一个?   能反映真实的温度么

czhaii 发表于 2009-8-1 19:58:54

hao

zjn8888 发表于 2009-8-1 20:38:01

老兄
你太强了
中秋给你寄个礼品过去
地址没变吧

zhangjg09 发表于 2009-8-1 21:55:10

这个项目的加热对象是什么?有没有保温和降温系统?

liguangqang 发表于 2009-8-2 09:50:43

zjn8888 郑建宁: 谢了,你的屏不错价格合理。
zhangjg09 : 加热的对象是普通水,用的是和热得快差不多的东东,没有保温层放置在室温外境下,在电风扇吹时能在+-0.5度变化。
我做这个项目其目的是在封闭环境下加温流出恒温的水。

guantingwei:说得不错,我试到只要不热源不是太近温度就是差不多的。 我之所有说是显示精度,是因为在没有进行标定温度测量。我想就18B20的精度也就这个样子

liguangqang 发表于 2009-8-2 09:59:15

johu :由于水的热传递时间相当慢的,因而我想一点测量我多点测量是差不多的。不可能做多点加热多点测量。呵呵

zhengjiawei 发表于 2009-8-2 16:58:52

对楼主的上位机软件感兴趣~~

测温用PT100做好不好的?

tonyke2 发表于 2009-8-3 11:01:59

请教LZ,对于积分项,您觉得有必要把所有的项都加起来嘛?我觉得应该是最近的10项。
设想如果设定温度和实际温度差30度,而升温时间在几秒之内,需要很长时间来消化这个积分项啊
楼主有没有用differential?

liguangqang 发表于 2009-8-3 16:49:25

zhengjiawei: 没做过,好像能做到更高的线性精度。但电路复杂调试也得用更多的时间。

tonyke2:我想是可以的,但是程序还得用FIFO缓存操作比较烦。全部累加确实容易超调,所以我在选积分时选得很小,我认为如果是滞后较长情况时累加量就会加大,所有就得加入微分量来减少超调可能。

mojiajiqi 发表于 2009-8-5 16:59:22

cool!

anxiangbo 发表于 2009-8-15 13:43:17

记号

zlyny 发表于 2009-8-15 14:02:20

mark..

llsenyue 发表于 2009-8-15 15:56:35

我比较关心的是阶跃响应性能如何

coldwind 发表于 2009-9-15 14:41:06

PID的输入有:
               1 检测的温度值
               2 设定的温度值

请问你的PID输出是怎么与加热部分对应起来的

friendljy 发表于 2009-9-15 14:55:31

mark

chenqiyue 发表于 2009-9-15 15:37:44

不错,楼主能把上位机的源代码发上来就更好了。顶一个

liguangqang 发表于 2009-9-15 16:38:47

请问你的PID输出是怎么与加热部分对应起来的

这种对应关系是模糊的,就是程序少了加点,多了减点的意思。先看看PID的资料。


源码上面有呀,

51hubao 发表于 2009-9-20 14:45:30

m

coldwind 发表于 2009-10-16 15:17:17

if(iLocPID<0) iLocPID=0;
   return iLocPID;
}


-----------------------------------------

看到

gpzdc986 发表于 2010-3-31 19:56:23

mark

niebinkui 发表于 2010-4-1 10:30:52

真强

skyxjh 发表于 2010-4-1 12:55:10

踩一下

gxy508 发表于 2010-4-1 13:20:38

mark

kouxiangtang 发表于 2010-4-1 21:38:34

顶!

ljgvictory 发表于 2010-5-13 23:55:31

mark

gzyang 发表于 2010-5-14 11:14:45

MARK

brightsm 发表于 2010-5-15 11:00:02

标记

leoyang 发表于 2010-5-15 11:02:53

做到0.1,很强啊!记号,学习啦,呵呵

shouqiang_zhang 发表于 2010-5-19 09:39:29

MARK

yunqian09 发表于 2010-6-3 13:41:08

mark PID

guangan854214 发表于 2010-6-3 13:57:15

ding

liudeen 发表于 2010-6-4 11:37:18

学习

fifthboy 发表于 2010-6-4 11:49:36

楼主,请注意自动控制原理教材中的一个非常基本的原则:控制系统精度的上限是测量精度。

请勿随便用精度这个词,如果想吹吹,用分辨率啊,灵敏度啊。

duolunwei 发表于 2010-6-4 16:58:00

mark

bd4sad 发表于 2010-7-22 14:45:50

Mark

avrdo 发表于 2010-7-22 15:04:09

mark

tingfenghu 发表于 2010-7-23 09:34:47

mark

tingfenghu 发表于 2010-7-23 09:36:10

mark

cgbabc 发表于 2010-7-23 09:46:07

mark

ddg_int 发表于 2010-8-19 11:17:12

好像不错……

gxy508 发表于 2010-8-19 13:43:16

mark

s409348459 发表于 2010-8-19 15:08:01

mark一下!!

krdzw 发表于 2010-8-19 18:17:27

mark

xml2028 发表于 2010-8-20 08:24:22

mark

feixuehanyi 发表于 2010-8-28 18:08:18

mark

czg94215 发表于 2010-10-7 20:43:11

记号

sunnydragon 发表于 2010-11-8 09:27:20

楼主的C#软件怎么使用??用的是串口多少??我该发什么格式的数据呢?

我惯的女人 发表于 2013-1-16 08:19:09

guantingwei 发表于 2009-8-1 19:20 static/image/common/back.gif
问题是,测试条件和测试环境是什么?我想,如果测试环境不同的话,所谓的精度也会完全不同的。

比方说,在 ...

高手啊!

我惯的女人 发表于 2013-1-16 08:19:39

不会用C#。。。。。

jz701209李 发表于 2013-4-11 16:59:12

学习一下....

hellozzq 发表于 2013-7-30 11:54:27

谢谢楼主分享

wei669 发表于 2013-8-9 15:12:35

准备自己搞一下测试

ljh407055315 发表于 2014-1-2 20:29:31

学习了。。。准备自己也去弄一下

guozs1984 发表于 2014-6-12 21:18:40

对我有帮助,留个脚印。

chunxulove 发表于 2015-2-11 11:47:13

eaglelpx 发表于 2009-8-1 08:48
真是高手啊,能做到+ -0.1。我们公司的都只是到+ -1

这个要看被加热的材料,而且代码都贴出来了,最基本的公式计算有什么技术含量。。。。
页: [1]
查看完整版本: PID温控仪制作成功显示精度+-0.2度