可控硅觸發單片機測試
單相通用型可控硅觸發板是通過調整可控硅的導通角來實現電氣設備的電壓電流功率調整的一種移相型的電力控制器,其核心部件采用國外生產的高性能、高可靠性的軍品級可控硅觸發專用集成電路。輸出觸發脈沖具有極高的對稱性及穩定性,且不隨環境溫度變化,使用中不需要對脈沖對稱度及限位進行調整。現場調試一般不需要示波器即可完成。它可廣泛的應用于工業各領域的電壓電流調節,適用于電阻性負載、電感性負載、變壓器一次側及各種整流裝置等,
* 以鎳鉻、鐵鉻鋁、遠紅外發熱元件及硅鉬棒、硅碳棒等為加熱元件的溫度控制。
1.jpg (21.26 KB, 下載次數: 49)
下載附件
2018-12-21 15:28 上傳
單結晶體管構成晶閘管觸發電路 * 鹽浴爐、工頻感應爐、淬火爐、熔融玻璃的溫度加熱控制。* 整流變壓器、調功機(純電感線圈)、電爐變壓器一次側、直流電機控制。 * 單相電焊機、電阻焊機、點焊機控制等各種調場合。 * 單相風機水泵調速節能控制 * 電壓、電流、功率、燈光等無級平滑調節。
2.jpg (34.25 KB, 下載次數: 57)
下載附件
2018-12-21 15:28 上傳
單結晶體管構成晶閘管觸發電路 波形圖 用單結晶體管構成的晶閘管觸發電路如圖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;
}
|