原创 [原创]电机调速

2008-1-14 14:20 7467 8 21 分类: MCU/ 嵌入式

利用上一篇的过零检测电路,过零信号接51单片机外部中断1(下降沿触发),单片机延时触发可控硅导通实现调速。


点击看大图


点击看大图


*感谢郭隆红网友帮我找出错误


点击看大图


部分程序:


/*********************************************************************
函数名称: void ISR_Int1OverZeroDetect() interrupt IE1_VECTOR             
函数功能: 外部中断1过零信号捕获中断服务程序                
入口参数:                      
返回  值:                                
*********************************************************************/
 void ISR_Int1OverZeroDetect() interrupt IE1_VECTOR
{   
  switch(g_uchWindSpeed)//设置定时器延时
 {
  case 0:
  {
   TH1 = (65536 - 1800) / 256;                         
      TL1 = (65536 - 1800) % 256;     
   break;
  }
  case 1:
  {
   TH1 = (65536 - 6000) / 256;                         
      TL1 = (65536 - 6000) % 256; 
   break;
  }
  case 2:
  {
   TH1 = (65536 - 7000) / 256;                         
      TL1 = (65536 - 7000) % 256; 
   break;
  }
  }
 TR1 = 1; // 启动定时器1


/*********************************************************************
函数名称: void ISR_Timer1TriacsTrigger() interrupt TF1_VECTOR            
函数功能: 定时器0触发可控硅中断服务程序               
入口参数:                       
返回  值:                                
*********************************************************************/
void ISR_Timer1TriacsTrigger() interrupt TF1_VECTOR
{
  TH1 = 0xFF; //定时器0延时200                        
    TL1 = 0x38;
 if(g_bTirggerFlag)
    {
  P2_5 = 1;
        g_bTirggerFlag = 0;
        TR1 = 0; // 关闭定时器0
    }
    else
    {
  P2_5 = 0;
        g_bTirggerFlag = 1;
    }
}


/*********************************************************************
函数名称: void Init_System(void)               
函数功能: 系统初始化                  
入口参数:                      
返回  值:                                
*********************************************************************/ 
void System_Init(void)
{  
 TMOD = 0x11; //定时器0,1工作模式1, 16位定时方式


 ET1 = 1; //使能定时器1溢出中断
 EX0 = 1;
 IT0 = 1;
 EX1 = 0; //外部中断1禁止
 IT1 = 1; //外部中断1下降沿触发中断
  EA = 1; //全局中断使能
}

文章评论13条评论)

登录后参与讨论

用户1553569 2009-10-21 00:49

这里有代码,看视频应该是可以的,不过是调光的http://www.51hei.com/mcu/694.html

用户1079511 2009-4-7 09:20

你说的"超调"我不太理解是什么意思,调整的角度是根据你延时触发的时间决定的,可控硅触发导通后,只能在相位改变时也就是过零时会自动关闭,跟调整的先后又有什么关系呢。另外调整可控硅的导通角就是斩波调速,这个你可通过示波器观察的到,全速的时候是个完整的正弦波,速度越低波形越不完整。 PID我不太懂,没法回答你的问题!

用户184440 2009-4-1 11:53

你好,这部分我看懂了。谢谢你的指导 现在有个新的问题,可控硅调速的缺点是一旦导通角导通,不能再关断,直到电压过零点,这样的话会引起比较大的超调,是么?那现在改用斩波控制去改变输出电压的平均值,这样的话可以减小电机启动的时候的超调量。那么,斩波控制的触发信号是PWM脉冲。根据频率不变的原则我们控制pwm的占空比,从而控制导通时间,最终实现控制输出电压的平均值。设定这个占空比其实原理和可控硅的导通时间一样,以往,很多人采用PID控制,模糊控制以及一些PID基础上改进的算法,如模糊PID、自适应PID等等设定单片机里面计数器的预装值,从而适时的改变触发点,调节速度。PID控制,模糊控制这些都是不需要精确的数学模型的基础上应用的控制手法。现在我用的通用电机的数学模型可以确定,那么我可以采用最少拍无纹波控制的手段,使得在最少的采样周期内实现无静差的稳态。我的问题是最少拍无纹波控制器的设计过程我看明白了,就是通过对被控对象的传递函数保持器的传递函数以及闭环脉冲的传递函数的计算,最终得出E(z)的表达式,从而确定几拍后实现完全跟踪输入信号。采用这个方案来解决问题的话,应用到通用电机上,具体的输入是什么?最终这个控制器的输出又是什么?比如说原来采用模糊控制,输入就是误差以及误差的变化量,输出就是调节可控硅的导通角的时间控制量。那么最少拍这个对应的输入输出是什么呢?我的理解是输入应该是理想的速度值,输出应该是N个采样周期后实现无静差的稳态的N是多少。这样理解对么? 希望能得到您的指点。 再次表示感谢!

用户1079511 2009-3-24 10:36

