周兆鹏 发表于 2017-5-6 20:48

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

大师指点下吧,我被这个问题花了好多时间了。还是只能控制半波,电压在220V--110之间调,不能实现0-220V调,是怎么回事啊?

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的话设成上下沿触发中断。
另外采样用光偶。

周兆鹏 发表于 2017-5-8 09:30

liubeihua 发表于 2017-5-6 23:16
50Hz交流周期为20ms,半波10ms,过0点做参考点一个周期有两个参考点,可控硅触发即通导,即使触发信号撤销也 ...

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

liubeihua 发表于 2017-5-8 10:02

是的,我跟你说的用光偶就是正半波光偶通导,负半波截止。如果用带上下沿中断的单片机比如AVR STM32 STM8 之类很容易,如果用51你就延时10ms生成另一个半波。

周兆鹏 发表于 2017-5-8 10:03

liubeihua 发表于 2017-5-8 09:28
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成 ...

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

liubeihua 发表于 2017-5-8 10:29

因为负半波不通你只能检测到正半波,没有什么疑问。你按时序分析一下画个图。就明白了。

周兆鹏 发表于 2017-5-8 10:31

liubeihua 发表于 2017-5-8 10:29
因为负半波不通你只能检测到正半波,没有什么疑问。你按时序分析一下画个图。就明白了。 ...

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

liubeihua 发表于 2017-5-8 10:44

相位检测

coody 发表于 2017-5-8 13:57

这话问的。。。任何带外中断和计数器的单片机都可以实现,简单功能啊。。。
十几年前用4位机都做过产品,还要功率计量。

周兆鹏 发表于 2017-5-8 15:24

coody 发表于 2017-5-8 13:57
这话问的。。。任何带外中断和计数器的单片机都可以实现,简单功能啊。。。
十几年前用4位机都做过产品,还 ...

嗯嗯~

周兆鹏 发表于 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打开,进行负半波移相,达到定时时间,则触发可控硅导通,如此循环下去。。。程序大概思路是这样。详细的就不叙述了。您看是我这样分析的吗?

周兆鹏 发表于 2017-5-8 17:23

liubeihua 发表于 2017-5-8 10:29
因为负半波不通你只能检测到正半波,没有什么疑问。你按时序分析一下画个图。就明白了。 ...

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

周兆鹏 发表于 2017-5-10 08:47

liubeihua 发表于 2017-5-8 09:28
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成 ...

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

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;
                }
        }
}

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;
        }
}

周兆鹏 发表于 2017-5-11 21:15

liubeihua 发表于 2017-5-10 17:59
void timer0() interrupt 1
{
        TL0 = 0xA8;                //设置定时初值


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

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

周兆鹏 发表于 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 uintunsigned 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,这是什么原因呢

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)软件里的定时器计算器生成的
页: [1] 2
查看完整版本: 51单片机是不是不能移相控制可控硅啊?