51单片机是不是不能移相控制可控硅啊?
大师指点下吧,我被这个问题花了好多时间了。还是只能控制半波,电压在220V--110之间调,不能实现0-220V调,是怎么回事啊?50Hz交流周期为20ms,半波10ms,过0点做参考点一个周期有两个参考点,可控硅触发即通导,即使触发信号撤销也是通导,需过0关断,所以过0前必须撤销触发信号,一个周期触发两次,为了可以细调半周可细分50或100,所以定时器1ms太粗了。
而且0~220V可调做不到,采样电路二极管有通导电压,在二极管通导前采不到信号,触发脉冲还有宽度,再者是正弦波不是线性的,所以一般30V~220V。 liubeihua 发表于 2017-5-6 23:16
50Hz交流周期为20ms,半波10ms,过0点做参考点一个周期有两个参考点,可控硅触发即通导,即使触发信号撤销也 ...
嗯 1ms太短了的话 我可以在弄精细点,我的程序思路也是您说的思路,还是不能调压,只能调半波,感觉单片机在检测过零信号的时候,好像总是丢掉了一个过零触发信号似的。一个完整的交流周期应该有2个过零信号,但是感觉单片机只检测到一个,另一个丢了,,下面的电路我我板子的图,程序还是那个程序
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成,检测脉冲中断清定时器就可与交流同步,如果是AVR的话设成上下沿触发中断。
另外采样用光偶。 liubeihua 发表于 2017-5-6 23:16
50Hz交流周期为20ms,半波10ms,过0点做参考点一个周期有两个参考点,可控硅触发即通导,即使触发信号撤销也 ...
我在问一个问题:我那个交流过零电路是不是只能检测到正半波?我看其他过零电路,都是采用整流,是把交流的负半波给整上去,都在X轴上面, 是的,我跟你说的用光偶就是正半波光偶通导,负半波截止。如果用带上下沿中断的单片机比如AVR STM32 STM8 之类很容易,如果用51你就延时10ms生成另一个半波。 liubeihua 发表于 2017-5-8 09:28
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成 ...
我那串接5个电阻直接到INTO口作为过零检测怎么就成半波了?好疑问~~! 因为负半波不通你只能检测到正半波,没有什么疑问。你按时序分析一下画个图。就明白了。 liubeihua 发表于 2017-5-8 10:29
因为负半波不通你只能检测到正半波,没有什么疑问。你按时序分析一下画个图。就明白了。 ...
好的 知道了 我改过零检测电路。 相位检测
这话问的。。。任何带外中断和计数器的单片机都可以实现,简单功能啊。。。
十几年前用4位机都做过产品,还要功率计量。 coody 发表于 2017-5-8 13:57
这话问的。。。任何带外中断和计数器的单片机都可以实现,简单功能啊。。。
十几年前用4位机都做过产品,还 ...
嗯嗯~ 本帖最后由 周兆鹏 于 2017-5-8 16:27 编辑
liubeihua 发表于 2017-5-8 09:28
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成 ...
您看我分析的对不对啊:首先我们检测半波的话,那么按照您说的负半波用单片机来控制,我的理解和程序思路是这样的:见图,比如从0点正半波开始,这个时候,同时启动2个定时器,定时器1控制移相,比如定时1ms后,触发可控硅导通并且关掉定时器1(这个是正半波),同时也启动定时器2,定时器2在交流开始的时候,即正半波定时10ms,定时到10ms后,我们认为是负半波,再把刚才关掉的开定时器1打开,进行负半波移相,达到定时时间,则触发可控硅导通,如此循环下去。。。程序大概思路是这样。详细的就不叙述了。您看是我这样分析的吗? liubeihua 发表于 2017-5-8 10:29
因为负半波不通你只能检测到正半波,没有什么疑问。你按时序分析一下画个图。就明白了。 ...
行了行了行了!!!!!!我检测半波,过零检测电路任然没动,哈哈哈 哈哈哈 要不是您指点我恐怕还要一两天才能弄出来,原来我那个过零检测电路只是个半波,现在行了,谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢
liubeihua 发表于 2017-5-8 09:28
检测半波也是可以的,因为交流50Hz是交流电的重要参数,所以非常准,可以到50.00,所以另半周用定时器生成 ...
不对,那天太激动了,发现还是不对,错了错了,目前还是只能控制半波,您看下我程序上的一个说明。
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;
}
}
} 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;
}
} liubeihua 发表于 2017-5-10 17:59
void timer0() interrupt 1
{
TL0 = 0xA8; //设置定时初值
我用的是STC12C2052AD单片机,没有搞明白您的0XFD0XA8定时的时间是多少,是旁边注释的100us6MHZ的晶振吗? 我什么算都不等于 0XFD 0XA8 呀。然后我就按定时0.1ms,在你的程序基础上做了一点修改,下载后,测试还是只能控制半波,我的过零检测电路,没有用TLP521那个电路,还是我之前的220V接了几个电阻直接去的INT0口,所以不知道您的这种程序适合哪种过零检测电路?。。。。
啧啧啧 ,,
刚又不小心接错了电路烧了个元件,现在又要等几天元件回来才能测试了。。。任然期待您的解惑。。谢谢。
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,这是什么原因呢
这几天出了趟门以为你做好了。
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