单片机可控硅调光器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qiannianlaoyao2010/article/details/102762015

可控硅原理

可控硅主要用于交流电功率调节,通过调节导通角有效的控制输出波形的占空比起到控制输出功率的作用, 本文主要讲述如何通过单片机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,代表亮度值)即可改变实时显示的亮度值,根据自己的应用,在通信中实时的改变这个值变可灵活的运用到自己的产品中去。注:本产品已广泛的应用于工业及商业,物联网,智能家居等领域。

猜你喜欢

转载自blog.csdn.net/qiannianlaoyao2010/article/details/102762015