标题:
单片机可控硅移相调压程序和电路原理图 光耦过零检测
[打印本页]
作者:
51hei圆圆
时间:
2023-10-27 01:48
标题:
单片机可控硅移相调压程序和电路原理图 光耦过零检测
电路原理图如下,左边是由光耦组成的过零检测电路:
51hei.png
(213.1 KB, 下载次数: 32)
下载附件
2023-10-27 01:47 上传
单片机源程序如下(多路可控硅移相调压)程序注释很详细:
#include <STC15F2K60S2.H> //STC15系列单片机头文件都是这个。
#define uchar unsigned char
#define uint unsigned int
#include <STC15F2K60S2.H>
#define MAIN_Fosc 24000000UL //定义主时钟
uchar num=0; //对可控硅移相角控制
uchar jishuqi=0; //记录中断次数,有软起动作用,值不电输出电压不变
uchar sec1=0;
uchar sec10=0;
uchar sec100=0;
uchar sec1000=0;
sbit cdqd=P3^3;//启动充电信号0开1关
sbit fdqd=P3^4;//启动放电信号0开1关
//sbit cdr=P3^5;//充电停止信号 1关,0开
sbit fd=P3^7;//充电可控硅通断 0:放电 1:关闭
sbit pwm1=P3^5;//放电可控硅位通 0导通,1关闭
sbit pwm2=P3^6;//放电可控硅位通 0导通,1关闭
// sbit led=P1^0; 实验板指示灯
sbit led=P1^2;
sbit cf=P1^0;
unsigned char i;
unsigned int ms;
void delay_ms( ms);
/////////////主程序
void main()
{ cdqd=1;
fd=1;
pwm1=1;
cf=1;
//初始化
TMOD=0x01;
// TL0 = 0xa6; //设置定时初始值 0.1ms
// TH0 = 0xFf; //设置定时初始值
// TL0 = 0x4a; //设置定时初始值0.2ms
// TH0 = 0xFf; //设置定时初始值
// TL0 = 0x91; //设置定时初始值0.4ms
// TH0 = 0xFe; //设置定时初始值
// TL0 = 0x38; //设置定时初始值0.5ms
// TH0 = 0xFe; //设置定时初始值
TL0 = 0x9c; //设置定时初始值 0.1ms
TH0 = 0xFf; //设置定时初始值
// TL0 = 0x68; //设置定时初始值 1ms
//TH0 = 0xFC; //设置定时初始值
EA=0;
ET0=1;
EX0=1;
IT0=0;//必须设外部中断触发方式为上升沿下降沿同时触发。STC最新15系列单片机外部中断INT0口有上下沿同时触发功能
pwm1=1;
pwm2=1;
led=1;
// EA=1;
// TR0=1;
while(1){
while(cdqd==0){EA=1; } //充电启动
// if(cdqd==0){EA=1; cf=0; } //充电启动
jishuqi=0;
if(cdqd==1){EA=0; jishuqi=0; } //充电关闭
if(fdqd==0){jishuqi=0; fd=0; for(i=0;i<3;i++); fd=1; for(i=0;i<3;i++); }//放电延时2us};
// fd=1;
// if(cf==0) {
////////////////////////////////////////
// delay_ms(500);
led=~led;
// pwm=0;
// delay_ms(500);
// pwm=1;
// led=0;
// }
/////////////////////////////////////////////
}
}
//延时程序
void delay_ms(ms)
{
unsigned int i;
do{
i = 200;
while(--i) ; //14T per loop
}while(--ms);
}
void Timer0Init(void) //1000微秒@24.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x40; //设置定时初始值
TH0 = 0xA2; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
//1毫秒定时器中断程序
void t0() interrupt 1
{
unsigned char i;
TL0=0x9c;
TH0=0xff; //1haomiandingshi
// TL0 = 0xa6; //设置定时初始值 0.1ms
// TH0 = 0xFf; //设置定时初始值
// TL0 = 0x4a; //设置定时初始值0.2ms
// TH0 = 0xFf; //设置定时初始值
// TL0 = 0x91; //设置定时初始值0.4ms
// TH0 = 0xFe; //设置定时初始值
// TL0 = 0x38; //设置定时初始值0.5ms
// TH0 = 0xFe; //设置定时初始值
// TL0 = 0x9c; //设置定时初始值 0.1ms
// TH0 = 0xFf; //设置定时初始值
// led=~led;
// pwm=~pwm;
num++;
// jishuqi=8; 固定电压输出
// if(jishuqi>4) {jishuqi=5; if(cdqd==0){}} //全导通
//jishuqi=4;
//第一个半波
if(jishuqi==1){
if(num==75) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
{
TR0=0;
pwm1=0; //触发MOC3021导通,即触发可控硅导通
pwm2=0; //触发MOC3021导通,即触发可控硅导通
for(i=0;i<2;i++);//延时2us
pwm1=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
pwm2=1; //触发MOC3021导通,即触发可控硅导通
num=0; //清零变量
// led=~led; //验证指示LED
//led=0;
}
} //
if(jishuqi==2){
if(num==70) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
{
TR0=0;
pwm1=0; //触发MOC3021导通,即触发可控硅导通
pwm2=0; //触发MOC3021导通,即触发可控硅导通
for(i=0;i<2;i++);//延时2us
pwm1=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
pwm2=1; //触发MOC3021导通,即触发可控硅导通
num=0; //清零变量
// led=~led; //验证指示LED
//led=0;
}
} //
if(jishuqi==3){
if(num==65) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
{
TR0=0;
pwm1=0; //触发MOC3021导通,即触发可控硅导通
pwm2=0; //触发MOC3021导通,即触发可控硅导通
for(i=0;i<2;i++);//延时2us
pwm1=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
pwm2=1; //触发MOC3021导通,即触发可控硅导通
num=0; //清零变量
//led=~led; //验证指示LED
//led=0;
}
} //
if(jishuqi==4){
if(num==60) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
{
TR0=0;
pwm1=0; //触发MOC3021导通,即触发可控硅导通
pwm2=0; //触发MOC3021导通,即触发可控硅导通
for(i=0;i<2;i++);//延时2us
pwm1=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
pwm2=1; //触发MOC3021导通,即触发可控硅导通
num=0; //清零变量
// led=~led; //验证指示LED
//led=0;
}
} //
if(jishuqi>=5){
if(num==50) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
{
TR0=0;
pwm1=0; //触发MOC3021导通,即触发可控硅导通
pwm2=0; //触发MOC3021导通,即触发可控硅导通
for(i=0;i<2;i++);//延时2us
pwm1=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
pwm2=1; //触发MOC3021导通,即触发可控硅导通
num=0; //清零变量
// led=~led; //验证指示LED
//led=0;
}
} //
if(jishuqi==6){
if(num==40) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
{
TR0=0;
pwm1=0; //触发MOC3021导通,即触发可控硅导通
pwm2=0; //触发MOC3021导通,即触发可控硅导通
for(i=0;i<2;i++);//延时2us
pwm1=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
pwm2=1; //触发MOC3021导通,即触发可控硅导通
num=0; //清零变量
// led=~led; //验证指示LED
//led=0;
}
} //
if(jishuqi==7){
if(num==30) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
{
TR0=0;
pwm1=0; //触发MOC3021导通,即触发可控硅导通
pwm2=0; //触发MOC3021导通,即触发可控硅导通
for(i=0;i<2;i++);//延时2us
pwm1=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
pwm2=1; //触发MOC3021导通,即触发可控硅导通
num=0; //清零变量
// led=~led; //验证指示LED
//led=0;
}
} //
if(jishuqi==8){
if(num==20) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
{
TR0=0;
pwm1=0; //触发MOC3021导通,即触发可控硅导通
pwm2=0; //触发MOC3021导通,即触发可控硅导通
for(i=0;i<2;i++);//延时2us
pwm1=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
pwm2=1; //触发MOC3021导通,即触发可控硅导通
num=0; //清零变量
// led=~led; //验证指示LED
//led=0;
}
} //
if(jishuqi>=9){
if(num==60) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
{
TR0=0;
pwm1=0; //触发MOC3021导通,即触发可控硅导通
pwm2=0; //触发MOC3021导通,即触发可控硅导通
for(i=0;i<2;i++);//延时2us
pwm1=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
pwm2=1; //触发MOC3021导通,即触发可控硅导通
num=0; //清零变量 if(jish
// led=~led; //验证指示LED
//led=0;
}
} //
//第二个半波
// if(jishuqi>=10){
// if(num==5) //延时1毫秒导通,改变num的值即可改变移相触发时间,即改变负载功率大小。num的范围:0<num<10
// {
// TR0=0;
// pwm=0; //触发MOC3021导通,即触发可控硅导通
// for(i=0;i<2;i++);//延时2us
// pwm=1; //延时2us之后,关掉脉冲输出,因为可控硅在非过零点情况下触发信号丢失,会继续保持导通。
// num=0; //清零变量
// led=~led; //验证指示LED
//led=0;
// }
// } //
//第二个半波
//第10和大于10个半波
// pwm=1;
//if(num==7){led=~led;}
// led=~led; //验证指示LED
//10MS计时器
// if(sec1>=10) {sec1=0;sec10++;}
// if(sec10>=10) {sec10=0;sec100++;}
// if(sec100>=10) {sec100=0;sec1000++;}
// if(sec1000>=8) {sec100=0;sec1000++;}
}
//中断程序
void ex0() interrupt 0
{
IE0=0;
num=0;
// jishuqi++; //软起过程的半波个数
TR0=1; //交流过零点的时候,清楚标志、计数变量并启动定时器。 /
// cf=0;
sec1++;
if(sec1>=10){sec1=0;jishuqi++;} //sec可以改移相角导通时间
//jishuqi=1;
if(jishuqi>=7){jishuqi=7;} //sec可以改移相角导通时间
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1