打印

可控硅调功率

[复制链接]
楼主: cl234583745
手机看帖
扫描二维码
随时随地手机跟帖
21
cl234583745|  楼主 | 2014-10-21 11:11 | 只看该作者 回帖奖励 |倒序浏览
rainword 发表于 2014-10-21 10:18
说的简单点,都是再电流过零点关断是最好的,加热器是阻性负载,所以电流和电压同步,不需要移相,马达是 ...

还是不知道啥是移相

使用特权

评论回复
22
tyw| | 2014-10-21 13:00 | 只看该作者
本帖最后由 tyw 于 2014-10-21 13:16 编辑
cl234583745 发表于 2014-10-21 08:59
今天早晨我想明白了 的确是丢波了 他就间歇的停  原因是没有同步。那这个叫移相触发吧?过零呢?还是不太 ...


调功,调相都需检测过零信号来作为同步信号,过零同步信号双向采样时周期为10ms.单向采样时周期为20ms.
调功是过零后让可控硅全导通,控制1秒内通过的正弦波个数(20ms一个完整波形),以此控制负载的平均功率.
调相是过零后滞后几ms再触发,所以不是完整正弦波,通过控制滞后量来控制正弦波的残缺程度,以此控制负载电压.
简单说,调功是全导通控制,调相是半导通控制.
ok,再不明白就自已到门角落里打pp.哈哈,有时间去啃点书回回炉吧.





使用特权

评论回复
23
cl234583745|  楼主 | 2014-10-21 13:05 | 只看该作者
tyw 发表于 2014-10-21 13:00
调功,调相都需检测过零信号
调功是过零后让可控硅全导通,控制1秒内通过的正弦波个数(20ms一个完整波形), ...

恩这2个明白了。就是所谓的 丢波 和斩波。
还没有说过零触发呢?跟调相什么区别

下面的那个手册我也有  编程就是模拟那个过程

使用特权

评论回复
24
tyw| | 2014-10-21 13:25 | 只看该作者
本帖最后由 tyw 于 2014-10-21 13:27 编辑
cl234583745 发表于 2014-10-21 13:05
恩这2个明白了。就是所谓的 丢波 和斩波。
还没有说过零触发呢?跟调相什么区别


过零触发是为了捕捉每一帧正弦波的起始点,0相角,以此来同步对每帧波的处理.
这个处理在调相法中为滞后定时的开始时刻.
在调功 法中为控制每秒导通时间长度的起始时刻.
之所以采用过零,是因为0相角时电压幅值最小,引起的干扰最小.

使用特权

评论回复
25
车彦锋| | 2014-10-21 13:43 | 只看该作者

使用特权

评论回复
26
chunyang| | 2014-10-21 14:54 | 只看该作者
本帖最后由 chunyang 于 2014-10-21 14:56 编辑
cl234583745 发表于 2014-10-21 09:01
的确,我还是对过零和移相的具体区别概念不够深入。过程都是0点后延迟导通吗?区别呢 ...


当然不是。
调相不是过零就触发,而是根据需要延时触发,这样负载得到的交流波形不是完整的,只是一个“半周期”内的一部分。
过零触发就是一过零就触发,负载得到的是完整交流半周期波形。但可以通过是否准许过零触发来决定负载得到的功率积。这更像PWM,事实上也是特殊的PWM即PWM波必须是交流半周期的整数倍。

使用特权

评论回复
27
cl234583745|  楼主 | 2014-10-22 09:37 | 只看该作者
本帖最后由 cl234583745 于 2014-10-22 09:47 编辑
tyw 发表于 2014-10-21 13:25
过零触发是为了捕捉每一帧正弦波的起始点,0相角,以此来同步对每帧波的处理.
这个处理在调相法中为滞后定 ...

大哥 还是要求助你了。身边的人都不会。你要是有c语言的 我看看大概就容易明白了。
我用逻辑分析仪获得的单片机发送的数据。
0通道:过零触发
1通道:加热管不同温度37.40.43.46.50度
2通道:电机低转速

问题1:1通道加热发送的数据怎么杂乱无序呢?我改怎么发呢?好像也不是调功啊
问题2:2通道电机调相,若用万用表测负载电压应该是小于220v的一个数值吧?
问题3:最后2个图片是我自己做的效果图。电机低速就是照着发送一个周期10ms 大概50%的波形,先低后高和先高后低有区别吗?。问题是过零触发信号为什么前后都有抖动呢,怎么办呢(倒是没有影响中断)

50.png (61.83 KB )

50.png

46.png (54.21 KB )

46.png

43.png (53.8 KB )

43.png

40.png (58.54 KB )

40.png

37.png (54.45 KB )

37.png

2.png (46.14 KB )

2.png

1.png (47.19 KB )

1.png

使用特权

评论回复
28
rainword| | 2014-10-22 10:23 | 只看该作者
问题一:波形不是杂乱的,是因为要控制温度,加入了控温算法PID后,输出的波形。
问题二:万用表测得结果是RMS值;
问题三:这个信号顺序肯定是有区别的,要看你的可控硅工作在哪两个象限哦;

