长汀无线电厂交流论坛

 找回密码
 注册
楼主: zhouchs
打印 上一主题 下一主题

用M16控制白光烙铁温度

  [复制链接]
21#
发表于 2011-6-8 15:15:45 | 只看该作者
顶一下,看似可以
回复 支持 反对

使用道具 举报

22#
 楼主| 发表于 2011-6-28 19:32:03 | 只看该作者
//********************************************************************
//白光烙铁控制程序
//M16  150-52?200-58?250-64?300-70
//2011.6.27 取消按键调节部分代码,只留电位器调节
//********************************************************************

#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 int Ut;                        //热电偶电压
unsigned int U[64];                        //热电偶电压均值计算
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

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)

/*****************************************
              延时子程序
******************************************/
void Delay(unsigned int n)
{
    unsigned int i ;  
    for(i=0;i<50*n;i++);
}

//--------------------------------------------------
//io_init:初始化IO子程序
//--------------------------------------------------
void io_init(void)
{
         DDRA = 0xC2;  //PA0\PA2\PA3\PA4\PA5为输入,其余均为输出
         PORTA|=0x30;  //拉高按键管脚
         DDRB = 0xFF;
         DDRC = 0xFC;  //I2C管脚为定义为输入,再拉高
         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;
        //if(Ut>127) Ut=0;
                
        for(i=0;i<63;i++)U[i]=U[i+1];
        U[63]=Ut;
        Ut=0;
        for(i=0;i<64;i++)Ut=Ut+U[i];
        Ut>>=6;
        if(Ut<34) Ut=34;
        Tt=25*Ut/3-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=2;
                          if(Ts>240)Tr=4;
                          //if(Ts>340)Tr=3;
                }
                else
                {
                           m=(Ts-Tt);
                           if(m<11) Tr=4;
                           //if(m>5 && m<11) Tr=5;
                           if(m>10 && m<31) Tr=6;
                           //if(m>20 && m<31) Tr=10;
                           if(m>30 && m<51) Tr=8;
                           if(m>50) Tr=12;
                }
        }

}

//-------------------------------------------------------------------
//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=Tt;
                         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;                //输出百位数字
}

取消了LM35环境温度测量,取消了按键调节,只支持电位器调节。调整了温度测量准确度,由于使用了内部差分输入,用放大了200倍,精度只有7位,加上测温范围的关系,温度准确度在10度左右。
回复 支持 反对

使用道具 举报

23#
发表于 2011-6-29 22:30:24 | 只看该作者
M16太贵,用M8加LM358放大获取温度采样电压,最经济,环境温度也可选三极管采样,这样能大大降低制作成本,我认为楼主修改用电位器调节温度,构思巧妙,缩减了原代码,用电位器调节温度,操作简便,还有温度控制写得比较好,网上我看了数码之家,手电论谈里网友写的原代码,用上了温度调节系数,电烙铁实用为主,差几度也不影响,若能做到这几点,开源数显白光离大家越来越近了。
回复 支持 反对

使用道具 举报

24#
发表于 2011-8-20 11:01:03 | 只看该作者
很好很好,能套件更好
回复 支持 反对

使用道具 举报

25#
发表于 2011-9-7 17:19:23 | 只看该作者
能套件更好!!!!!!!!!!
回复 支持 反对

使用道具 举报

26#
发表于 2011-9-17 23:47:49 | 只看该作者
也建议用STC的MCU,便宜,更有性价比。开源,体现楼主的无私,敬佩!
回复 支持 反对

使用道具 举报

27#
发表于 2011-10-6 21:32:30 | 只看该作者
楼主 加油  !
回复 支持 反对

使用道具 举报

28#
发表于 2011-10-7 22:59:29 | 只看该作者
拨拨 发表于 2011-9-17 23:47
也建议用STC的MCU,便宜,更有性价比。开源,体现楼主的无私,敬佩!

是啊,STC的现在也容易买。
回复 支持 反对

使用道具 举报

