搜索
bottom↓
回复: 77

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

[复制链接]

出0入4汤圆

发表于 2009-8-1 08:22:23 | 显示全部楼层 |阅读模式
先上几张自已写的串口曲线图片

(原文件名:aa.JPG)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入4汤圆

 楼主| 发表于 2009-8-1 08:25:43 | 显示全部楼层
设定在50度,本次实测显示为+-0.1内。

(原文件名:bb.JPG)

出0入0汤圆

发表于 2009-8-1 08:37:02 | 显示全部楼层
顶!

出0入4汤圆

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

出0入4汤圆

 楼主| 发表于 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=================================

出0入0汤圆

发表于 2009-8-1 08:48:41 | 显示全部楼层
真是高手啊,能做到+ -0.1。我们公司的都只是到+ -1

出0入4汤圆

 楼主| 发表于 2009-8-1 08:52:47 | 显示全部楼层
楼主这个是显示精度,其实18b20采集的精度为+-0.5度,这个显示值是不准的,我要温控器要求不高。

出0入0汤圆

发表于 2009-8-1 08:57:59 | 显示全部楼层
这个上位机软件可以共享吗?

介绍一下PID应用吧。。。

出0入0汤圆

发表于 2009-8-1 09:05:33 | 显示全部楼层
其实我也说PID的控制精度

出0入4汤圆

 楼主| 发表于 2009-8-1 09:07:47 | 显示全部楼层
没问题是用VS2008 C#写的,要有.net 的运行库。只是为了调试写的,功能只用于这个调试。
点击此处下载 ourdev_466333.rar(文件大小:11K) (原文件名:UartLine.rar)

出0入4汤圆

 楼主| 发表于 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[900];
        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[i + 1]));
            }
        }
        //绘制节点
        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[p]), new Point(Width, Height - nodes[p]));

            Point strPos=new Point(p+10,Height - nodes[p]);
            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[p]), 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[pNodes] = p;
                g.DrawLine(pen, new Point(pNodes - 1, Height - nodes[pNodes - 1]),
                                new Point(pNodes, Height - nodes[pNodes]));
            }
            else
            {
                pNodes = 0;
                DrawGrid(g);
                DrawLine(g);
            }
        }
    }
}

出0入0汤圆

发表于 2009-8-1 11:02:59 | 显示全部楼层
学习了

出0入0汤圆

发表于 2009-8-1 11:23:30 | 显示全部楼层
顶了

出0入0汤圆

发表于 2009-8-1 13:38:54 | 显示全部楼层
好贴!

出0入0汤圆

发表于 2009-8-1 14:06:14 | 显示全部楼层
9楼的软件不能打开,有试过吗?

出10入10汤圆

发表于 2009-8-1 14:30:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-1 14:45:15 | 显示全部楼层
mark

出0入4汤圆

 楼主| 发表于 2009-8-1 15:32:24 | 显示全部楼层
上面不是写了吗,是用.net写的直接运行当然打不开

出0入0汤圆

发表于 2009-8-1 15:53:35 | 显示全部楼层
楼主厉害,顶一下!

出0入0汤圆

发表于 2009-8-1 16:39:33 | 显示全部楼层
18B20的小数是4位二进制,也就是把1分成16等分,0.0625度.
我已经做到+ -0.1度了,PID控制的,用AD590效果更好.

出0入4汤圆

 楼主| 发表于 2009-8-1 16:53:49 | 显示全部楼层
刚看了下,AD590非线性误差+-0.3,好不到那里去,还不能直接和单片机相连。

出0入4汤圆

发表于 2009-8-1 19:20:49 | 显示全部楼层
问题是,测试条件和测试环境是什么?我想,如果测试环境不同的话,所谓的精度也会完全不同的。

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

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

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

出0入0汤圆

发表于 2009-8-1 19:25:46 | 显示全部楼层
z这测温点只有一个?   能反映真实的温度么

出0入0汤圆

发表于 2009-8-1 19:58:54 | 显示全部楼层
hao

出0入0汤圆

发表于 2009-8-1 20:38:01 | 显示全部楼层
老兄
你太强了
中秋给你寄个礼品过去
地址没变吧

出0入0汤圆

发表于 2009-8-1 21:55:10 | 显示全部楼层
这个项目的加热对象是什么?有没有保温和降温系统?

出0入4汤圆

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

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

出0入4汤圆

 楼主| 发表于 2009-8-2 09:59:15 | 显示全部楼层
johu :  由于水的热传递时间相当慢的,因而我想一点测量我多点测量是差不多的。不可能做多点加热多点测量。呵呵

出0入0汤圆

发表于 2009-8-2 16:58:52 | 显示全部楼层
对楼主的上位机软件感兴趣~~

