2019-10-26 22:25:00 qiannianlaoyao2010 阅读数 450
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3997 人正在学习 去看看 朱有鹏

可控硅原理

可控硅主要用于交流电功率调节,通过调节导通角有效的控制输出波形的占空比起到控制输出功率的作用, 本文主要讲述如何通过单片机C语言控制可控硅功率从而实现对交流电灯的明暗度调节

基于STM32定时器实现的可控硅控制

这里我们采用stm32f103芯片作为控制芯片,最简单的我们使用系统滴答定时器就可实现对可控硅导通角的精准控制。
首先需要初始化滴答定时器。

SysTick_Config((uint32_t)90); //初始化计数值为90
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//初始化预分频因子为8分频

我们知道stm32f103系统主频为72Mhz,以上两句将72Mhz分频8倍后并初始化计数值为90,也就是设定为一个周期为:90/(72Mhz/8)=10us。
为什么要初始化成10us的周期呢?
因为在我国交流电常规频率是50hz,可调光器使用双向可控硅,即50hz在正弦波的正负区间均可导通,那么频率就是50hz*2=100hz,即周期为10ms,这样我们定时器以10us为单位,其分辨可调分辨率就是1000了。
由光耦MOC3023和BAT24-800B组成的可控硅控制电路,另外为了保证灯光在亮度为0时彻底关闭我们加入了继电器的控制
如下图:
双向可控硅电路

初始化控制所需GPIO,并宏定义

  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8| GPIO_Pin_9 | GPIO_Pin_14;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
#define   LIGHT1_H		GPIOB->BSRR|=(1<<6)
#define 	LIGHT1_L		GPIOB->BRR|=(1<<6)
#define   LIGHT2_H		GPIOB->BSRR|=(1<<7)
#define 	LIGHT2_L		GPIOB->BRR|=(1<<7)
#define   LIGHT3_H		GPIOB->BSRR|=(1<<8)
#define 	LIGHT3_L		GPIOB->BRR|=(1<<8)
#define   LIGHT4_H		GPIOB->BSRR|=(1<<9)
#define 	LIGHT4_L		GPIOB->BRR|=(1<<9)

初始化过零检测IO

50hz交流电过零检测电路

说明:如上图50hz交流电过零检测电路,采用一个外部中断(Zero_check_out)捕获交流电零点,这里采用stm32的GPIOB_15,对应外部中断线EXTI15_10,中断服务函数如下:

 void EXTI15_10_IRQHandler(void)
 {	       
     if(EXTI_GetITStatus(EXTI_Line15)!= RESET)
	   {
			 if(Light_count>=900) //因为过零时刻为每个周期的结尾时段,即计数值为1000左右,故判断Light_count计数是否大于900可防止意外干扰
			 {
				  LIGHT1_H;//拉高可控硅控制引脚即熄灭灯光,等待延时条件满足时在定时器中拉低并导通
				  LIGHT2_H;
				  LIGHT3_H;
				  LIGHT4_H;
				  Light_count=0; //计数值清零
			 }
          EXTI_ClearITPendingBit(EXTI_Line15);
		 }

}

定时器中断子函数

说明:
此中断函数主要用来控制可控硅导通延时时间起到亮度调节的作用
Light_value表示每通道的亮度值
LIGHT_L表示拉低对应可控硅控制IO,这时对应的可控硅导通,即灯光点亮
以1000为一个单位周期,那么1000-亮度值就是一个周期内非导通所占的周期时间

void SysTick_Handler(void)  //中断服务函数,每100us执行一次
{	
   	if(Light_count >= (1000-Light_value[0]))//通道1判断:当Light_count计数到大于等于非导通时间点亮可控硅
	{
		LIGHT1_L;
	}
	if(Light_count >= (1000-Light_value[1]))
	{
		LIGHT2_L;
	}
	if(Light_count >= (1000-Light_value[2]))
	{
		LIGHT3_L;
	}
	if(Light_count >= (1000-Light_value[3]))
	{
		LIGHT4_L;
	}
	Light_count++;//计数
}