使用特权

评论回复
29
cl234583745|  楼主 | 2014-10-22 11:01 | 只看该作者
rainword 发表于 2014-10-22 10:23
问题一:波形不是杂乱的,是因为要控制温度,加入了控温算法PID后,输出的波形。
问题二:万用表测得结果是 ...

1.光耦二极管单片机这次就是输入01 可以简单的理解就是要输入不同的波形后就能达到不同的控制效果了吧。我先百度下控温pid算法怎么回事.
2.有效电压 电机全速时候220v  低速时候大约160v
3.过零触发信号有抖动怎么办怎么回事造成的呢?如图6.7(最后2个)
谢谢

使用特权

评论回复
30
cl234583745|  楼主 | 2014-10-22 11:15 | 只看该作者
rainword 发表于 2014-10-22 10:23
问题一:波形不是杂乱的,是因为要控制温度,加入了控温算法PID后,输出的波形。
问题二:万用表测得结果是 ...

控温算法PID  好像很复杂呀  怎么回事呀:funk:

使用特权

评论回复
31
tyw| | 2014-10-22 12:47 | 只看该作者
本帖最后由 tyw 于 2014-10-22 13:14 编辑
cl234583745 发表于 2014-10-22 09:37
大哥 还是要求助你了。身边的人都不会。你要是有c语言的 我看看大概就容易明白了。
我用逻辑分析仪获得的 ...


MCS-51单片机温度控制系统设计.pdf (7.49 MB)
基于MCS-51单片机温度控制系统设计报告.pdf (2.21 MB)
单片机控制可控硅.pdf (1.06 MB)
基于TCA785移相触发器控制双向可控硅电路原理.pdf (961.76 KB)

使用特权

评论回复
32
cl234583745|  楼主 | 2014-10-22 15:48 | 只看该作者
tyw 发表于 2014-10-22 12:47


使用特权

评论回复
33
duxingkei| | 2014-10-22 21:47 | 只看该作者
这是好资料啊,基本理解2中控制方法了

使用特权

评论回复
34
cl234583745|  楼主 | 2014-10-23 08:44 | 只看该作者
本帖最后由 cl234583745 于 2014-10-23 08:52 编辑
tyw 发表于 2014-10-22 12:47

请问pid算法计算出来占空比后,输出pwm,周期多久呢10ms?20ms?
我看到一个程序好像100ms
/******************************
     PWM波输出的定时中断
*******************************/
void  timer1() interrupt 3
{
        if(++count<=(hightime))
                pwm=0;
        else if(count<=100)
        {
                pwm=1;
        }
        else
                count=0;
        TH1=0x3c;
        TL1=0xb0;
}

使用特权

评论回复
35
cl234583745|  楼主 | 2014-10-23 08:50 | 只看该作者
本帖最后由 cl234583745 于 2014-10-23 08:56 编辑
cl234583745 发表于 2014-10-23 08:44
请问pid算法计算出来占空比后,输出pwm,周期多久呢10ms?20ms?
我看到一个程序定时器50ms 最大50*100=5s ...
Pid_init  里面这些数据能反映什么呢
#define N0 40536
#define nop() _nop_()

/*程序中变量 数组定义*/
uchar idata table[]={"Real-time Temp:"};//第一行显示"Real-time Temp:"
uchar idata table1[5];
uchar data1,kp,ki,kd;               
uint t,hightime,count;         //占空比调节参数
uint rltemp,settemp=350;
int e1,e2,e3,duk,uk;

/*引脚定义*/
sbit EOC=P2^6;
sbit OE=P2^5;
sbit START=P2^7;
sbit lcden=P3^2;
sbit lcdrw=P3^1;
sbit lcdrs=P3^0;
sbit pwm=P3^3;


/******************************
      定时器初始化
*******************************/
void time_init()               
{
        EA = 1;
        ET0 = 1;
        ET1 = 1;
        TR0 = 1;
        TR1 = 1;
        TMOD = 0x11;
    TH0 = N0/256;
    TL0 = N0%256;
        TH1 = 0X3C;
        TL1 = 0XB0;        
}
/******************************
     PID算法系数装载
*******************************/
void Pid_init()
{
        hightime= 0;
        e1 = 0;
        e2 = 0;
        e3 = 0;
        kp = 10;
        ki = 5;
        kd = 5;        
}

