打印
[51单片机]

51单片机是不是不能移相控制可控硅啊?

[复制链接]
2203|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
liubeihua| | 2017-5-6 23:16 | 只看该作者
50Hz交流周期为20ms,半波10ms,过0点做参考点一个周期有两个参考点,可控硅触发即通导,即使触发信号撤销也是通导,需过0关断,所以过0前必须撤销触发信号,一个周期触发两次,为了可以细调半周可细分50或100,所以定时器1ms太粗了。
而且0~220V可调做不到,采样电路二极管有通导电压,在二极管通导前采不到信号,触发脉冲还有宽度,再者是正弦波不是线性的,所以一般30V~220V。

使用特权

评论回复
板凳
周兆鹏|  楼主 | 2017-5-8 08:45 | 只看该作者
liubeihua 发表于 2017-5-6 23:16
50Hz交流周期为20ms,半波10ms,过0点做参考点一个周期有两个参考点,可控硅触发即通导,即使触发信号撤销也 ...

嗯 1ms太短了的话 我可以在弄精细点,我的程序思路也是您说的思路,还是不能调压,只能调半波,感觉单片机在检测过零信号的时候,好像总是丢掉了一个过零触发信号似的。一个完整的交流周期应该有2个过零信号,但是感觉单片机只检测到一个,另一个丢了,,下面的电路我我板子的图,程序还是那个程序

使用特权

评论回复
地板
liubeihua| | 2017-5-8 09:28 | 只看该作者
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成,检测脉冲中断清定时器就可与交流同步,如果是AVR的话设成上下沿触发中断。
另外采样用光偶。

使用特权

评论回复
5
周兆鹏|  楼主 | 2017-5-8 09:30 | 只看该作者
liubeihua 发表于 2017-5-6 23:16
50Hz交流周期为20ms,半波10ms,过0点做参考点一个周期有两个参考点,可控硅触发即通导,即使触发信号撤销也 ...

我在问一个问题:我那个交流过零电路是不是只能检测到正半波?我看其他过零电路,都是采用整流,是把交流的负半波给整上去,都在X轴上面,

使用特权

评论回复
6
liubeihua| | 2017-5-8 10:02 | 只看该作者
是的,我跟你说的用光偶就是正半波光偶通导,负半波截止。如果用带上下沿中断的单片机比如AVR STM32 STM8 之类很容易,如果用51你就延时10ms生成另一个半波。

使用特权

评论回复
7
周兆鹏|  楼主 | 2017-5-8 10:03 | 只看该作者
liubeihua 发表于 2017-5-8 09:28
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成 ...

我那串接5个电阻直接到INTO口作为过零检测怎么就成半波了?好疑问~~!

使用特权

评论回复
8
liubeihua| | 2017-5-8 10:29 | 只看该作者
因为负半波不通你只能检测到正半波,没有什么疑问。你按时序分析一下画个图。就明白了。

使用特权

评论回复
9
周兆鹏|  楼主 | 2017-5-8 10:31 | 只看该作者
liubeihua 发表于 2017-5-8 10:29
因为负半波不通你只能检测到正半波,没有什么疑问。你按时序分析一下画个图。就明白了。 ...

好的 知道了   我改过零检测电路。

使用特权

评论回复
10
liubeihua| | 2017-5-8 10:44 | 只看该作者
相位检测

捕获1.PNG (25.36 KB )

相位检测

相位检测

使用特权

评论回复
11
coody| | 2017-5-8 13:57 | 只看该作者
这话问的。。。任何带外中断和计数器的单片机都可以实现,简单功能啊。。。
十几年前用4位机都做过产品,还要功率计量。

使用特权

评论回复
12
周兆鹏|  楼主 | 2017-5-8 15:24 | 只看该作者
coody 发表于 2017-5-8 13:57
这话问的。。。任何带外中断和计数器的单片机都可以实现,简单功能啊。。。
十几年前用4位机都做过产品,还 ...

嗯嗯~

使用特权

评论回复
13
周兆鹏|  楼主 | 2017-5-8 16:15 | 只看该作者
本帖最后由 周兆鹏 于 2017-5-8 16:27 编辑
liubeihua 发表于 2017-5-8 09:28
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成 ...

您看我分析的对不对啊:首先我们检测半波的话,那么按照您说的负半波用单片机来控制,我的理解和程序思路是这样的:见图,比如从0点正半波开始,这个时候,同时启动2个定时器,定时器1控制移相,比如定时1ms后,触发可控硅导通并且关掉定时器1(这个是正半波),同时也启动定时器2,定时器2在交流开始的时候,即正半波定时10ms,定时到10ms后,我们认为是负半波,再把刚才关掉的开定时器1打开,进行负半波移相,达到定时时间,则触发可控硅导通,如此循环下去。。。程序大概思路是这样。详细的就不叙述了。您看是我这样分析的吗?

使用特权

评论回复
14
周兆鹏|  楼主 | 2017-5-8 17:23 | 只看该作者
liubeihua 发表于 2017-5-8 10:29
因为负半波不通你只能检测到正半波,没有什么疑问。你按时序分析一下画个图。就明白了。 ...

行了行了行了!!!!!!我检测半波,过零检测电路任然没动,哈哈哈 哈哈哈 要不是您指点我恐怕还要一两天才能弄出来,原来我那个过零检测电路只是个半波,现在行了,谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢

12312321.jpg (254.4 KB )

