找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3510|回复: 12
收起左侧

怎么通过51单片机控制可控硅进行调压

[复制链接]
ID:815936 发表于 2021-9-28 09:51 来自手机 | 显示全部楼层 |阅读模式
通过过零检测脉冲用C语言编写一下程序,拜托大神们了
回复

使用道具 举报

ID:262 发表于 2021-9-28 15:34 | 显示全部楼层
51hei搜索框输入"可控硅 调"这5个字符, 看看大家都是怎么解决的, 大概也就有方向了
http://www.51hei.com/bbs/dpj-33291-1.html
http://www.51hei.com/bbs/dpj-132258-1.html
回复

使用道具 举报

ID:883242 发表于 2021-9-28 15:44 | 显示全部楼层
给什么东西调压???

如果给白炽灯等负载调压可以调导通角,如果给加热管调压可以控制脉冲个数以减小调角产生的电磁干扰。
回复

使用道具 举报

ID:815936 发表于 2021-9-28 15:49 来自手机 | 显示全部楼层
Hephaestus 发表于 2021-9-28 15:44
给什么东西调压???

如果给白炽灯等负载调压可以调导通角,如果给加热管调压可以控制脉冲个数以减小调 ...

给一个灯泡
回复

使用道具 举报

ID:883242 发表于 2021-9-28 17:01 | 显示全部楼层

先画出电路图来。
回复

使用道具 举报

ID:123289 发表于 2021-9-29 08:53 | 显示全部楼层
1、将过0脉冲引入外中断脚。
2、外中断发生后,起动一个计时器。
3、计时器到点后,向可控硅发出触发脉冲。
计时器的计时时间,就是触发角。调节它的大小,就可以调压了。
回复

使用道具 举报

ID:332444 发表于 2021-9-29 09:33 | 显示全部楼层
获取同步信号作为判断条件,任何IO检测得到这个信号即可,判断开始计时到时间触发可控硅即可,可调修改时间值即可,代码应该不难.
回复

使用道具 举报

ID:819198 发表于 2021-9-30 09:13 | 显示全部楼层
可以用专用光隔,MOC系列的。
回复

使用道具 举报

ID:819198 发表于 2021-9-30 10:10 | 显示全部楼层
31e4474b9c6fbbd3895aeafbb5a3cdad.jpeg
回复

使用道具 举报

ID:106977 发表于 2021-9-30 13:06 | 显示全部楼层
先学习可控硅触发和调压原理。如果你已经通晓单片机,问题就不难了。如果连单片机都不通,那就不是一时半会儿的事!
回复

使用道具 举报

ID:25058 发表于 2021-10-1 20:37 | 显示全部楼层
/*
        单片机白炽灯调光程序 (晶振:12MHz)
*/
#include "reg52.h"

sbit lamp_pwm=P1^0;//可控硅位
sbit key0=P1^1;//降低亮度按键位
sbit key1=P1^2;//增加亮度按键位
#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit LATCH1=P2^2;//定义锁存使能端口 段锁存
sbit LATCH2=P2^3;//                 位锁存
unsigned int inc;
unsigned char TempData[8]; //存储显示值的全局变量
unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码

void Display(unsigned char FirstBit,unsigned char Num);
void DelayUs2x(unsigned char t);//函数声明
void DelayMs(unsigned char t);

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<95;i++);//延时2us
        lamp_pwm=1;//灯灭
}

/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
while(t--)
{
     //大致延时1mS
     DelayUs2x(245);
         DelayUs2x(245);
}
}

/*------------------------------------------------
显示函数,用于动态扫描数码管
输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示
如输入0表示从第一个显示。
Num表示需要显示的位数,如需要显示99两位数值则该值输入2
------------------------------------------------*/
void Display(unsigned char FirstBit,unsigned char Num)
{
      unsigned char i;
          
          for(i=0;i<Num;i++)
           {
           DataPort=0;   //清空数据,防止有交替重影
       LATCH1=1;     //段锁存
       LATCH1=0;

       DataPort=dofly_WeiMa[i+FirstBit]; //取位码
       LATCH2=1;     //位锁存
       LATCH2=0;

       DataPort=TempData[i]; //取显示数据,段码
       LATCH1=1;     //段锁存
       LATCH1=0;
      
           DelayUs2x(200); // 扫描间隙延时,时间太长会闪烁,太短会造成重影

       }

}

void main()
{
        TMOD|=0x01;
        IT0=1;//INT0下降沿触发
        EX0=1;//外部中断允许
        ET0=1;
        EA=1;//开总中断
        inc=7400;
        lamp_pwm=1;
        key0=1;
        key1=1;
        while(1)
        {
                if(!key0)
                {
                        DelayMs(10);
                        if(!key0)
                        {
                                        while(!key0);
                                                {
                                                                inc+=50;
                                                        if(inc>=7400)
                                                                inc=7400;
                                                }
                        }               
                }
        if(!key1)
                {
                        DelayMs(10);
                        if(!key1)
                        {
                                        while(!key1);
                                                {
                                                                inc-=50;
                                                        if(inc<=100)
                                                                inc=100;
                                                }
                        }               
                }       

                 TempData[0]=dofly_DuanMa[inc/1000];
           TempData[1]=dofly_DuanMa[(inc%1000)/100];
           TempData[2]=dofly_DuanMa[((inc%1000)%100)/10];
           TempData[3]=dofly_DuanMa[((inc%1000)%100)%10];
           Display(2,4);
               
               
        }
}
已经试验通过了
回复

使用道具 举报

ID:420836 发表于 2021-10-2 08:12 | 显示全部楼层
楼上给了一个很好的控制可控硅过零检测的例子。
回复

使用道具 举报

ID:815936 发表于 2021-10-2 11:49 来自手机 | 显示全部楼层
liang1981 发表于 2021-10-1 20:37
/*
        单片机白炽灯调光程序 (晶振:12MHz)
*/

我试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表