173 2438 5004
KEROS加密芯片——品牌直销 | 免费样品 | 技术支持
当前位置:网站首页 > 资讯中心 正文 资讯中心

单片机控制电阻丝加热

htxw 2023-03-15 资讯中心 54 ℃

利用单片机制作一个可调节的恒温装置,有人能给一些思路吗

一个温度传感器,一套驱动电路,一套加热装置(如电阻丝)。

温度传感器一般输出的是电压信号,接入单片机的AD管脚。

驱动电路驱动加热装置,一般接上单片机的PWM输出管脚。

单片机采到温度传感器的信号,将其转化为具体的温度值,然后依据温度值可以采用PID来调节PWM波来驱动加热器。

用单片机做PWM控制电加热器的加热功率请问控制思路是什么?

用单片机做PWM控制电加热器的加热功率请问控制思路可以这么考虑:加热功率的大小由输出脉冲的占空比决定,占空比大,则加热功率就大。而输出脉冲的的形成可采用计时方式,即利用内部的定时/计数器产生,可以设置两个定时器,一个为脉冲高电平输出的延时,另一个为低电平输出的延时或整个周期时间的延时。两个定时/计数器采用中断工作方式,另外设置单片机的某一引脚为脉冲输出通道,当两个定时/计数器定时到后,分别改变这个通道的状态,就可实现PWM脉冲的输出。

PWM脉冲的占空比就由于两个定时/计数器的定时确定。而定时的大小则根据检测信号与设定值的偏差,经过PID运算或其它控制规律运算确定。整个单片机系统主程序是对检测加热温度信号进行周而复始的扫描。当扫描到有信号输入时(A/D转换芯片送给单片机的),就进行控制规律的比较,需要改变输出脉冲占空比时,将计算后的两个定时/计数器的定时值分别重新送给这两个定时/计数器定时值的存储单元即可。

实际为了提高时效,可以根据控制规律,将输出脉冲的占空比所对应的两个定时/计数器的定时值事先计算好,并按照顺序事先存放在单片机的内存中,执行程序时则采用查表的方法,在扫描到有信号输入时直接查表,取出定时值送给这两个定时/计数器。这样工作速度快,PWM的动、静态性能较好,但程序编写好后,控制精度就不能更改。

因为,这是整个系统的设计问题,只能简单地说这些思路了。

采用单片机控制一220V加热电阻丝的通断,用何种继电器?

建议采用固态继电器(SSR),固态继电器相关型号可以在网上很方便的查到。

或者采用微型板载的继电器控制接触器(微型继电器分断能力不够),从而达到控制电阻丝通断的目的。

51单片机要使电热丝发热,用继电器驱动(5V),应该怎么连线啊?

vcc电源电压,即电源接入,gnd地线或0线,in数据信号的正负输入

如何用单片机做可调温加热器?

一、主要功能:

1、温度显示、温度调节。

2、升温、恒温。

3、休眠、自动关机。

二、技术原理:

1、随着温度变化,加热丝电阻也会变化。在加热丝和电源之间串联一个采样电阻,根据采样得到的电压值来计算温度值。

2、交流电过零检测,单片机输出一定比例的波形,控制可控硅输出功率大小,来达到控温。

三、技术要点:

1、测温、恒温。

2、过零检测,交流电可控硅百分比输出控温(丢波方式)。

请求大虾帮助编程!

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

先设计电路。

然后,根据电路,才能编程。

如何编写89SDc51单片机控制电阻丝加热和制冷片制冷的程序?最好是PIDg算法或者是C语言编写的,谢谢

这个正适合你用,pid温度控制程序

PID温度控制程序

//PID算法温控C语言

#includereg51.h

#includeintrins.h

#includemath.h

#includestring.h

struct PID {

unsigned int SetPoint; // 设定目标 Desired Value

unsigned int Proportion; // 比例常数 Proportional Const

unsigned int Integral; // 积分常数 Integral Const

unsigned int Derivative; // 微分常数 Derivative Const

unsigned int LastError; // Error[-1]

unsigned int PrevError; // Error[-2]

unsigned int SumError; // Sums of Errors

};

struct PID spid; // PID Control Structure

unsigned int rout; // PID Response (Output)

unsigned int rin; // PID Feedback (Input)

sbit data1=P1^0;

sbit clk=P1^1;

sbit plus=P2^0;

sbit subs=P2^1;

sbit stop=P2^2;

sbit output=P3^4;

sbit DQ=P3^3;

unsigned char flag,flag_1=0;

unsigned char high_time,low_time,count=0;//占空比调节参数

unsigned char set_temper=35;

unsigned char temper;

unsigned char i;

unsigned char j=0;

unsigned int s;

/***********************************************************

延时子程序,延时时间以12M晶振为准,延时时间为30us×time

***********************************************************/

void delay(unsigned char time)

{

unsigned char m,n;

for(n=0;ntime;n++)

for(m=0;m2;m++){}

}

