正源 发表于 2024-12-5 23:26:49

单片机过零检测控制可控硅导通角

想用32G单片机过零检测进行可控硅导通角的控制。能不能输入捕获过零检测方波,然后移相输出pwm波形。怎么实现这个功能,求助大家,感谢。

晓飛飛 发表于 2024-12-5 23:44:35

把你要输出的波形和220V市电的波形相位对照图画一下,你现在的描述不太好理解要做成什么样子。

CyberHamster 发表于 2024-12-6 02:41:46

2016年做的
#include <STC15F2K60S2.H>
#include <STC15F2K60S2.H>
#include <intrins.h>
#define                PHASE_A                P54
#define                PHASE_B                P55
#define                BUTTON                P15
#define                IN                        P32
#define                OUT                        P33
bit Power;
unsigned char Value;
unsigned int Time;

/*----------------------------延时10us@STC-Y5@24MHz----------------------------*/
void Delay_10us(void)
{
      unsigned char i;
      _nop_();
      _nop_();
      i=57;
      while(--i);
}

/*----------------------------延时x10us----------------------------*/
void Delay_x10us(unsigned char x)
{
      while(x--)
                Delay_10us();
}

void Clear_Display(void)
{
      //清屏函数略
}

void Display(unsigned char x,unsigned char brightness)
{
      //显示函数略
}

void Encoder_Scan(void)
{
      //编码器函数略
      if(/*略*/)
      {
                Value--;
                if(Value>100)
                        Value=0;
      }
      if(/*略*/)
      {
                Value++;
                if(Value>100)
                        Value=100;
      }
}

void Key_Scan(void)
{
      static bit Key_Flag;
      if(BUTTON==0)
      {
                if(Key_Flag==1)
                {
                        Key_Flag=0;
                        Power=~Power;
                }
      }
      else
                Key_Flag=1;
}

void Init(void)
{
      Clear_Display();
      TMOD=0x01;
      IT0=1;
      EX0=1;
      ET0=1;
      EA=1;
      Power=1;
      Value=0;
      Time=15000;
}

void main(void)
{
      Init();
      while(1)
      {
                Key_Scan();
                if(Power)
                {
                        Display(Value,5);
                        Encoder_Scan();
                        Time=15000-150*Value;
                }
      }
}

void INT0(void) interrupt 0
{
      TR0=0;
      TH0=(0xffff-Time)/256;
      TL0=(0xffff-Time)%256;
      TR0=1;
}

void Timer0(void) interrupt 1
{
      if(Power)
      {
                OUT=0;
                Delay_x10us(2);
                OUT=1;
      }
      else
                OUT=1;
}实物:




参考:

外部中断+定时器,软件查理复用数码管,软件编码器,简单粗暴

小坤 发表于 2024-12-6 08:40:12

CyberHamster 发表于 2024-12-6 02:41
2016年做的
实物:



优化后的过零检测电路!(data/attachment/forum/202412/06/083933mh99bqppeffg9nji.png "1.png")

a阿德 发表于 2024-12-6 09:08:06

我是这样实现的,一个过零信号接入外部中断IO口,然后使用定时器来控制可控硅开关。当检测到过零信号后打开可控硅,再次检测到过零前给个关信号,关闭可控硅,(可控硅特性只能通过降低电流到维持电流以下或反向电压来关断,不会自动关)。这样就是全开,如果你要控制功率,就是检测到过零信号后,使用定时器延时一段时间后再打开可控硅,再次检测到过零前给个关信号,关闭可控硅。通过延时的时间长短可以控制功率。这种方式俗称斩波。

CyberHamster 发表于 2024-12-6 12:31:38

a阿德 发表于 2024-12-6 09:08
我是这样实现的,一个过零信号接入外部中断IO口,然后使用定时器来控制可控硅开关。当检测到过零信号后 ...

我是导通后20μs立即关,就给个触发脉冲,过零时候它自己就关了

a阿德 发表于 2024-12-6 14:21:48

CyberHamster 发表于 2024-12-6 12:31
我是导通后20μs立即关,就给个触发脉冲,过零时候它自己就关了

开完立马关,反正都不会关的,等到下一个零点才会关。但感觉太快关,总感觉不太好

WHX 发表于 2024-12-6 19:57:11

<p>可控硅过零早就有过零检测光耦【如MOC3063】可用,成熟可靠,纯硬件。只需MCU来控制其开关即可,不必绕来绕去的再用MCU来检测过零点,到了零点可控硅自己即会关闭。</p>

飞捷 发表于 2024-12-7 10:49:10

WHX 发表于 2024-12-6 19:57
可控硅过零早就有过零检测光耦【如MOC3063】可用,成熟可靠,纯硬件。只需MCU来控制其开关即可,不必绕来绕 ...

过零检测更多的时候是用来斩波的

正源 发表于 2024-12-7 21:46:55

CyberHamster 发表于 2024-12-6 02:41
2016年做的
实物:



十分感谢,我这边是斩波控制风机电压,控制功率,变相控制风速。需要过零检测后,控制导通角,每个半波都需要进行控制,所以输出的可以是50hz的pwm波就行。就是启动的瞬间需要过零点移相。看教学视频里面有个移相输出,有这个功能的话,调速的时候就不需要时刻进中断 了,只需要调整移相的角度就可以了。
页: [1] 2 3
查看完整版本: 单片机过零检测控制可控硅导通角