你提供的电路图是3021驱动可控硅电路,那个与门并不是必须的单路,你只要用单片机的信号控制光耦右侧导通就可以驱动双相可控硅了。图上之所以加74ls00目的是在2、4口都为高电平的时候才会输出低电平从而控制3021右侧导通,用不用74ls00要根据自身的需要。 过零检测电路的作用是检测过零点,并输出触发信号给单片机处理,单片机接收到信号后,延时相应的时间来输出控制信号,触发可控硅导通。延时时间的长短决定了正弦波的完整程度,从而改变输出电压的平均值,达到调速目的。 你贴的图只是控制可控硅的打开和关断,不能调速! 再有不明白的发邮件。

用户184440 2009-3-23 22:26

感谢您的回复 我可能说的不够明白。过零检测电路输出100HZ,5V的触发信号,输入到单片机的INT1中,下降沿触发,中断响应以后,T0控制P1.3口输出可控硅的触发信号(今天问了老师),接到那个图的右边第四个接口中。第二个口通过一个电阻接地,那么与门上面那个输入始终是低,那么要想光耦导通,与门的下面的输入也要为低,这样的话双向可控硅的触发信号是什么呢?可控硅是电流触发吧,应该是个瞬时大电流脉冲,这样的话与门打不开啊? 另外,过零检测电路的作用是单纯的输出INT1的触发信号么?双向可控硅要设定导通角,必须识别电压零点,这个是不是也是过零检测电路实现的呢?另外,导通角是如何设定呢?给T0中提前装入一个值么?还是怎么控制,这点不是很清楚。双向可控硅输出的波形又是什么呢?断续的正弦波么?我贴出的那个电路只是实现了控制电机的启动么?还是能调速? 看的资料很多,有点迷糊。

用户1079511 2009-3-23 16:33

To jiayuan0011: 延时触发可控硅的目的是调整一个周期内通过可控硅电压的平均值,从而达到控制电机速度的效果。用与门的控制3021是为了反转电压和提高输出驱动能力。波形的变化可以看过零检测的文章

用户184440 2009-3-22 19:48

wormchen,你好!我现在也在做一个电机测速的东西,有些地方不明白,特别是过零检测这一点。 我的问题是:我用一个变压器输出的次级电压经过一个整流桥后输入光耦TLP521,输出为100HZ,5V的脉冲,就像你《过零检测电路》中蓝色的那个脉冲一样。输入到单片机的int1中。之后,“你说的单片机延时触发可控硅导通实现调速。”这部分我不是很明白,可控硅部分是一个小板子,是应用moc3021触发双向可控硅, http://bbs.21ic.com/upfiles/img/20093/2009322191152436.jpg 图中的74LS00应为74LS08(双输入与门),我不明白这个地方为什么使用与门,与门的两路输入信号是什么?光耦前后以及双向可控硅前后波形如何变化?这部分实现了什么呢? 谢谢,如方便加我qq93427303 诚心请教,请帮我好好讲下,万分感谢!

echo2005 2008-6-3 21:39

不错啊!

用户1079511 2008-6-2 09:06

to:wxdx8320 变压器次级的过零检测,跟220的相位一致的!

用户919309 2008-6-1 23:15

wormchen,你好!我现在也正在做一个过零检测移相调压的东西,特来学习。 你的过零检测电路中是直接对220v的交流整流后再过零检测的,还是变压器降压后用二极管整流?
相关推荐阅读
用户1079511 2009-07-10 16:08
Mega16读取SD卡内的FAT16文件
最近一直在学习FAT文件系统,在网络上找了一些资料加上参考别人写的程序,现在已经可以读取SD/MMC卡指定的文件,有些东西自己也不是很懂,回头还得慢慢研究。程序比较简单,就是读取SD卡的基本信息和初始...
用户1079511 2009-04-14 08:38
[原创]AVR M16热敏电阻测温LCM12864显示
https://static.assets-stash.eet-china.com/album/old-resources/2009/4/14/d085d878-6d8f-4245-acdb-cf44...
用户1079511 2009-04-08 11:34
Mega16 Bootloader+PC端上位机
AVR的Bootloader功能很方便产品的在线升级,以前参考网上的资料写过下位机的程序,标准的XMODEM协议,用超级终端来升级程序。最近在学习C#,所以用C#写个简单的上位机软件,配合以前的boo...
用户1079511 2009-01-22 16:15
Mega16热敏电阻测温上位机曲线显示
最近在一直学习用C#做上位机,把以前的做的m16热敏电阻测温的程序翻出来,稍加修改通过串口发给PC;PC端用c#2008写程序,接收数据后通过ZedGraph绘图控件实时显示出曲线图。ZedGraph...
用户1079511 2009-01-09 09:25
[原创]c#的Hex转Bin小程序
最近在搞AVR的bootloader,程序已经写好了,参考网上的代码用的是XMODEM协议用XP自带的超级终端。问题是xmodem支持bin格式的文件,一般用编译器生成的是hex文件不用直接使用,需要...
用户1079511 2008-12-31 10:42
[学习]用595驱动LED实现灰度调节
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />前一段时间在ouravr论坛里闲逛的...
我要评论
13
8
关闭 站长推荐上一条 /2 下一条