打印

单片机控制moc3063驱动双向可控硅过零调功问题

[复制链接]
楼主: LKC134
手机看帖
扫描二维码
随时随地手机跟帖
41
LKC134|  楼主 | 2019-1-18 14:45 | 只看该作者 回帖奖励 |倒序浏览
原来光藕坏掉了,换新上去后,10MS的脉冲和5ms脉冲功率在47W与100W之前跳动,这也太不靠谱了。过零调功方式比调相稳定性差些。

使用特权

评论回复
评论
zyj9490 2019-1-18 17:05 回复TA
42
tyw| | 2019-1-18 15:14 | 只看该作者
LKC134 发表于 2019-1-18 14:45
原来光藕坏掉了,换新上去后,10MS的脉冲和5ms脉冲功率在47W与100W之前跳动,这也太不靠谱了。过零调功方式 ...

朋友帮帮好伐,调功不是你这么个玩的好不好.

使用特权

评论回复
43
LKC134|  楼主 | 2019-1-18 16:14 | 只看该作者
第一次搞这东东,只能用非过零光藕搞调相了,过EMC方面从硬件处理。

使用特权

评论回复
44
cjseng| | 2019-1-18 16:50 | 只看该作者
LKC134 发表于 2019-1-18 14:45
原来光藕坏掉了,换新上去后,10MS的脉冲和5ms脉冲功率在47W与100W之前跳动,这也太不靠谱了。过零调功方式 ...

你还是没搞清楚可控硅的控制方式,对于50Hz交流电来说,小于10ms的过零驱动脉冲没有意义。
最小脉宽要大于等于10ms才可以,其它脉宽要是10ms的整数倍。

使用特权

评论回复
45
LKC134|  楼主 | 2019-1-18 18:01 | 只看该作者
cjseng 发表于 2019-1-18 16:50
你还是没搞清楚可控硅的控制方式,对于50Hz交流电来说,小于10ms的过零驱动脉冲没有意义。
最小脉宽要大 ...

明白,在调试中。

使用特权

评论回复
46
你瞅啥| | 2019-1-18 19:11 | 只看该作者
碰巧了,类似楼主的问题我也遇到过,不过我是用触发变压器来控制可控硅的,不用调相而是靠调整半波的个数来进行负载功率的调整。其中部分代码回忆如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAX 100
#define CUR 17
int main(int argc, char **argv)
{
    uint8_t trigger_table[MAX];
    for(uint16_t i=0;i<CUR;i++){
        trigger_table[i]=MAX*i/CUR;
        printf("%d ",trigger_table[i]);
    }
}
MAX是含义是整个周期的半波个数,对于50Hz,100就是1秒的意思。CUR是当前想要设置的功率,17表示17/100=17%满功率。
输出结果是:0 5 11 17 23 29 35 41 47 52 58 64 70 76 82 88 94
也就是说在100个半波周期内,第0,5,11,17,23……个半波内让输出有效。
根据后续的控制代码的不同,也可以这么写,生成一个100个成员的表格,内容是0表示可控硅不导通,内容是1表示可控硅导通。
    for(uint16_t i=0;i<MAX;i++)trigger_table[i]=0;
    for(uint16_t i=0;i<CUR;i++)trigger_table[MAX*i/CUR]=1;


当然我是个有强迫症的人,上面的代码对于阻性负载没问题,但是对于感性负载有问题,比如上面17这个结果,如果前面连续输出17,每个控制周期内正半周的半波个数会比负半周多一个,时间长了变压器这样的感性负载会出现偏励磁问题,所以MAX不能用偶数,用奇数可以解决这个问题,当然实践中我用的是质数,哈哈哈。

使用特权

评论回复
47
你瞅啥| | 2019-1-18 19:33 | 只看该作者
本帖最后由 你瞅啥 于 2019-1-18 20:28 编辑
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define MAX 173
#define CUR 23
int main(int argc, char **argv)
{
    uint32_t trigger_table[MAX];
    for(uint16_t i=0;i<MAX;i++)trigger_table[i]=0;
    for(uint16_t i=0;i<CUR;i++)trigger_table[MAX*i/CUR]=(MAX*i/CUR)%2?1:-1;
    for(uint16_t i=0;i<MAX;i++)printf("%d,",trigger_table[i]);
}


测试了一下,MAX取173,CUR取23,执行exe重定向到csv文件,然后excel打开生成图表,还挺好看的:

使用特权

评论回复
48
chunyang| | 2019-1-18 20:19 | 只看该作者
过零触发调功就是断续供电,但没个交流波形都是完整的,这样就避免了调相法产生的干扰。电烙铁的热惯性很大,很适合用过零调功。具体可以10个完整交流周期为单位进行控制,这样就是十挡,需要更细的调功,可以增加单位完整交流周期数,比如以20个为单位。当然此法是开环的,如果需要快速升温并对烙铁头进行温控,那就要引入温度传感器和控制算法,但基本控制单位仍是一个完整的交流周期。

使用特权

评论回复
49
LKC134|  楼主 | 2019-1-18 20:57 | 只看该作者
受教了,消化下先,多谢!

使用特权

评论回复
50
LKC134|  楼主 | 2019-1-18 21:01 | 只看该作者
chunyang 发表于 2019-1-18 20:19
过零触发调功就是断续供电,但没个交流波形都是完整的,这样就避免了调相法产生的干扰。电烙铁的热惯性很大 ...

用过零光藕触发,控制端信号频率有要求不?

使用特权