29#
发表于 2011-10-8 15:27:54 | 只看该作者
现在AVR的单片机价格降下来了,像贴片的 ATMEGA8L淘宝上只要4.5元 ,楼主的电路可以改用 ATMEGA8L,还有AVR的驱动能力比较强,数码管改成共阴的,可以省掉3个位驱动的三极管。
回复 支持 反对

使用道具 举报

30#
发表于 2012-3-19 10:47:19 | 只看该作者
记个号
回复 支持 反对

使用道具 举报

31#
发表于 2012-3-29 10:29:06 | 只看该作者
又有好玩的东东了。记个号
回复 支持 反对

使用道具 举报

32#
发表于 2012-4-17 21:19:28 | 只看该作者
谁能改为51的源程序就好了,51的片子我很多,烧录器也有。

AVR的芯片我还没用过。
回复 支持 反对

使用道具 举报

33#
发表于 2012-7-4 23:52:08 | 只看该作者
支持,我认为你太厉害了
回复 支持 反对

使用道具 举报

34#
发表于 2012-10-5 22:36:18 | 只看该作者
希望楼主尽快成功!期盼着……
回复 支持 反对

使用道具 举报

35#
发表于 2012-10-7 09:33:45 | 只看该作者





    这是我以前做的自用版PACE恒温烙铁,几年用下来效果不错。用51单片机控温外带数显。为了减少感应电用的是铁牛供电也算的上是防静电焊台,焊cmos器件不用提心掉胆的。
    外壳是微机电源的铁壳,有点大,不过竖起来放横向空间不大。原本想做个两用焊台,往里面塞点稳压电源电路啥的,可惜没空,等里面都做好了再做面板也不迟,现在这副样子就算是个样机吧!能用,实用。
    市场上PACE烙铁不多,当初还研究了一番,烙铁芯里的测温元件和936,T12还不一样,是热电阻的,为了这我还对电路做了一下特殊改进。
    试用的时候出现了一个小插曲,显示的温度不稳定,而且升温慢,起初以为是单片机程序问题,改了好几次,连程序结构也改了,后来拆开大卸八块,连示波器都用上了,一看原来是一根跳线虚焊。东西复杂了,容易出问题,简单最好啊,电饭锅一个温控器就搞定一顿饭,下回搞个精简版模拟控温电路试试。
    过节空闲时间多,话也多,交流了,希望对坛友有些帮助吧。
回复 支持 反对

使用道具 举报

36#
发表于 2012-10-7 09:58:51 | 只看该作者
广大爱好者的心声:越简单越好
回复 支持 反对

使用道具 举报

37#
发表于 2012-10-7 22:52:34 | 只看该作者
动手能力不错,希望能简单化。
回复 支持 反对

使用道具 举报

38#
发表于 2012-10-9 14:47:48 | 只看该作者
   很久都想利用电阻丝的热态电阻搞个温控电路,现在草图出来了。(脑子里想象的,可能和实际有点偏差。)   向来没有盖楼打地基的习惯,借用贴主的宝地摆个地摊,凑凑热闹,呵呵




注明一下:
         RW是普通的220V烙铁,只要内部是发热丝的都行.
         Q1功率晶体管,MOS管都可。
         30W的内热式烙铁,随着温度上升电阻会增加上百欧姆,不过离散性有点大

220v恒温_1.jpg (82.61 KB, 下载次数: 0)

220v恒温_1.jpg

点评

估计实用价值不大,晶体管和光耦可以直接用交流固体继电器  发表于 2012-11-16 16:39
回复 支持 反对

使用道具 举报

39#
发表于 2012-11-18 22:56:05 | 只看该作者
回复 163yjq 的帖子

谢谢,因用的时间较少基本能满足要求。
回复 支持 反对

使用道具 举报

40#
发表于 2012-11-10 18:12:33 | 只看该作者
是否调校交流电压而达到调温目的呢-----------请指教。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|长汀无线电厂交流论坛  

GMT+8, 2024-5-1 19:34 , Processed in 0.813575 second(s), 24 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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