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

[复制链接]
17319|76
 楼主| LKC134 发表于 2019-1-18 14:45 | 显示全部楼层
原来光藕坏掉了,换新上去后,10MS的脉冲和5ms脉冲功率在47W与100W之前跳动,这也太不靠谱了。过零调功方式比调相稳定性差些。

评论

发表于 2019-1-18 17:05
tyw 发表于 2019-1-18 15:14 | 显示全部楼层
LKC134 发表于 2019-1-18 14:45
原来光藕坏掉了,换新上去后,10MS的脉冲和5ms脉冲功率在47W与100W之前跳动,这也太不靠谱了。过零调功方式 ...

朋友帮帮好伐,调功不是你这么个玩的好不好.
 楼主| LKC134 发表于 2019-1-18 16:14 | 显示全部楼层
第一次搞这东东,只能用非过零光藕搞调相了,过EMC方面从硬件处理。
cjseng 发表于 2019-1-18 16:50 | 显示全部楼层
LKC134 发表于 2019-1-18 14:45
原来光藕坏掉了,换新上去后,10MS的脉冲和5ms脉冲功率在47W与100W之前跳动,这也太不靠谱了。过零调功方式 ...

你还是没搞清楚可控硅的控制方式,对于50Hz交流电来说,小于10ms的过零驱动脉冲没有意义。
最小脉宽要大于等于10ms才可以,其它脉宽要是10ms的整数倍。
 楼主| LKC134 发表于 2019-1-18 18:01 | 显示全部楼层
cjseng 发表于 2019-1-18 16:50
你还是没搞清楚可控硅的控制方式,对于50Hz交流电来说,小于10ms的过零驱动脉冲没有意义。
最小脉宽要大 ...

明白,在调试中。
你瞅啥 发表于 2019-1-18 19:11 | 显示全部楼层
碰巧了,类似楼主的问题我也遇到过,不过我是用触发变压器来控制可控硅的,不用调相而是靠调整半波的个数来进行负载功率的调整。其中部分代码回忆如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #define MAX 100
  5. #define CUR 17
  6. int main(int argc, char **argv)
  7. {
  8.     uint8_t trigger_table[MAX];
  9.     for(uint16_t i=0;i<CUR;i++){
  10.         trigger_table[i]=MAX*i/CUR;
  11.         printf("%d ",trigger_table[i]);
  12.     }
  13. }
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表示可控硅导通。
  1.     for(uint16_t i=0;i<MAX;i++)trigger_table[i]=0;
  2.     for(uint16_t i=0;i<CUR;i++)trigger_table[MAX*i/CUR]=1;


当然我是个有强迫症的人,上面的代码对于阻性负载没问题,但是对于感性负载有问题,比如上面17这个结果,如果前面连续输出17,每个控制周期内正半周的半波个数会比负半周多一个,时间长了变压器这样的感性负载会出现偏励磁问题,所以MAX不能用偶数,用奇数可以解决这个问题,当然实践中我用的是质数,哈哈哈。
你瞅啥 发表于 2019-1-18 19:33 | 显示全部楼层
本帖最后由 你瞅啥 于 2019-1-18 20:28 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #define MAX 173
  5. #define CUR 23
  6. int main(int argc, char **argv)
  7. {
  8.     uint32_t trigger_table[MAX];
  9.     for(uint16_t i=0;i<MAX;i++)trigger_table[i]=0;
  10.     for(uint16_t i=0;i<CUR;i++)trigger_table[MAX*i/CUR]=(MAX*i/CUR)%2?1:-1;
  11.     for(uint16_t i=0;i<MAX;i++)printf("%d,",trigger_table[i]);
  12. }


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
chunyang 发表于 2019-1-18 20:19 | 显示全部楼层
过零触发调功就是断续供电,但没个交流波形都是完整的,这样就避免了调相法产生的干扰。电烙铁的热惯性很大,很适合用过零调功。具体可以10个完整交流周期为单位进行控制,这样就是十挡,需要更细的调功,可以增加单位完整交流周期数,比如以20个为单位。当然此法是开环的,如果需要快速升温并对烙铁头进行温控,那就要引入温度传感器和控制算法,但基本控制单位仍是一个完整的交流周期。
 楼主| LKC134 发表于 2019-1-18 20:57 | 显示全部楼层