实验

结语

可控硅调光明白其原理后控制起来很容易,本代码中只需要修改每个通道的Light_value(取值范围:0-1000,代表亮度值)即可改变实时显示的亮度值,根据自己的应用,在通信中实时的改变这个值变可灵活的运用到自己的产品中去。注:本产品已广泛的应用于工业及商业,物联网,智能家居等领域。

2019-07-03 14:55:19 weixin_44212493 阅读数 177
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3997 人正在学习 去看看 朱有鹏

有人托我做一个关于可控硅调光的毕业设计,我用51单片机做了一个,发出来和大家一起学习一下。

我用的是自己买的开发板上的52单片机, 晶振采用11.0592M, 光耦用了MOC3023 和P521-1两个 可控硅用的是BTA41 跟一块整流桥 电容用的是CBB 0.06μF 电阻那些由于我没有那么多 所以就找了相近值的 然后自己加了一个电源指示灯 和工作指示灯 按键我就直接修改成开发板上的独立按键。

通电调节过后那几个电阻发烫都挺严重的。 但过零检测那部分还是不大明白 之前我做了个点焊机根本没有过零检测 但是加了有脉冲宽度调节和电流调节。特别提醒各位爱好者在做的过程中千万要注意安全 检测检测再检测确认对了之后再通电 我也是在尝试中和大家共同进步。

先上实物图
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
原理图
在这里插入图片描述
C语言参考源代码

#include “reg52.h”

sbit lamp_pwm=P0^0;//可控硅位
sbit key0=P3^4;//降低亮度按键位
sbit key1=P3^5;//增加亮度按键位

unsigned int inc;

void INT0s()interrupt 0 using 0//INT0外部中断,过零检测触发
{
TR0=0;
if(!key0)//降低亮度
{
inc+=50;
if(inc>=8000)inc=8000;
}
if(!key1)//增加亮度
{
inc-=50;
if(inc<=800)inc=800;
}
TH0=(65536-inc)/256;
TL0=(65536-inc)%256;
TR0=1;
}

void timer1()interrupt 1 using 0//可控硅触发中断
{
unsigned char i;
lamp_pwm=0;//灯亮
for(i=0;i<2;i++);//延时2us
lamp_pwm=1;//灯灭
}