评论回复
51
你瞅啥| | 2019-1-18 21:07 | 只看该作者
LKC134 发表于 2019-1-18 21:01
用过零光藕触发,控制端信号频率有要求不?

要毛频率?可控硅给个1us 7V脉冲就通了,一直到下次电流过零为止,你给任何信号都不可能控制可控硅。

使用特权

评论回复
52
cjseng| | 2019-1-18 21:12 | 只看该作者
LKC134 发表于 2019-1-18 21:01
用过零光藕触发,控制端信号频率有要求不?

你何必一直纠结于频率呢?
简单地说:假设你的电烙铁功率是100W,如果你通电0.1秒,断电9.9秒,那么功率就是1W;如果通电1秒,断电9秒,功率就是10W;通电9秒,断电1秒,功率就是90W。。。。。
如果你要算频率,那么这个频率就是0.1Hz。
10秒周期会不会太长,取决于电烙铁的热惯性,你可以改成5秒,2秒,1秒。。。。
对应的频率就是0.1Hz,0.2Hz,0.5Hz,1Hz。。。。

使用特权

评论回复
53
cjseng| | 2019-1-18 21:18 | 只看该作者
由于电网频率是波动的,那么对过零点来计数最好不过了,比如100个过零点为一个周期,就是1秒,第一个过零点时输出导通信号,第二个过零点关闭直到100个过零点,那么功率就是1/100电烙铁功率;如果第一个过零点导通,直到第11个过零点关闭,并且关闭到第100个过零点,功率就是10/100电烙铁功率。
这是简单的办法,如果你把导通的时间均匀打散到100个过零点里,那样的话效果更好。
如果你把打散的导通信号均匀分布在100个过零点里,且正负半波对称,那就是极好的。

使用特权

评论回复
评分
参与人数 1威望 +15 收起 理由
tyw + 15 赞一个!快言快语.
54
LKC134|  楼主 | 2019-1-18 21:44 | 只看该作者
cjseng 发表于 2019-1-18 21:18
由于电网频率是波动的,那么对过零点来计数最好不过了,比如100个过零点为一个周期,就是1秒,第一个过零点 ...

谢谢!直接驱动可控硅是可以,但要用过零检测并计数又校正发送个数脉冲,本人初次接触程序显得有些复杂了,原理逻辑上说得有条理,实际要写出来就有些困难(当然对那些高手就另外了),想使用简单点方案做的,先一步步来,一下要做复杂些的就消化不了。公司就本人搞电子连硬件都要搞。没同行沟通交流所以在一些论坛交流下。

使用特权

评论回复
55
cjseng| | 2019-1-18 22:05 | 只看该作者
void ext0() interrupt  0        //外中断0
{
if(num<set) out=ON;                //set取值0-100,脉冲计数小于设定值时,可控硅导通
else        out=OFF;                //脉冲计数大于等于设定值时,可控硅关断
num++;                            //脉冲计数加1
if(num>=100);               
{
  num=0;
}
}

使用特权

评论回复
56
LKC134|  楼主 | 2019-1-19 09:16 | 只看该作者
cjseng 发表于 2019-1-18 22:05
void ext0() interrupt  0        //外中断0
{
if(num=100);               

下面是之前的程序,用来调占空比移相的,但只能调50-100%(47W-100W),现在要求从25W-100W).分七档功率。
void int0() interrupt 1
{
TL0=0X9C;//100us
TH0=0XFF;
num++;
if(num>=100)
num=0;
if(flag==1)
{
PWM=0;
flag=0;
}
if(num<LD)//LD是亮度变量uchar LD
{
  PWM=1;
flag=1;
}
}
void ext0()  interrupt 0  //外中断
{
  IE0=0;
  flag=1;//bit flag
  PWM=1;
  num=0;
  TR0=1;
}

使用特权

评论回复
57
你瞅啥| | 2019-1-19 09:32 | 只看该作者
本帖最后由 tyw 于 2019-1-19 10:11 编辑

https://bbs.21ic.com/forum.php?mod=attachment&aid=MTE2OTI3OHw1NmExY2FjMmE5NjBjZGYxMjBiOGZhM2Q3NjUzZjUzYXwxNzMyMzg3OTEw&request=yes&_f=.pdfattach://1169276.pdfhttps://bbs.21ic.com/forum.php?mod=attachment&aid=MTE2OTI3NHwyNzEwN2QwNjRlOTdmMjk1ODhkNTYxOWI4NTI2YTBiZHwxNzMyMzg3OTEw&request=yes&_f=.pdf

triac_trig.CD00266635.pdf

315.8 KB

Triac_trig_AN958.pdf

188.39 KB

Triac_trig_DRM010.pdf

1.39 MB

triac_trigAN10496.pdf

296.27 KB

使用特权

评论回复
评论
R2D2 2019-7-12 19:22 回复TA
这几篇pdf很好。 
58
你瞅啥| | 2019-1-19 09:38 | 只看该作者
本帖最后由 tyw 于 2019-1-19 10:14 编辑


https://bbs.21ic.com/forum.php?mo ... request=yes&_f=.pdf

使用特权

评论回复
59
LKC134|  楼主 | 2019-1-19 10:54 | 只看该作者
谢谢楼上朋友的资料。

使用特权

评论回复
60
你瞅啥| | 2019-1-19 16:18 | 只看该作者
LKC134 发表于 2019-1-19 09:16
下面是之前的程序,用来调占空比移相的,但只能调50-100%(47W-100W),现在要求从25W-100W).分七档功率。
...

你的外部中断是从哪里来的?PWM这个信号又到哪里去?方便的话上电路图。

使用特权

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

本版积分规则