12312321.jpg

使用特权

评论回复
15
周兆鹏|  楼主 | 2017-5-10 08:47 | 只看该作者
liubeihua 发表于 2017-5-8 09:28
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成 ...

不对,那天太激动了,发现还是不对,错了错了,目前还是只能控制半波,您看下我程序上的一个说明。

QQ截图20170510083959.jpg (340.95 KB )

QQ截图20170510083959.jpg

1.jpg (195.28 KB )

1.jpg

QQ截图20170510084405.jpg (307.42 KB )

QQ截图20170510084405.jpg

使用特权

评论回复
16
liubeihua| | 2017-5-10 17:49 | 只看该作者
sbit trigger=0;                        //触发标志
uchar num0=0,num1=0;

void Timer0Init(void)                //100微秒@6.000MHz rc震荡在烧芯片时由STC-ISP下载程序设置
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xA8;                //设置定时初值
        TH0 = 0xFD;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

void timer0() interrupt 1
{
        TL0 = 0xA8;                //设置定时初值
        TH0 = 0xFD;                //设置定时初值
        num0++;
        num1++;
        if(num1>99)                上半周时间到
                num0=0;
        if(trigger)                //触发用脉冲就可以了 (用num=10来关断是不可靠的,因为RC震荡不准,过了0点再关关不断
        {        pwm=0;
                trigger=0;
        }
}

void ext0() interrupt 0
{
        IE0=0;
        num0=0;                        //同步交流脉冲
        num1=0;                        //同步交流脉冲
}


void main()
{
        Init...
        while(1)
        {
                if(num0=aa)        //aa触发时间 0~100
                {
                        pwm=1;
                        trigger=1;
                }
        }
}

使用特权

评论回复
17
liubeihua| | 2017-5-10 17:59 | 只看该作者
void timer0() interrupt 1
{
        TL0 = 0xA8;                //设置定时初值
        TH0 = 0xFD;                //设置定时初值
        num0++;
        num1++;
        if(num1>99)                上半周时间到
                num0=0;
        if(trigger)                //触发用脉冲就可以了 (用num=10来关断是不可靠的,因为RC震荡不准,过了0点再关关不断
        {        pwm=0;
                trigger=0;
        }

        //放在中断里比较好
        if(num0=aa)        //aa触发时间 0~100
        {
                pwm=1;
                trigger=1;
        }
}

使用特权

评论回复
18
周兆鹏|  楼主 | 2017-5-11 21:15 | 只看该作者
liubeihua 发表于 2017-5-10 17:59
void timer0() interrupt 1
{
        TL0 = 0xA8;                //设置定时初值

我用的是STC12C2052AD单片机,没有搞明白您的0XFD  0XA8定时的时间是多少,是旁边注释的100us  6MHZ的晶振吗? 我什么算都不等于 0XFD 0XA8 呀。然后我就按定时0.1ms,在你的程序基础上做了一点修改,下载后,测试还是只能控制半波,我的过零检测电路,没有用TLP521那个电路,还是我之前的220V接了几个电阻直接去的INT0口,所以不知道您的这种程序适合哪种过零检测电路?。。。。

啧啧啧 ,,
刚又不小心接错了电路烧了个元件,现在又要等几天元件回来才能测试了。。。任然期待您的解惑。。谢谢。

使用特权

评论回复
19
周兆鹏|  楼主 | 2017-5-13 21:37 | 只看该作者
liubeihua 发表于 2017-5-10 17:59
void timer0() interrupt 1
{
        TL0 = 0xA8;                //设置定时初值

#include <STC12C2052AD.H> //用的是STC12系列单片机
#define uchar unsigned char                     
#define uint  unsigned int
uchar num=0,num1=100;
sbit pwm=P1^7; //触发三极管控制脚
sbit k1=P3^7;
unsigned char i;
bit trigger=0;

void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}
void main()
{

TMOD=0x01;
TH0=0xFF;//定时0.1ms
TL0=0x9C;
EA=1;   //开总中断
EX0=1;   //开外部0中断
ET0=1;   //开定时器中断
pwm=0;   //初始输出0,三极管截止,可控硅不导通.
k1=1;
// TR0=1;
// IT0=1;//INT0下降沿触发
while(1);  
}
void timer0() interrupt 1
{
  TH0=0xFF; //定时0.1ms
  TL0=0x9C;
  num++;
  if(num==50)
  {
  pwm=1;
  for(i=0;i<5;i++);//延时2us
  pwm=0;
  }
  if(num>99)
  {
   num=0;
  }           
}

void ext0() interrupt 0 //过零检测、外部中断
{
  IE0=0;     //清楚中断标志位
  num=0;
  TR0=1;
}

我是这么写的,少用一个num1,我觉得可以省掉,现在的情况是,灯泡端电压只有100V ,还有微弱的闪烁感,也可以从0-220调,但是感觉怪怪的,不像我用TLP521做过零检测电路那样,一点不闪,而且电压还是110V,这是什么原因呢

使用特权

评论回复
20
liubeihua| | 2017-5-14 20:09 | 只看该作者
这几天出了趟门以为你做好了。
void Timer0Init(void)                //100微秒@6.000MHz rc震荡在烧芯片时由STC-ISP下载程序设置
{
        AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xA8;                //设置定时初值
        TH0 = 0xFD;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}
这一段是STC-ISP(V6.85)软件里的定时器计算器生成的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

35

帖子

2

粉丝