一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
12
返回列表 发新帖
楼主: goodcode
收起左侧

[51单片机] 基于STC15F104E的白光控制器

[复制链接]
 楼主| 发表于 2012-3-18 22:36 | 显示全部楼层
谢谢 bin 的资料 看样参考n型热电偶是没错的
目前测试放大电路和ad部分是能用的 后面打算输出T12的加热时间与温度的曲线看看

测试用的国产头 感觉国产头目前最大的问题就是尾部热, 也就是冷端热,
发表于 2012-3-19 09:12 | 显示全部楼层
我很久之前用4位半台式表加上原装白光191测温仪用最最原始的方法来测过t12的热电偶分度值,直接加24v,他的实际分度值要和N型的要低很多。记忆中烙铁头(K头)450度时的热电偶电压(尾端直测)才十几mv,太久了资料不知丢那里去了,公司有原装942,951二十几台,(以后估计还会再采购,目前不怎么够用了)那天有空将他拆了用示波器看看他的加热时间和检测时间和频率,可惜公司没有逻辑分析仪,只有泰克和普源示波器
 楼主| 发表于 2012-3-19 10:44 | 显示全部楼层
我很久之前用4位半台式表加上原装白光191测温仪用最最原始的方法来测过t12的热电偶分度值,直接加24v,他的实 ...
bin 发表于 2012-3-19 09:12 https://www.yleee.com.cn/images/common/back.gif



   
 楼主| 发表于 2012-3-28 22:26 | 显示全部楼层
有一阵子没弄了 洞洞板上都是灰了


更新电路图 这个电路图是可以用的了 驱动部分也测试过
主要修改R2,C3的位置, 之前的电路图会导致C3泄放慢最后就...

Protel Schematic.pdf (22.31 KB, 下载次数: 1037)

从室温到恒温到放水里
Ys1.jpg

Ys2.jpg