/***********************************************************

写一位数据子程序

***********************************************************/

void write_bit(unsigned char bitval)

{

EA=0;

DQ=0; /*拉低DQ以开始一个写时序*/

if(bitval==1)

{

_nop_();

DQ=1; /*如要写1,则将总线置高*/

}

delay(5); /*延时90us供DA18B20采样*/

DQ=1; /*释放DQ总线*/

_nop_();

_nop_();

EA=1;

}

/***********************************************************

写一字节数据子程序

***********************************************************/

void write_byte(unsigned char val)

{

unsigned char i;

unsigned char temp;

EA=0; /*关中断*/

TR0=0;

for(i=0;i8;i++) /*写一字节数据,一次写一位*/

{

temp=vali; /*移位操作,将本次要写的位移到最低位*/

temp=temp1;

write_bit(temp); /*向总线写该位*/

}

delay(7); /*延时120us后*/

// TR0=1;

EA=1; /*开中断*/

}

/***********************************************************

读一位数据子程序

***********************************************************/

unsigned char read_bit()

{

unsigned char i,value_bit;

EA=0;

DQ=0; /*拉低DQ,开始读时序*/

_nop_();

_nop_();

DQ=1; /*释放总线*/

for(i=0;i2;i++){}

value_bit=DQ;

EA=1;

return(value_bit);

}

/***********************************************************

读一字节数据子程序

***********************************************************/

unsigned char read_byte()

{

unsigned char i,value=0;

EA=0;

for(i=0;i8;i++)

{

if(read_bit()) /*读一字节数据,一个时序中读一次,并作移位处理*/

value|=0x01i;

delay(4); /*延时80us以完成此次都时序,之后再读下一数据*/

}

EA=1;

return(value);

}

/***********************************************************

复位子程序

***********************************************************/

unsigned char reset()

{

unsigned char presence;

EA=0;

DQ=0; /*拉低DQ总线开始复位*/

delay(30); /*保持低电平480us*/

DQ=1; /*释放总线*/

delay(3);

presence=DQ; /*获取应答信号*/

delay(28); /*延时以完成整个时序*/

EA=1;

return(presence); /*返回应答信号,有芯片应答返回0,无芯片则返回1*/

}

/***********************************************************

获取温度子程序

***********************************************************/

void get_temper()

{

unsigned char i,j;

do

{

i=reset(); /*复位*/

}while(i!=0); /*1为无反馈信号*/

i=0xcc; /*发送设备定位命令*/

write_byte(i);

i=0x44; /*发送开始转换命令*/

write_byte(i);

delay(180); /*延时*/

do

{

i=reset(); /*复位*/

}while(i!=0);

i=0xcc; /*设备定位*/

write_byte(i);

i=0xbe; /*读出缓冲区内容*/

write_byte(i);

j=read_byte();

i=read_byte();

i=(i4)0x7f;

s=(unsigned int)(j0x0f);

s=(s*100)/16;

j=j4;

temper=i|j; /*获取的温度放在temper中*/

}

/*====================================================================================================

Initialize PID Structure

=====================================================================================================*/

void PIDInit (struct PID *pp)

{

memset ( pp,0,sizeof(struct PID));

}

/*====================================================================================================

PID计算部分

=====================================================================================================*/

unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )

{

unsigned int dError,Error;

Error = pp-SetPoint - NextPoint; // 偏差

pp-SumError += Error; // 积分

dError = pp-LastError - pp-revError; // 当前微分

pp-revError = pp-LastError;

pp-LastError = Error;

return (pp-roportion * Error//比例

+ pp-Integral * pp-SumError //积分项

+ pp-Derivative * dError); // 微分项

}

/***********************************************************

温度比较处理子程序

***********************************************************/

compare_temper()

{

unsigned char i;

if(set_tempertemper)

{

if(set_temper-temper1)

{

high_time=100;

low_time=0;

}

else

{

for(i=0;i10;i++)

{ get_temper();

rin = s; // Read Input

rout = PIDCalc ( spid,rin ); // Perform PID Interation

}

if (high_time=100)

high_time=(unsigned char)(rout/800);

else

high_time=100;

low_time= (100-high_time);

}

}

else if(set_temper=temper)

{

if(temper-set_temper0)

{

high_time=0;

low_time=100;

}

else

{

for(i=0;i10;i++)

{ get_temper();

rin = s; // Read Input

rout = PIDCalc ( spid,rin ); // Perform PID Interation

}

if (high_time100)

high_time=(unsigned char)(rout/10000);

else

high_time=0;

low_time= (100-high_time);

}

}

// else

// {}

}

/*****************************************************

T0中断服务子程序,用于控制电平的翻转 ,40us*100=4ms周期

******************************************************/

void serve_T0() interrupt 1 using 1

{

if(++count=(high_time))

output=1;

else if(count=100)

{

output=0;

}

else

count=0;

TH0=0x2f;

TL0=0xe0;

}

