切换到宽版
  • 31642阅读
  • 85回复

[C51]用ATMEGA16制作数码白光烙铁(T12)控制器 [复制链接]

上一主题 下一主题
离线zhouchs
 

发帖
14
M币
287
专家
2
粉丝
15
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2011-07-19
     以前用精密运放、单片机LPC938加液晶显示屏设计了白光烙铁(T12)控制器,使用效果较好,唯一不足之处就是成本稍高,于是想再设计个“白菜”数码白光烙铁控制器,经过测试已基本达到设想要求,调温范围160~410℃,精度±10℃左右,元件成本20元左右(09年10元以内,当时购买20个ATMEGA16,单价5.5元)。
    电路图见图1,单片机采集烙铁热偶电压、电位器温度设定电压,经过计算控制烙铁输出和LED显示输出。白光烙铁内热偶输出电压较低(几十mV内),用精密运放价格高,使用了单片机内部差分输入,同时放大了200倍,参考电压使用2.56V内部基准,R4、D2的作用是限制烙铁输出时的电压进入单片机。温度设定采用电位器,几kΩ到几百kΩ都可以,参考电压使用电源电压AVCC作为基准,这样能充分利用电位器的全部位置。烙铁控制输出通过光耦,能避免驱动元件损坏时,高压进入单片机造成损坏。单片机AD转换电源串接电感,参考电压外接电容,能有效减少电路对AD转换的干扰。LED驱动为共阳极分时驱动,这里不再细说。


图1:电路原理图

没有用参考温度测量,默认了环境温度为30℃,当电路板放到盒子内工作一段时间,温度基本上是这样,环境温度对测量温度有一定影响。电路输入电压15~20内最好,因没有采用PID温度调节,不同电压对电路温度调节稳定性有一定影响。制作时根据需要可自己修改源码,提高温度控制精度。
程序源代码如下:


//********************************************************************
//白光烙铁控制程序
//M16  150-52、200-58、250-64、300-70
//2011.7.10
//********************************************************************

#include <iom16v.h>
#include <macros.h>
#pragma interrupt_handler Timer0Int:10

unsigned char DISP[3]={0x01,0x02,0x03}; //3位数字,高位在前,温度值:XXX℃
//显示状态切换,0-停止,1-加热,显示烙铁温度,2-调节,3-烙铁插错
unsigned char Mod;  
unsigned char Num3;   //轮流显示
unsigned int Num4;   //设定延时切换,2s
unsigned long Ut;   //热电偶电压
unsigned int U[100];  //热电偶电压均值计算
unsigned int Ua;   //设定电压
unsigned int Tf;   //上次设定值
unsigned char Tk;   //计时
unsigned char Tr;   //加热周期,0~4/5
unsigned int Ts;   //设定温度值,160~410
unsigned int Tt;   //实际温度值,0~410
unsigned int Tp;   //实际温度均值显示

const unsigned char DIG[]={0x14,0x77,0x4C,0x45,0x27,0x85,0x84,0x57,0x04,0x05,0x26,0xBC,0x8E};
//从高到低:B、F、A、G、C、DP、D、E
//数字编码:0、1、2、3、4、5、6、7、8、9、H(10)、L(11)、F(12)

//--------------------------------------------------
//io_init:初始化IO子程序
//--------------------------------------------------
void io_init(void)
{
   DDRA = 0xC2;  //PA0\PA2\PA3\PA4\PA5为输入,其余均为输出
  PORTA|=0x30;  //拉高按键管脚
  DDRB = 0xFF;
   DDRC = 0xFC;  //
  PORTC|=0x03;
   DDRD = 0xF7;  //PD3输入
  PORTD|=0x08;  
}

//-------------------------------------------------------------------
//TIMER_init:初始化定时器 5ms定时 无分频
//-------------------------------------------------------------------
void TIMER_init(void)
{
   TCCR0 = 0x00; //stop
   TCNT0 = 0x64; //set count
  TCCR0 = 0x04; //start timer
  MCUCR = 0x00;
  GICR = 0x00;
  TIMSK = 0x01; //timer interrupt sources 允许定时器零匹配和溢出中断
}

//-------------------------------------------------------------------
//TLT:A/D转换,烙铁温度
//-------------------------------------------------------------------
void TLT(void)
{
unsigned int tmp;   //
unsigned char i;   //

ADCSRA = 0x00; //disable adc
ADMUX = 0xEF; //2.56V内部基准,左对齐,通道ADC3、ADC2差分输入
ACSR  = 0x80;
  ADCSRA=0xC6; //ADC使能并开始转换,预分频64,8/64=125kHz(50~200)
  while(!(ADCSRA&(1<<ADIF)));
  ADCSRA|=(1<<ADSC)|(0<<ADIF); //第二次转换,更准确些
  while(!(ADCSRA&(1<<ADIF)));
  Ut=ADCH;
  for(i=0;i<99;i++)U=U[i+1]; //保存前100个测量值
U[99]=Ut;
Ut=0;
for(i=90;i<100;i++)Ut=Ut+U;  //取最近10个的平均值作为温度调节差值计算用
if(Ut<340) Ut=340;
Tt=25*Ut/30-283;
Ut=0;
for(i=0;i<100;i++)Ut=Ut+U;
if(Ut<3400) Ut=3400;            //取100个的平均值作为温度显示用
Tp=25*Ut/300-283;
}