/STC不断电下载用******/
sfr ISP_DOWNS=0xe7;//ISP软复位地址
sbit ISP_SW=P3^0;//串口数据接收
void DebugDownISP()//软复位
{

鉴于篇幅限制,只能写部分代码,如需要完整代码请自行下载

最后,附上 所有设计技术文件,需要请自行下载,大家共同学习才能共同进步!

下载地址如下

链接:https://pan.baidu.com/s/1UoRMwhV9i3e4p-NzOGaVUQ 密码:x1uh

2018-11-21 11:12:46 zsk888 阅读数 5424
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3997 人正在学习 去看看 朱有鹏

 可控硅调光是目前比较成熟的调光电路,网络上随时都可以搜出很多中电路,而且还有程序。但是很多时候大家并没有真正理解其调光原理,下面详细说明可控硅调光电路中容易遇到的问题。

 

        使用光耦来驱动双向可控硅,是一个最基本的驱动电路,基本上没有人怀疑这个。那么是否可以使用任何型号的光耦都可以控制可控硅调光呢?

        答案是否定的,不同的光耦得到的现象区别却很大,一般来说,使用MOC3051或者MOC3052(驱动电流不同)等是没有问题的,可以开关也可以调光。但是如果使用MOC3061/62/63则是不可以的,虽然可以开关,但却不可以调光。原因是3063这一系列都是过零导通的,对交流电源的控制只能是对半波,而不能斩波,通常要调光,就需要通过控制导通角,来实现调光。

 

     对于可控硅来说,并不是随时都可以控制,而是必须要过零点后,给可控硅发送一个高电平,可控硅就可以打开了,当到下一个零点时可控硅自动关闭,所以,我们需要周期性的去控制可控硅打开。而调光的亮暗是通过调节与同步信号的延时时间,如果延时的实际越长,那么可控硅打开的时间越短,灯越暗;反之越亮。

2013-09-13 15:24:07 oTangTang1234567 阅读数 7558
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3997 人正在学习 去看看 朱有鹏

http://bbs.21ic.com/forum.php?mod=viewthread&tid=204808&page=1#pid1395110

这是从211C上找的两个电路图,电路还没分析,先留着以后备用。

2016-10-27 22:31:00 weixin_34216196 阅读数 121
  • 单片机控制第一个外设-LED灯-第1季第6部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第6个课程,主要讲解LED的工作原理和开发板原理图、实践编程等,通过学习目的是让大家学会给单片机编程控制LED灯,并且为进一步学习其他外设打好基础。

    3997 人正在学习 去看看 朱有鹏

可用于单片机控制可控硅电路中,可减小产品的体积和重量。……

单片机控制可控硅电路 - mme2003 - 明天眼睛的编程


为什么要分开用R1、R2、R3呢?都是串一起的,用一个电阻不行吗?

楼主做过零检测做什么用? 单片机控制可控硅电路 - mme2003 - 明天眼睛的编程

1、为了增加安全性
2、控制可控硅输出功率 

如果需要十分精准可以用电阻分压后用电压比较器 ,再过光耦
楼主是为了调相从而调功吧,如果不知道楼主在负载方面是如何的 单片机控制可控硅电路 - mme2003 - 明天眼睛的编程


后面的是通过单片机控制的可控硅,控制白炽灯的亮度 
/////////////////////
过零检测电路 
电阻参数通过验证,可用
单片机控制可控硅电路 - mme2003 - 明天眼睛的编程

//////////////////
我的硬件电路图:

引用
根据第5楼decai 的建议单片机控制可控硅电路 - mme2003 - 明天眼睛的编程


单片机控制可控硅电路 - mme2003 - 明天眼睛的编程
大家看看这个用LM358的电路做过零检测,AC0接51单片机的INT0非,下图来源http://bbs.mydigit.cn/read.php?tid=221794
单片机控制可控硅电路 - mme2003 - 明天眼睛的编程
看看我的程序吧,是这样的,就是用起来渐变时灯有些闪,还没找到原因:
原因找到了,原来是做过零检测的变压器接到了负载(白炽灯)之后了,造成中断信号受到干扰引起闪烁!!
程序上又稍改了一下时间参数,无级渐变,淡入淡出,见26楼视频效果,这个程序很给力:

引用
见第26楼xinqi99于2011-03-03 12:55发表的  :
视频效果(00:02:31) 单片机控制可控硅电路 - mme2003 - 明天眼睛的编程



#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ON 0
#define OFF 1
………………………………
void main()
{
    TMOD = 0x11;
    EA=1;
    TCON=0x05;
                  ………………
    for(;;)
    {
        DispInfo( );
        Display( );
        keyscan( );
    }
}

…………………………

void keyscan()
{
                       ……………………
    if(S1_num==0)
    {
        if (S2==0)
        mDelay(10);
        if (S2==0)
        if (K_Less30s>59)
        {
         LampGradual();
        }
    }
}
void LampGradual()
{
    Gradual=Lamp1;
    K_Less30s=0;               //按开关灯键间隔小于30秒标记及时长记录
    EX0=1;                     //开外部中断0
    ET0=1;
    TR0=1;
    ET1=1;                     //定时器1中断允许
    IT0=1;                       //INT0为下降沿触发(以前忘了这个,渐变时却不亮,呵呵)
    On_Init=7000;             //渐开定时触发初始化为10ms,并递减
    Off_Init=4000;            //渐关定时触发初始化为0ms,并递增
}


//  ********************************************************************
  void timer0() interrupt 1                //实时时钟中断程序
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    Time50ms++;
         if(Time50ms==20)                     //实时时钟走时累计
          {
              Time50ms=0;
              Sec++;
              if(K_Less30s<60) //|| OnTime==1 || OffTime==1           //***********按键后或定时时间到后开关灯*************
              {
                  K_Less30s++;
                  if(K_Less30s==30)                  //30秒后********
                  {
                      K_Less30s=60;                  //封闭渐开渐关操作,
                      Lamp1=~Gradual;
    EX0=0;                  //30秒后关中断
    ET1=0;                  //30秒后关定时器1
    ET0=0;
    TR0=0;
                  }
              }
            }
}


