直流电动机的调速 用单片机产生PWM控制

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

出处:http://blog.sina.com.cn/s/blog_6035432c0100hc8y.html

上一篇文章已经讲解了直流电机的驱动,怎么使它正转,反转和停止,并详细的说了一下H桥原理。今天这里写一下怎么用单片机控制直流电机的速度。

直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来再次调节电机的转速。

直流电机的调速方案一般有下列3种方式:

  • 1、改变电枢电压;
  • 2、改变激磁绕组电压;
  • 3、改变电枢回路电阻。
直流电动机的调速 <wbr>用单片机产生PWM控制

使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。根据公式

U=aVCC

其中:U为电枢电压;a为脉冲的占空比(0<a<1);VCC直流电压源,这里为5V。

电动机的电枢电压受单片机输出脉冲控制,实现了利用脉冲宽度调制技术(PWM)进行直流电机的变速。

直流电动机的调速 <wbr>用单片机产生PWM控制



因为在H桥电路中,只有PWM1与PWM2电平互为相反时电机才能驱动,也就是PWM1与PWM2同为高电平或同为低电平时,都不能工作,所以上图中的实际脉冲宽度为B,

我们把PWM波的周期定为1ms,占空比分100级可调(每级级差为10%),这样定时器T0每0.01ms产生一次定时中断,每100次后进入下一个PWM波的周期。上图中,占空比是60%,即输出脉冲的为0.6ms,断开脉冲为0.4ms,这样电枢电压为5*60%=3V。

我们讨论的是可以正转反转的,如果只按一个方向转,我们就只要把PWM1置为高电平或低电平,只改变另一个PWM2电平的脉冲变化即可,,如下图(Q4导通,Q3闭合,电机只能顺时针调整转动速度)

直流电动机的调速 <wbr>用单片机产生PWM控制

C语言代码:


#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int

sbit K5=P1^4;
sbit K6=P1^5;
sbit PWM1=P1^0;
sbit PWM2=P1^1;
sbit FMQ=P3^6;


uchar ZKB1,ZKB2;

void delaynms(uint aa)
{
  uchar bb;
  while(aa–)
  {
   for(bb=0;bb<115;bb++)     //1ms基准延时程序
   {
    ;
   }
  }
 
}

void delay500us(void)
{
  int j;
  for(j=0;j<57;j++)
  {
   ;
  }
}

void beep(void)
{
  uchar t;
  for(t=0;t<100;t++)
  {
   delay500us();
 FMQ=!FMQ;   //产生脉冲
  }
  FMQ=1;    //关闭蜂鸣器
  delaynms(300);
}


void main(void)
{
  TR0=0;   //关闭定时器0
  TMOD=0x01;  //定时器0,工作方式1
  TH0=(65526-100)/256;
  TL0=(65526-100)%256;    //100us即0.01ms中断一次
  EA=1;        //开总中断
  ET0=1;       //开定时器0中断
  TR0=1;       //启动定时器T0
  ZKB1=50;     //占空比初值设定
  ZKB2=50;     //占空比初值设定
  while(1)
  {
   if(!K5)
 {
   delaynms(15);     //消抖
   if(!K5)      //确定按键按下
   {
     beep();
    ZKB1++;      //增加ZKB1
     ZKB2=100-ZKB1;    //相应的ZKB2就减少
   }
  }      
 if(!K6)
 {
   delaynms(15);     //消抖
   if(!K6)      //确定按键按下
   {
     beep();
    ZKB1–;      //减少ZKB1
     ZKB2=100-ZKB1;    //相应的ZKB2增加
   }
 }
 if(ZKB1>99)
 ZKB1=1;
 if(ZKB1<1)
 ZKB1=99;
 
   }
}


void time0(void) interrupt 1
{
  static uchar N=0;
  TH0=(65526-100)/256;
  TL0=(65526-100)%256;
  N++;
  if(N>100)
  N=0;
  if(N<=ZKB1)
  PWM1=0;
  else
  PWM1=1;
  if(N<=ZKB2)
  PWM2=0;
  else
  PWM2=1;

}


//显现:电机转速到最高后,也就是N为1或99时,再按一下,就变到99或1,
//电机反方向旋转以最高速度

点这里可以跳转到人工智能网站

发表评论