PID温控仪制作成功显示精度+-0.2度
先上几张自已写的串口曲线图片http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_466327.JPG
(原文件名:aa.JPG) 设定在50度,本次实测显示为+-0.1内。
http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_466328.JPG
(原文件名:bb.JPG) 顶! 本温控仪是采用18B20采集,双向可控硅输出给发热体实现恒温。设计在精度为+-1度,反应时间限制在20分钟内。选用位置式PID,调试过程比我想的要好调很多。由于时间较长,所以比例放大选得较小。选好后再选积分常量,积分是用于减少静态误差的,在PI时一般会有超调现像。我尽可能让这个波动得比较平坦一些。最后再加上微分后显示的曲线就接近系统要求了,真高兴呀,呵呵 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.1。我们公司的都只是到+ -1 楼主这个是显示精度,其实18b20采集的精度为+-0.5度,这个显示值是不准的,我要温控器要求不高。 这个上位机软件可以共享吗?
介绍一下PID应用吧。。。 其实我也说PID的控制精度 没问题是用VS2008 C#写的,要有.net 的运行库。只是为了调试写的,功能只用于这个调试。
点击此处下载 ourdev_466333.rar(文件大小:11K) (原文件名:UartLine.rar) 用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);
}
}
}
} 学习了 顶了 好贴! 9楼的软件不能打开,有试过吗? mark mark 上面不是写了吗,是用.net写的直接运行当然打不开 楼主厉害,顶一下! 18B20的小数是4位二进制,也就是把1分成16等分,0.0625度.
我已经做到+ -0.1度了,PID控制的,用AD590效果更好. 刚看了下,AD590非线性误差+-0.3,好不到那里去,还不能直接和单片机相连。 问题是,测试条件和测试环境是什么?我想,如果测试环境不同的话,所谓的精度也会完全不同的。
比方说,在一个开放的环境下和密闭的环境下;在不同的风速下;在不同体积的容器内;加热器功率的匹配程度;传感器和热源的距离或是方位,等等等等,得出的结果肯定是不同的。
并且,如果没有风扇等设备的话,空气等肯定存在一个较大的温度场,则在不同位置温度也不回相同。
所以说显示精度和控温精度是有差别的,另外显示精度和环境也是密切相关的。 z这测温点只有一个? 能反映真实的温度么 hao 老兄
你太强了
中秋给你寄个礼品过去
地址没变吧 这个项目的加热对象是什么?有没有保温和降温系统? zjn8888 郑建宁: 谢了,你的屏不错价格合理。
zhangjg09 : 加热的对象是普通水,用的是和热得快差不多的东东,没有保温层放置在室温外境下,在电风扇吹时能在+-0.5度变化。
我做这个项目其目的是在封闭环境下加温流出恒温的水。
guantingwei:说得不错,我试到只要不热源不是太近温度就是差不多的。 我之所有说是显示精度,是因为在没有进行标定温度测量。我想就18B20的精度也就这个样子 johu :由于水的热传递时间相当慢的,因而我想一点测量我多点测量是差不多的。不可能做多点加热多点测量。呵呵 对楼主的上位机软件感兴趣~~
测温用PT100做好不好的? 请教LZ,对于积分项,您觉得有必要把所有的项都加起来嘛?我觉得应该是最近的10项。
设想如果设定温度和实际温度差30度,而升温时间在几秒之内,需要很长时间来消化这个积分项啊
楼主有没有用differential? zhengjiawei: 没做过,好像能做到更高的线性精度。但电路复杂调试也得用更多的时间。
tonyke2:我想是可以的,但是程序还得用FIFO缓存操作比较烦。全部累加确实容易超调,所以我在选积分时选得很小,我认为如果是滞后较长情况时累加量就会加大,所有就得加入微分量来减少超调可能。 cool! 记号 mark.. 我比较关心的是阶跃响应性能如何 PID的输入有:
1 检测的温度值
2 设定的温度值
请问你的PID输出是怎么与加热部分对应起来的 mark 不错,楼主能把上位机的源代码发上来就更好了。顶一个 请问你的PID输出是怎么与加热部分对应起来的
这种对应关系是模糊的,就是程序少了加点,多了减点的意思。先看看PID的资料。
源码上面有呀, m if(iLocPID<0) iLocPID=0;
return iLocPID;
}
-----------------------------------------
看到 mark 真强 踩一下 mark 顶! mark MARK 标记 做到0.1,很强啊!记号,学习啦,呵呵 MARK mark PID ding 学习 楼主,请注意自动控制原理教材中的一个非常基本的原则:控制系统精度的上限是测量精度。
请勿随便用精度这个词,如果想吹吹,用分辨率啊,灵敏度啊。 mark Mark mark mark mark mark 好像不错…… mark mark一下!! mark mark mark 记号 楼主的C#软件怎么使用??用的是串口多少??我该发什么格式的数据呢? guantingwei 发表于 2009-8-1 19:20 static/image/common/back.gif
问题是,测试条件和测试环境是什么?我想,如果测试环境不同的话,所谓的精度也会完全不同的。
比方说,在 ...
高手啊! 不会用C#。。。。。 学习一下.... 谢谢楼主分享 准备自己搞一下测试
学习了。。。准备自己也去弄一下 对我有帮助,留个脚印。 eaglelpx 发表于 2009-8-1 08:48
真是高手啊,能做到+ -0.1。我们公司的都只是到+ -1
这个要看被加热的材料,而且代码都贴出来了,最基本的公式计算有什么技术含量。。。。
页:
[1]