主要测试代码

  1. #include<STC15F104E_PLUS.H>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. #include "main.h"
  5. #include "delay.h"
  6. #include "uart.h"

  7. //定义串转并端口可位寻址
  8. UCHAR bdata PORT1, PORT2;
  9. sbit RA1=P3^3; //电容充放电
  10. sbit RA0=P3^2; //比较器电平
  11. sbit LED=P3^4;
  12. sbit CTRL=P3^5; //T12加热控制
  13. bit ADCResultOk;
  14. unsigned int ADCResult;

  15. void main (void)
  16. {
  17.         //char buf[32];

  18.         //将T12口设置为推挽输出 最高输出20ma 否则需要上拉电阻
  19.         P3M1 = P3M1 & 0x1F;
  20.         P3M0 = P3M0 | 0x20;
  21.         CTRL = 0;

  22.     //串口初始化
  23.     UartInit();
  24.         ADC_init();                                           //初始化AD相关 定时器1
  25.     EA = 1;

  26.     while(1)
  27.     {
  28.                
  29.                 //UART_SendString( "ReadAd\r\n");
  30.                 CTRL = 0; //关闭加热
  31.                 LED = 1;
  32.                 delayms( 5);
  33.                 do
  34.                 {
  35.                         GetADCResult();
  36.                         if (ADCResult <= 0x7FFF)
  37.                         {
  38.                                 UART_SendByte(0xff);
  39.                                 UART_SendBuf( &ADCResult, 2);
  40.                                 UART_SendByte(0xff);
  41.                                 break;
  42.                         }
  43.                         else
  44.                         {
  45.                                 delayms( 5);
  46.                         }
  47.                 }
  48.                 while ( 1 );  //超过设定温度
  49.             //sprintf(buf," %u\r\n",ADCResult);
  50.                 //UART_SendString( buf);

  51.                 //LED = ~LED;;
  52.                 LED = 0;
  53.                 CTRL = 1;  //开始加热
  54.                 delayms( 200);          
  55.     }
  56. }

  57. void ADC_init(unsigned char mode)
  58. {
  59.         /*功能: 初始化AD相关*/
  60.         RA1 = 1; //电容放电

  61.         TMOD |= 0x10; //定时器1 计数模式 工作模式1
  62.         AUXR = AUXR | 0x40; //设置定时器1 工作在1T模式
  63.         TR1=0;          //关闭计时器
  64.         ET1 = 0; //不允许中断

  65.         //将电容放电口设置为推挽输出 最高输出20ma 否则需要上拉电阻
  66.         P3M1 = P3M1 & 0x30;
  67.         P3M0 = P3M0 | 0x08;

  68.         //中断模式
  69.         if (mode)
  70.         {
  71.                 IT0 = 0;                          //设置 INT0 的中断触发方式 (1:Falling only 0:Rising & Falling)
  72.                 //使用串口测试时忽略
  73.                 PX0 = 1;                                                   //高中断优先级
  74.                 EX0 = 1;                          //允许INT0 中断
  75.         }       
  76. }

  77. void GetADCResult(void)
  78. {
  79.         /*
  80.         功能:
  81.         读取ADC并返回结果 模式 检测端口电平
  82.         通过LM258比较器实现AD
  83.         定时器溢出时间计算 单位ms 设系统时钟 SYSclk = 22118400
  84.         1T模式
  85.         1000/(22118400/65536)          = 2.96
  86.         12T模式
  87.         1000/(22118400/12/65536)  = 35.55
  88.         Multisim 仿真结果
  89.         103 充电到2.5v 约0.952ms  T1下更高速度
  90.         223 充电到2.5v 约2.104ms  T1下更高精度
  91.         104 充电到2.5v 约9.947ms  T12模式
  92.         */

  93.         //检测基准电压
  94.         EA = 0;   //关闭全部中断

  95.         TF1=0;    //清溢出位
  96.         TH1=0x0;  //给定初值
  97.         TL1=0x0;
  98.         RA1 = 0; //电容充电
  99.         TR1=1; //开始计数
  100.         //等待电容电压与基准电压相同或者定时器溢出
  101.         while(!RA0 && !TF1);

  102.         TR1=0;          //关闭计时器
  103.         EA = 1;   //开启全部中断
  104.         RA1 = 1; //电容放电

  105.         ADCResult = ((unsigned int)TH1 << 8) | TL1;
  106.         if (TF1)
  107.         {
  108.                 //定时器溢出 基准电压太高? 电容充电电压太低? 电容太大?
  109.                 ADCResult = 0xfffe;
  110.         }
  111.         delayms( 2); //等待电容放电完成 如果不是连续调用可以注释掉

  112.         //放电延迟 数值范围
  113.         //1ms 4
  114.         //2ms 5
  115.         //3ms 6
  116.         //5ms 7
  117.         //20ms 9
  118.         //100ms 7

  119.         //输入电压=参考电压*输入电压计时器值/参考电压计时器值
  120.         //V1=Vref*T2/T1
  121. }
复制代码


目前来看效率可能还不如模拟控制板
发表于 2012-3-30 19:33 | 显示全部楼层
又有得玩了!不知道我还有没有STC15F104E
 楼主| 发表于 2012-3-30 19:43 | 显示全部楼层
玩具版 电路图,固件,上位机程序


T12Ctrl.rar (265.32 KB, 下载次数: 1038)

Ys1.jpg

Ys2.jpg

Ys3.jpg

Ys4.jpg

Ys5.jpg

IMG_20120330_191049.jpg

控制板每加热500ms向串口发送一次数据

调零方法: 在T12常温时 点设置后看日志AD: xxx 这个值在最小的时候为调零值
ad对应电压: 为每ad值对应的电压值 需要先设置好调零值 T12放入开水 并且设置正确水温和冷端温度 点设置后看日志
----> SetMode AD: 347 对应电压: xxxxuv
这里对应电压值就是ad对应电压
设置完毕后点开始加热就可以使用了

可以看到每加热500ms的温度增量

在不增加硬件的情况下好像也就只能这么校正数值了
发表于 2013-5-10 12:26 | 显示全部楼层
大哥,请教一下,为啥要设计电容放电,第二级直接做跟随不行嘛?


 楼主| 发表于 2013-5-10 14:00 | 显示全部楼层
104e没ad的 电容充放电完成ad的功能
发表于 2014-9-7 13:14 | 显示全部楼层
强大啊!!!
发表于 2022-9-21 15:30 | 显示全部楼层
学习了,感谢分享!!!

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-2 11:09 , Processed in 0.054818 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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