//-------------------------------------------------------------------
//TSET:A/D转换,设定温度转换
//-------------------------------------------------------------------
void TSET(void)
{
unsigned int tmp;   //
unsigned char i;   //

  ADCSRA = 0x00; //disable adc
  ADMUX = 0x60; //AVCC,左对齐,通道ADC0单端输入
  ACSR  = 0x80;
   ADCSRA=0xC6;
   while(!(ADCSRA&(1<<ADIF)));
   ADCSRA|=(1<<ADSC)|(0<<ADIF);
   while(!(ADCSRA&(1<<ADIF)));
   Ua=ADCH;
  Tf=Ts;  
  Ts=Ua+155;
    if((Tf>Ts && Tf-Ts>2)||(Ts>Tf && Ts-Tf>2))
   {
   Mod=2;
   Num4=0;
   }  
  if(Ts<160)Mod=0;  
  if(Mod==2 && Num4>500)
  {
    if(Ts<160)Mod=0;
   else Mod=1;
  }
}

//--------------------------------------------------
//主程序
//--------------------------------------------------
void main(void)
{
unsigned int m;   //
io_init();
  
DDRC&=0Xcf;
PORTC|=0X30;
TIMER_init();
Mod=1;
Tr=1;
PORTA=0xF2;
Ts=200;
SEI(); //     //开中断
  
while(1)
{
  if(Ts<Tt)    //根据温度差值计算加热周期
  {
     Tr=1;
     if(Ts>240)Tr=2;
     if(Ts>340)Tr=3;
  }
  else
  {
      m=(Ts-Tt);
      if(m<5) Tr=3;
      if(m>5 && m<11) Tr=5;
      if(m>10 && m<20) Tr=7;
      if(m>20 && m<31) Tr=10;
      if(m>30 && m<51) Tr=12;
      if(m>50) Tr=15;
   if(Ts>240)Tr*=2;
            if(Ts>320)Tr+=3;
   if(Tr>15) Tr=15;
  }
}

}
//-------------------------------------------------------------------
//Timer0Int:定时中断子程序,用于显示输出及按键延时计时,5ms
//-------------------------------------------------------------------
void Timer0Int(void)
{
  unsigned char n;   //循环计数,0~19
  unsigned char m;   //
unsigned int p;   //
TCNT0=0x64;//79次计数为10mS
Num3++;      //轮显
Num4++;      //状态转换
Tk++;

if(Tk>199)Tk=0;
n=Tk%20;
if(n==0)
{
  PORTA|=0x02;  
  TLT();     //读温度转换
  if(Tk%40==0)   //0.2s刷新显示
  {
    TSET();    //设定电压
   if(Mod==1)p=Tp;
    if(Mod==2)p=Ts;
   //p=Mod;
   //p=Ua;
   DISP[0]=p/100;     //显示温度
   DISP[1]=(p%100)/10;
   DISP[2]=p%10;
   if(Mod==0)
   {
    DISP[0]=0;     //显示OFF
    DISP[1]=12;
    DISP[2]=12;
   }
  }
}
else
{
   if(n<Tr+1 && Mod>0)PORTA&=0xFD;    //n/20周期加热
   else
   PORTA|=0x02;
}

PORTD|=0x07;
n=Num3%3;
m=DIG[DISP[n]];
if(Mod==2) m&=0xFB;   //设置温度状态
PORTB=m;
if(n==2)PORTD&=0xFE;  //输出个位数字
if(n==1)PORTD&=0xFD;  //输出十位数字
if(n==0)PORTD&=0xFB;  //输出百位数字
}

  
电路板见图2,熔丝位设定见图3。

图2:电路板

图3:熔丝位设定
    电路板放入盒子里时如果和开关电源放在一起,距离不能太近,开关电源可能会对AD转换有干扰,具体离多远安装时调试下,建议3cm以上,我的盒子小,放开关电源时紧挨着就有干扰,严重的表现是不调设定电位器时设定温度也会闪动,准备放4节锂电,在不好接电源时用。




本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共17条打赏 ,M币+99 ,专家+1
12
关键词: M16T12白光
离线zhouchs

发帖
14
M币
287
专家
2
粉丝
15
只看该作者 1楼 发表于: 2011-07-19
回 楼主(zhouchs) 的帖子
请登录后查看
[ 此帖被zhouchs在2011-07-20 19:30重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共2条打赏 ,M币+10
离线oled

发帖
5062
M币
53
专家
4
粉丝
101
只看该作者 2楼 发表于: 2011-07-19
请登录后查看
离线xiayu9213

发帖
188
M币
162
专家
4
粉丝
24
只看该作者 3楼 发表于: 2011-07-19
请登录后查看
离线qq1851166

发帖
827
M币
204
专家
4
粉丝
20
只看该作者 4楼 发表于: 2011-07-19
请登录后查看
离线hizllin

发帖
907
M币
89
专家
2
粉丝
34
只看该作者 5楼 发表于: 2011-07-19
请登录后查看
离线eking

发帖
38
M币
43
专家
1
粉丝
12
只看该作者 6楼 发表于: 2011-07-19
请登录后查看
离线tank364638

发帖
1043
M币
4909
专家
1
粉丝
47
只看该作者 7楼 发表于: 2011-07-19
请登录后查看
离线chary8088

发帖
256
M币
819
专家
2
粉丝
22
只看该作者 8楼 发表于: 2011-07-19
请登录后查看
离线wb.chn

发帖
503
M币
3854
专家
2
粉丝
18
只看该作者 9楼 发表于: 2011-07-19
回 楼主(zhouchs) 的帖子
请登录后查看
快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个