void INT0_AC0() interrupt 0        //外部中断0,AC过0时,50Hz交流电每秒过零100次,每次间隔10ms
{
    ET1=1;                           //定时器1中断允许
    TR1=0;                           //定时器1开始计时
    if(Gradual==OFF)                //渐开
    {
        --On_Init;              //On_Init-=2;         //每10ms
        a=(65536-On_Init)/256;  //定时初值
        b=(65536-On_Init)%256;
    }
    if(Gradual==ON)                //渐关
    {
        ++Off_Init;          //Off_Init+=2;
        a=(65536-Off_Init)/256;
        b=(65536-Off_Init)%256; //    
    }  //
    TH1=a;
    TL1=b;
    TR1=1;               //开始计时
}

void timer1() interrupt 3                //定时器1中断程序(灯渐变移相控制)
{
    uchar i;
    Lamp1=ON;                //灯1的触发脉冲
    {
    for(i=0;i<2;i++);      //延时 X μs
    Lamp1=OFF;
    }
}

////////////////
3063是过零打开的,没法调整导通角的,硬件上就不行了。个人建议还是换个光耦。

这个要选择3020系列的非过零检测的光耦,不过本人也不做硬件这类的,3020峰值电压400v不知道耐压够不,程序我不会写,可以给你个思路,自己写程序

你 要一个过零检测电路,一个可控硅触发电路,这个你应该不成问题了,程序上,一个半波10ms,你要几级调光就分把这个10ms分几份,不是等份哦,要不调 光不均匀的,你可以自己实验,我也说不上,每次单片机检测到过零信号后就在,如果你要开的是第几档,你就在花去前面几档的时间后给空空硅电路一个触发信 号,然后等下一个过零信号。

//////////////

过零检测电路图

发布: | 作者: | 来源: tianhaizhou | 查看:1598次 | 用户关注:

  如下图所示为按 上述思想设计的电压正向过零检测电路。220V的交流电首先经过电阻分压,然后进行光电耦合,假设输入的是A相电压,则在A相电压由负半周向正半周转换 时,图中三极管导通并工作在饱和状态,会产生一个下降沿脉冲送入ADμC812的INT0引脚使系统进入中断程序。微机系统进入中断程序后,发出采样命令 并从采样保持器读取无功电流值Iqm,这个无功电流即为A相的无功电流,经过1/4个周期电压达到最大值,此时对电压进行采样,得到UM,由

   如下图所示为按上述思想设计的电压正向过零检测电路。220V的交流电首先经过电阻分压,然后进行光电耦合,假设输入的是A相电压,则在A相电压由负半 周向正半周转换时,图中三极管导通并工作在饱和状态,会产生一个下降沿脉冲送入ADμC812的INT0引脚使系统进入中断程序。微机系统进入中断程序 后,发出采样命令并从采样保持器读取无功电流值Iqm,这个无功电流即为A相的无功电流,经过1/4个周期电压达到最大值,此时对电压进行采样,得到 UM,由UM=1.414U可以得到电压有效值U。

过零检测电路图

///////////////////
过零检测电路,如果需要十分精准可以用电阻分压后用电压比较器    
单片机控制可控硅电路 - mme2003 - 明天眼睛的编程 
过零的电阻只用一个100K很危险的,还是用两个50K比较好。功率耐压的问题。单片机控制可控硅电路 - mme2003 - 明天眼睛的编程
因为是双向触发所以频率有100hz哦,还行基本看不出闪

转载于:https://www.cnblogs.com/wanglinsheng/p/6005906.html

没有更多推荐了,返回首页