/*****************************************************

串行口中断服务程序,用于上位机通讯

******************************************************/

void serve_sio() interrupt 4 using 2

{

/* EA=0;

RI=0;

i=SBUF;

if(i==2)

{

while(RI==0){}

RI=0;

set_temper=SBUF;

SBUF=0x02;

while(TI==0){}

TI=0;

}

else if(i==3)

{

TI=0;

SBUF=temper;

while(TI==0){}

TI=0;

}

EA=1; */

}

void disp_1(unsigned char disp_num1[6])

{

unsigned char n,a,m;

for(n=0;n6;n++)

{

// k=disp_num1[n];

for(a=0;a8;a++)

{

clk=0;

m=(disp_num1[n]1);

disp_num1[n]=disp_num1[n]1;

if(m==1)

data1=1;

else

data1=0;

_nop_();

clk=1;

_nop_();

}

}

}

/*****************************************************

显示子程序

功能:将占空比温度转化为单个字符,显示占空比和测得到的温度

******************************************************/

void display()

{

unsigned char code number[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};

unsigned char disp_num[6];

unsigned int k,k1;

k=high_time;

k=k%1000;

k1=k/100;

if(k1==0)

disp_num[0]=0;

else

disp_num[0]=0x60;

k=k%100;

disp_num[1]=number[k/10];

disp_num[2]=number[k%10];

k=temper;

k=k%100;

disp_num[3]=number[k/10];

disp_num[4]=number[k%10]+1;

disp_num[5]=number[s/10];

disp_1(disp_num);

}

/***********************************************************

主程序

***********************************************************/

main()

{

unsigned char z;

unsigned char a,b,flag_2=1,count1=0;

unsigned char phil[]={2,0xce,0x6e,0x60,0x1c,2};

TMOD=0x21;

TH0=0x2f;

TL0=0x40;

SCON=0x50;

PCON=0x00;

TH1=0xfd;

TL1=0xfd;

PS=1;

EA=1;

EX1=0;

ET0=1;

ES=1;

TR0=1;

TR1=1;

high_time=50;

low_time=50;

PIDInit ( spid ); // Initialize Structure

spid.Proportion = 10; // Set PID Coefficients

spid.Integral = 8;

spid.Derivative =6;

spid.SetPoint = 100; // Set PID Setpoint

while(1)

{

if(plus==0)

{

EA=0;

for(a=0;a5;a++)

for(b=0;b102;b++){}

if(plus==0)

{

set_temper++;

flag=0;

}

}

else if(subs==0)

{

for(a=0;a5;a++)

for(b=0;a102;b++){}

if(subs==0)

{

set_temper--;

flag=0;

}

}

else if(stop==0)

{

for(a=0;a5;a++)

for(b=0;b102;b++){}

if(stop==0)

{

flag=0;

break;

}

EA=1;

}

get_temper();

b=temper;

if(flag_2==1)

a=b;

if((abs(a-b))5)

temper=a;

else

temper=b;

a=temper;

flag_2=0;

if(++count130)

{

display();

count1=0;

}

compare_temper();

}

TR0=0;

z=1;

while(1)

{

EA=0;

if(stop==0)

{

for(a=0;a5;a++)

for(b=0;b102;b++){}

if(stop==0)

disp_1(phil);

// break;

}

EA=1;

}

}

//DS18b20 子程序

#include REG52.H

sbit DQ=P2^1; //定义端口

typedef unsigned char byte;

typedef unsigned int word;

//延时

void delay(word useconds)

{

for(;useconds0;useconds--);

}

//复位

byte ow_reset(void)

{

byte presence;

DQ=0; //DQ低电平

delay(29); //480us

DQ=1; //DQ高电平

delay(3); //等待

presence=DQ; //presence信号

delay(25);

return(presence);

} //0允许,1禁止

//从1-wire 总线上读取一个字节

byte read_byte(viod)

{

byte i;

byte value=0;

for (i=8;i0;i--)

{

value=1;

DQ=0;

DQ=1;

delay(1);

if(DQ)value|=0x80;

delay(6);

}

return(value);

}

//向1-wire总线上写一个字节

void write_byte(char val)

{

byte i;

for (i=8;i0;i--) //一次写一个字节

{

DQ=0;

DQ=val0x01;

delay(5);

DQ=1;

val=val/2;

}

delay(5);

}

//读取温度

char Read_Temperature(void)

{

union{

byte c[2];

int x;

}temp;

ow_reset();

write_byte(0xcc);

write_byte(0xBE);

temp.c[1]=read_byte();

temp.c[0]=read_byte();

ow_reset();

write_byte(0xCC);

write_byte(0x44);

return temp.x/2;

}

单片机控制电阻丝加热的介绍到此就结束了,感谢您耐心阅读,谢谢。

本文标签:单片机控制电阻丝加热

<