测温用PT100做好不好的?

出0入0汤圆

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

出0入4汤圆

 楼主| 发表于 2009-8-3 16:49:25 | 显示全部楼层
zhengjiawei: 没做过,好像能做到更高的线性精度。但电路复杂调试也得用更多的时间。

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

出0入0汤圆

发表于 2009-8-5 16:59:22 | 显示全部楼层
cool!

出0入0汤圆

发表于 2009-8-15 13:43:17 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-8-15 14:02:20 | 显示全部楼层
mark..

出0入0汤圆

发表于 2009-8-15 15:56:35 | 显示全部楼层
我比较关心的是阶跃响应性能如何

出0入0汤圆

发表于 2009-9-15 14:41:06 | 显示全部楼层
PID的输入有:
                 1 检测的温度值
                 2 设定的温度值

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

出0入93汤圆

发表于 2009-9-15 14:55:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-9-15 15:37:44 | 显示全部楼层
不错,楼主能把上位机的源代码发上来就更好了。顶一个

出0入4汤圆

 楼主| 发表于 2009-9-15 16:38:47 | 显示全部楼层
请问你的PID输出是怎么与加热部分对应起来的

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

  
源码上面有呀,

出0入0汤圆

发表于 2009-9-20 14:45:30 | 显示全部楼层
m

出0入0汤圆

发表于 2009-10-16 15:17:17 | 显示全部楼层
if(iLocPID<0) iLocPID=0;
   return iLocPID;
}


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

看到

出0入0汤圆

发表于 2010-3-31 19:56:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-1 10:30:52 | 显示全部楼层
真强

出0入0汤圆

发表于 2010-4-1 12:55:10 | 显示全部楼层
踩一下

出0入0汤圆

发表于 2010-4-1 13:20:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-1 21:38:34 | 显示全部楼层
顶!

出0入0汤圆

发表于 2010-5-13 23:55:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-14 11:14:45 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-5-15 11:00:02 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-5-15 11:02:53 | 显示全部楼层
做到0.1,很强啊!记号,学习啦,呵呵

出0入0汤圆

发表于 2010-5-19 09:39:29 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-6-3 13:41:08 | 显示全部楼层
mark PID

出0入0汤圆

发表于 2010-6-3 13:57:15 | 显示全部楼层
ding

出0入0汤圆

发表于 2010-6-4 11:37:18 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-6-4 11:49:36 | 显示全部楼层
楼主,请注意自动控制原理教材中的一个非常基本的原则:控制系统精度的上限是测量精度。

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

出0入0汤圆

发表于 2010-6-4 16:58:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-22 14:45:50 | 显示全部楼层
Mark

出0入0汤圆

发表于 2010-7-22 15:04:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-23 09:34:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-23 09:36:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-23 09:46:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-19 11:17:12 | 显示全部楼层
好像不错……

出0入0汤圆

发表于 2010-8-19 13:43:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-19 15:08:01 | 显示全部楼层
mark一下!!

出0入0汤圆

发表于 2010-8-19 18:17:27 | 显示全部楼层
mark

出675入8汤圆

发表于 2010-8-20 08:24:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-28 18:08:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-7 20:43:11 | 显示全部楼层
记号

出0入198汤圆

发表于 2010-11-8 09:27:20 | 显示全部楼层
楼主的C#软件怎么使用??用的是串口多少??我该发什么格式的数据呢?

出0入0汤圆

发表于 2013-1-16 08:19:09 | 显示全部楼层
guantingwei 发表于 2009-8-1 19:20
问题是,测试条件和测试环境是什么?我想,如果测试环境不同的话,所谓的精度也会完全不同的。

比方说,在 ...

高手啊!

出0入0汤圆

发表于 2013-1-16 08:19:39 | 显示全部楼层
不会用C#。。。。。

出0入0汤圆

发表于 2013-4-11 16:59:12 来自手机 | 显示全部楼层
学习一下....

出0入0汤圆

发表于 2013-7-30 11:54:27 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2013-8-9 15:12:35 | 显示全部楼层
准备自己搞一下测试

出0入0汤圆

发表于 2014-1-2 20:29:31 | 显示全部楼层
学习了。。。准备自己也去弄一下

出0入0汤圆

发表于 2014-6-12 21:18:40 | 显示全部楼层
对我有帮助,留个脚印。

出0入0汤圆

发表于 2015-2-11 11:47:13 | 显示全部楼层
eaglelpx 发表于 2009-8-1 08:48
真是高手啊,能做到+ -0.1。我们公司的都只是到+ -1

这个要看被加热的材料,而且代码都贴出来了,最基本的公式计算有什么技术含量。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 09:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表