受教了,消化下先,多谢!
 楼主| LKC134 发表于 2019-1-18 21:01 | 显示全部楼层
chunyang 发表于 2019-1-18 20:19
过零触发调功就是断续供电,但没个交流波形都是完整的,这样就避免了调相法产生的干扰。电烙铁的热惯性很大 ...

用过零光藕触发,控制端信号频率有要求不?
你瞅啥 发表于 2019-1-18 21:07 | 显示全部楼层
LKC134 发表于 2019-1-18 21:01
用过零光藕触发,控制端信号频率有要求不?

要毛频率?可控硅给个1us 7V脉冲就通了,一直到下次电流过零为止,你给任何信号都不可能控制可控硅。
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。。。。
cjseng 发表于 2019-1-18 21:18 | 显示全部楼层
由于电网频率是波动的,那么对过零点来计数最好不过了,比如100个过零点为一个周期,就是1秒,第一个过零点时输出导通信号,第二个过零点关闭直到100个过零点,那么功率就是1/100电烙铁功率;如果第一个过零点导通,直到第11个过零点关闭,并且关闭到第100个过零点,功率就是10/100电烙铁功率。
这是简单的办法,如果你把导通的时间均匀打散到100个过零点里,那样的话效果更好。
如果你把打散的导通信号均匀分布在100个过零点里,且正负半波对称,那就是极好的。

评分

参与人数 1威望 +15 收起 理由
tyw + 15 赞一个!快言快语.

查看全部评分

 楼主| LKC134 发表于 2019-1-18 21:44 | 显示全部楼层
cjseng 发表于 2019-1-18 21:18
由于电网频率是波动的,那么对过零点来计数最好不过了,比如100个过零点为一个周期,就是1秒,第一个过零点 ...

谢谢!直接驱动可控硅是可以,但要用过零检测并计数又校正发送个数脉冲,本人初次接触程序显得有些复杂了,原理逻辑上说得有条理,实际要写出来就有些困难(当然对那些高手就另外了),想使用简单点方案做的,先一步步来,一下要做复杂些的就消化不了。公司就本人搞电子连硬件都要搞。没同行沟通交流所以在一些论坛交流下。
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;
}
}
 楼主| 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;
}
你瞅啥 发表于 2019-1-19 09:32 | 显示全部楼层
本帖最后由 tyw 于 2019-1-19 10:11 编辑

https://bbs.21ic.com/forum.php?mod=attachment&aid=MTE2OTI3OHw0Nzg4MzJjMnwxNzU5NzAwNDg5fDB8://1169276.pdfhttps://bbs.21ic.com/forum.php?mod=attachment&aid=MTE2OTI3NHxlNTQzMGE3ZnwxNzU5NzAwNDg5fDB8

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

这几篇pdf很好。  发表于 2019-7-12 19:22
你瞅啥 发表于 2019-1-19 09:38 | 显示全部楼层
本帖最后由 tyw 于 2019-1-19 10:14 编辑


https://bbs.21ic.com/forum.php?mo ... request=yes&_f=.pdf
 楼主| LKC134 发表于 2019-1-19 10:54 | 显示全部楼层
谢谢楼上朋友的资料。
你瞅啥 发表于 2019-1-19 16:18 | 显示全部楼层
LKC134 发表于 2019-1-19 09:16
下面是之前的程序,用来调占空比移相的,但只能调50-100%(47W-100W),现在要求从25W-100W).分七档功率。
...

你的外部中断是从哪里来的?PWM这个信号又到哪里去?方便的话上电路图。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部