可控硅触发单片机测试
单相通用型可控硅触发板是通过调整可控硅的导通角来实现电气设备的电压电流功率调整的一种移相型的电力控制器,其核心部件采用国外生产的高性能、高可靠性的军品级可控硅触发专用集成电路。输出触发脉冲具有极高的对称性及稳定性,且不随环境温度变化,使用中不需要对脉冲对称度及限位进行调整。现场调试一般不需要示波器即可完成。它可广泛的应用于工业各领域的电压电流调节,适用于电阻性负载、电感性负载、变压器一次侧及各种整流装置等,
* 以镍铬、铁铬铝、远红外发热元件及硅钼棒、硅碳棒等为加热元件的温度控制。
单结晶体管构成晶闸管触发电路 * 盐浴炉、工频感应炉、淬火炉、熔融玻璃的温度加热控制。* 整流变压器、调功机(纯电感线圈)、电炉变压器一次侧、直流电机控制。 * 单相电焊机、电阻焊机、点焊机控制等各种调场合。 * 单相风机水泵调速节能控制 * 电压、电流、功率、灯光等无级平滑调节。
单结晶体管构成晶闸管触发电路 波形图 用单结晶体管构成的晶闸管触发电路如图1 所示,触发电路的有关电压波形如图2 所示。与单结晶体管构成弛张振荡电路相比较,电路的振荡部分相同,同步是通过对电源电路的改进实现的。取自主电路的正弦交流电通过同步变压器T 降压,变为较低的交流电压,然后经二极管整流桥变成脉动直流。稳压管VW 和电阻RW的作用是"削波",脉动电压小于稳压管的稳压值时,VW 不导通,其两端的电压与整流输出电压相等;如果脉动电压大于稳压管的稳压值,将使VW 击穿,其两端电压保持稳压值,整流桥输出电压高出稳压值的部分降在电阻RW上。这样VW 两端的电压波形近似与一个梯形波,用这个电压取代弛张振荡电路中的直流电源,起到同步作用。
由于振荡电路的电源为梯形波,在主电路正弦波每一半波结束和开始的一段时间,振荡电路的电源电压很小,电路不振荡,同时电容电压释放到0。当电源电压接近梯形波的顶部时,振荡电路开始工作,当电容充电使两端的电压达到单结晶体管峰点电压Vp时,单结晶体管导通电容放电,放电电流流过R1与被触发晶闸管的门极的并联电路形成输出,为晶闸管提供触发脉冲,使晶闸管导通。然后电路进入下一振荡周期,但晶闸管一经导通门极就失去控制作用,一个电源电压半周中振荡电路输出的脉冲只是第一个起到触发作用,后面的脉冲是无效的。在主电路电压的半周接近结束时,振荡电路的电源电压进入梯形波的斜边并迅速下降,振荡电路停振,同时电容电压释放到0。因此在主电路的每一个半波中,电容总是从0开始充电,保证了触发脉冲与主电路电压的同步。
单片机源码:
#include <C:\Keil\C51\INC\REG52.h>
#include <C:\Keil\C51\INC\stdlib.h>
unsigned int Frequency;
unsigned char Chnnl;
unsigned long I_Scale , V_Scale , A_Scale ;
unsigned char code Show_S2[10] ={'0','1','2','3','4','5','6','7','8','9'};
unsigned char Index1[13]; //
unsigned char Index3[5]; //
unsigned char Re_value[5]; // 被取模变量数组
unsigned char Hex_H , Hex_L;
unsigned int Hex_e0;
sbit Clock_clk =P1^0 ; // ADC Max186 接口
sbit CS1_Out = P1^1 ;
sbit Dout_Data = P1^2 ;
sbit Dout_Input =P1^3 ;
sbit Start_Up = P3^2; // 过零同步入口,关于这个接口变量是中断入口
// 表面上看没有必要定意,我在程序中并没应用,是因为我删除其内容
// 请记住它有重要意义!!!.如果你应用到产品上关系到你的产品能否成攻
// 如果你应用到一般产品上可以不要其内容.
sbit Control_Out = P3^4; // 可控硅触发控制信号
bit Power_OFF =0; // 关闭 PWM 5KV 电源
bit STOP = 1 ;
char bdata Max_Temp _at_ 0x20;
sbit a0 = Max_Temp^0;
sbit a1 = Max_Temp^1;
sbit a2 = Max_Temp^2;
sbit a3 = Max_Temp^3;
sbit a4 = Max_Temp^4;
sbit a5 = Max_Temp^5;
sbit a6 = Max_Temp^6;
sbit a7 = Max_Temp^7;
void New_Main(void); // 主程序
void Tmod_Step(void); // 初始化函数
void Time0_Serve(void); // 可控硅触发延时中断程序
void Int0_Serve(void); // 同步过零触发中断服务程序
void COM1_Serve(void); // COM1 中断函数
void SBUF_Char(unsigned char Temp); // 发送数据
void SBUF_Scale(unsigned long Temp01,unsigned long Temp02,unsigned longTemp03); // 发送检测数据
void Switch_Gate(void); // ADC 通道切换函数
void Model_Data(unsigned int Temp); // 取模函数
int Max_186(unsigned char Temp1); // ADC Max186 采样程序
void main () // Main 主程序这样使用主要防止堆栈溢出
{
while(STOP)Tmod_Step();
while(1)New_Main();
}
/****************************** 主程序******************************
* 名称: New_Main
* 说明: ?
* 功能:
* 调用: 键盘输入函数
* 输入: 无
* 返回值:
*********************************************************************/
void New_Main(void)
{
ES = 1;
if (Index1[12] == 'A') // 上位机命令
{
Index1[12] = ' ';
Switch_Gate(); // ADC 通道切换函数
SBUF_Scale (I_Scale , V_Scale , A_Scale); // 送上位机计算处理
}
if (Index1[12] == 'B') // 上位机命令
{
Index1[12] = ' ';
Hex_e0 = atoi(Index3);// 字幅串数组变量转换函数(该 Hex_e0 变量是可控硅触发角)
// 并接上位机可控硅触发角
Power_OFF = 1; // 启动可控硅触发
}
if (Index1[12] == 'C') // 上位机命令
{
Index1[12] = ' ';
Power_OFF = 0; // 关闭可控硅触发
}
return ;
}
/************************ COM1 中断函数****************************
* 名称: COM1_Serve
* 说明: 接收 'A' 'B' 'C' 命令并和上位机之间全部以 ASCII 方式通信
* 功能: 接收上位机数组 Index1[12] 含有命令
* 调用: 无
* 输入: 无
* 返回值: Index1[] 命令数组
*********************************************************************/
void COM1_Serve(void) interrupt 4
{
unsigned char j = 0 ;
RI = 0;
ES = 0;
switch (SBUF)
{
case 'A':
for (j = 0 ; j <= 12 ; j++)
{
while(!RI);
RI = 0;
Index1[j] = SBUF; // 接收数组 Index1[12] 含有命令
}
Index3[0] = Index1[0]; // 接收到字幅串数组 Index3[x]
Index3[1] = Index1[1];
Index3[2] = Index1[2];
Index3[3] = Index1[3];
Index3[4] = Index1[4];
break;
default:;
break ;
}
TI = 0;
ES = 1;
return ;
}
/********************** 发送数据 *************************
* 名称: SBUF_Scale(Temp01,Temp02,Temp03)
* 说明:
* 功能:
* 调用: Model_Data(Temp) 取模函数
* 调用: SBUF_Char(Temp) 字符发送函数
* 输入:
* 输入:
* 返回值: 无
**********************************************************/
void SBUF_Scale(unsigned long Temp01,unsigned long Temp02,unsigned long Temp03)
{
ES = 0;
SBUF_Char('_');
Model_Data(Temp01) ;
SBUF_Char(Show_S2[Re_value[3]]) ;
SBUF_Char(Show_S2[Re_value[2]]) ;
SBUF_Char(Show_S2[Re_value[1]]) ;
SBUF_Char(Show_S2[Re_value[0]]) ;
Model_Data(Temp02) ;
SBUF_Char('_');
SBUF_Char(Show_S2[Re_value[3]]) ;
SBUF_Char(Show_S2[Re_value[2]]) ;
SBUF_Char(Show_S2[Re_value[1]]) ;
SBUF_Char(Show_S2[Re_value[0]]) ;
Model_Data(Temp03) ;
SBUF_Char('_');
SBUF_Char(Show_S2[Re_value[3]]) ;
SBUF_Char(Show_S2[Re_value[2]]) ;
SBUF_Char(Show_S2[Re_value[1]]) ;
SBUF_Char(Show_S2[Re_value[0]]) ;
SBUF_Char('O'); // OK 是上位机确定完整收到标识
SBUF_Char('K');
ES = 1;
return;
}
/************************ ADC 通道切换函数***************************
* 名称: Switch_Gate()
* 说明: 交叉数据采样
* 功能: 通道切换交叉启动 ADC
* 调用: Max_186(Temp1) ADC 返回本次采样结果
* 输入: 无
* 返回值: I_Scale , V_Scale ,A_Scale
*********************************************************************/
void Switch_Gate(void)
{
Frequency = 0;
I_Scale = 0;
V_Scale = 0;
A_Scale = 0;
Chnnl ='A';
for (;Frequency <= 3071;) // (1024 * 3) - 1 总采样次数,关于这个数根据你要求的采样精度而定
{
switch (Chnnl)
{
case 'A':
I_Scale += Max_186(0x8f); // Max_186 启动通道号 0
Chnnl = 'B';
break;
case 'B':
V_Scale += Max_186(0xcf); // Max_186 启动通道号 1
Chnnl = 'C';
break;
case 'C':
A_Scale += Max_186(0x9f); // Max_186 启动通道号 2
Chnnl = 'A';
break;
}
}
I_Scale /= 1024.0; // 计算 1024 次采样结果平均值
V_Scale /= 1024.0;
A_Scale /= 1024.0;
return;
}
/* ******* ADC Max186 采样程序 ******** */
int Max_186(unsigned char Temp1) // Max186 Temp1 通道号
{
unsigned char i;
unsigned int Max_186;
Max_Temp = Temp1;
CS1_Out = 0;
Dout_Data = a7;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a6;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a5;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a4;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a3;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a2;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a1;Clock_clk = 1;Clock_clk = 0;
Dout_Data = a0;Clock_clk = 1;Clock_clk = 0;
for (i = 0 ; i <= 15 ; i++)
{
Clock_clk = 1;
Clock_clk = 0;
Max_186 < <= 1;
if (Dout_Input) Max_186 |= 0x01;
}
CS1_Out = 1;
Frequency ++;
Max_186 > > = 4;
return(Max_186);
}
/************************ 发送数据 **********************
* 名称: SBUF_Char(Temp)
* 说明:
* 功能: 发送数据
* 输入: Temp
* 返回值: 无
********************************************************/
void SBUF_Char(unsigned char Temp)
{
SBUF = Temp;
while(!TI);
TI=0;
return;
}
/********************* 接同步过零触发中断服务 *******************
* 名称: Int0_Serve
* 说明: Hex_e0 变量为过零角
* 功能: 同步中断函数
* 调用: 无
* 输入: 过零同步入口 Start_Up
* 返回值: 无
*********************************************************************/
void Int0_Serve(void) interrupt 0
{
Hex_H = (Hex_e0 / 256);
Hex_L = (Hex_e0 - (Hex_H *256));
TH0 = Hex_H;
TL0 = Hex_L;
if (Power_OFF == 1)TR0 = 1;
return;
}
/************************* 可控硅触发延时中断 *****************
* 名称: Time2_Serve
* 说明:
* 功能: 可控硅触发
* 调用: 无
* 输入: 无
* 返回值:
*********************************************************************/
void Time0_Serve(void) interrupt 1
{
unsigned char Timer;
TF0 = 0;
TR0 = 0;
if (Power_OFF == 1)Control_Out = 0; // 可控硅触发控制信号
for (Timer = 0 ; Timer <= 50 ; Timer++);
if (Power_OFF == 1)Control_Out = 1;
return;
}
/************************ 取模函数**********************************
* 名称: Model_Data
* 说明: 按位取模存入数组
* 功能: 按位取模
* 调用: 无
* 输入: Temp 被取模变量
* 返回值: Index1[] 数组
*********************************************************************/
void Model_Data(unsigned int Temp)
{
Re_value[4] = (Temp / 10000) % 10; // 得 10000, 万位数
Re_value[3] = (Temp / 1000) % 10; // 得 1000, 千位数
Re_value[2] = (Temp / 100) % 10; // 得 100, 百位数
Re_value[1] = (Temp / 10) % 10; // 得 10, 十位数
Re_value[0] = (Temp / 1) % 10; // 得 1, 个位数
return;
}
/* ********* 初始化函数 ********* */
void Tmod_Step(void)
{
STOP = 0;
PCON = 0x80;
TMOD = 0x21;
TCON = 0x00;
SCON = 0x50;
TH0 = 0xff;
TL0 = 0x00;
TH1 = 0xf9;
TR1 = 1;
IP = 0x12;
IE = 0x93;
return;
}
|