/******************************
     温度比较  PID算法
*******************************/
void pid_ys()
{
        if(rltemp<settemp)         //        如果实际温度小于设定值
        {
                if(settemp-rltemp>20) // 如果相差2度
                {
                        hightime=100;                //全速加热
                }
                else                                   //否则运行PID算法进行平滑加热
                {                                          
                        e1 = settemp-rltemp;
                        duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))/10;
                        uk = uk+duk;
                        if(uk>100)
                        uk = 100;
                        else if(uk<-100)
                        uk = -100;
                        if(uk<0)
                        {
                                hightime=-uk;
                        }
                        else
                        {
                                hightime=uk;
                        }
                        e3 = e2;
                        e2 = e1;        
                }
        }
        if(rltemp>=settemp)        //        如果实际温度大于设定值
        {
                if(rltemp-settemp>0)  //只要实际温度与设定值有偏差
                {
                        hightime=0;                  //停止加热
                }
                else                                  //其他情况运行PID算法,但参数与前面的刚好相反
                {
                        e1 = rltemp-settemp;
                        duk=(kp*(e1-e2)+ki*e1+kd*(e1-e2*2+e3))/10;
                        uk = uk+duk;
                        if(uk>100)
                        uk = 100;
                        else if(uk<-100)
                        uk = -100;
                        if(uk<0)
                        {
                                hightime=100-(-uk);
                        }
                        else
                        {
                                hightime=100-uk;
                        }
                        e3 = e2;
                        e2 = e1;        
                }
        }
        
}

/******************************
           主函数
*******************************/
void main()
{
    uint i;
        time_init();//定时器初始化
        Pid_init();        // PID初始化
        lcd_init();        // LCD初始化
        table1[5]=0x43;        
        table1[4]=0xdf;
        table1[2]=0x2e;        //小数点 摄氏度符号ASCII码
    for(i=0;i<15;i++)  //带循环第一行显示"Real-time Temp:"
    {                                
                write_data(table);
                delay(20);
        }
        while(1)
        {
            t=data1*196/100;
                table1[3]=(t%100)%10+0x30;        
                table1[1]=(t%100)/10+0x30;
                table1[0]=t/100+0x30; //以上温度数据转化
                rltemp = t;         //给PID算法装载实际值
            write_com(0x80+0x45);//写LCD第二行的初地址
                for(i=0;i<5;i++) //该循环显示温度值
                {
                        write_data(table1);
                        delay(20);
                }
                pid_ys();//运行温度比较 PID算法
        }
}
/******************************
   温度采集转换的定时中断
     0.5s刷新一次数据
*******************************/
void  timer0() interrupt 1
{
    uint j;
        j++;
        if(j==20)
        {
                OE = 0;
                START = 0;
                _nop_();
                START = 1;
                _nop_();        
                START = 0;  
                while(EOC==0);        
                OE = 1;        
                _nop_();
                data1 = P0;
                _nop_();
                OE = 0;
                j = 0;
    }
    TH0=N0/256;
    TL0=N0%256;
}        
/******************************
     PWM波输出的定时中断
*******************************/
void  timer1() interrupt 3
{
        if(++count<=(hightime))
                pwm=0;
        else if(count<=100)
        {
                pwm=1;
        }
        else
                count=0;
        TH1=0x3c;
        TL1=0xb0;
}

使用特权

评论回复
36
cl234583745|  楼主 | 2014-10-23 09:52 | 只看该作者
tyw 发表于 2014-10-22 12:47

请问pid算法计算出来占空比后,输出pwm,周期多久呢10ms?20ms?
我看到一个程序好像100ms
/******************************
     PWM波输出的定时中断
*******************************/
void  timer1() interrupt 3
{
        if(++count<=(hightime))
                pwm=0;
        else if(count<=100)
        {
                pwm=1;
        }
        else
                count=0;
        TH1=0x3c;
        TL1=0xb0;
}

使用特权

评论回复
37
tyw| | 2014-10-23 11:46 | 只看该作者
cl234583745 发表于 2014-10-23 09:52
请问pid算法计算出来占空比后,输出pwm,周期多久呢10ms?20ms?
我看到一个程序好像100ms
/************ ...

你的pwm必须与过零脉冲同步才行,否则就会失步丢波.
所以不能简单套用pwm控制方式.
其实就是用一个I/O来模拟一个控制波形.方法前面讲得很详细了.
玛哀搞德,太吃力了.沙度.

使用特权

评论回复
38
rainword| | 2014-10-24 08:14 | 只看该作者
cl234583745 发表于 2014-10-22 11:15
控温算法PID  好像很复杂呀  怎么回事呀

你先把硬件控制原理弄明白,算法可以后面在研究,PID是精确控温的一种算法,你闲弄懂PID 的硕学模型就可以了。

使用特权

评论回复
39
rainword| | 2014-10-24 08:15 | 只看该作者
你先把硬件控制原理弄明白,算法可以后面在研究,PID是精确控温的一种算法,你先弄懂PID 的数学模型就可以了再说。

使用特权

评论回复
40
cl234583745|  楼主 | 2014-10-24 08:45 | 只看该作者
rainword 发表于 2014-10-24 08:15
你先把硬件控制原理弄明白,算法可以后面在研究,PID是精确控温的一种算法,你先弄懂PID 的数学模型就可以 ...

我的不要求多高精度的,+-2度都行。只要求加热到37 40 43 46 50这几个温度并保持就行了

使用特权

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

本版积分规则