基于单片机PWM的直流电机调速系统+H桥驱动电路驱动原理图

2019-11-09来源: 51hei关键字:单片机  PWM  直流电机  调速系统  H桥驱动

本设计以单片机AT89C51为核心,通过软件编程利用其定时器产生PWM信号从而实现对直流电机转速控制。硬件设计主要包括按键电路模块、电机驱动模块、测速模块和转速显示模块。其中采用独立式键盘通过按键将命令输入到单片机,改变PWM信号占空比,再将单片机输出的信号通过光电耦合器和由IGBT组成的H型桥式功率放大驱动电路,根据不同占空比的PWM信号达到电机启停、正反转和加减速控制。测速模块采用非接触式的霍尔传感器对直流电机的转速进行测量,将测得的转速传送到单片,再通过LCD显示出来。本论文主要介绍了直流电机调速系统的原理和方案设计,单片机如何产生PWM信号,H桥驱动电路设计,硬件电路图的设计与连接,实现功能的流程图和程序,系统的仿真和调试。
 
单片机程序源码:

#include

#define uchar unsigned char

#define uint unsigned int 

void displaym();

sbit en=P2^5;                //1602  6管脚

sbit rs=P2^7;         //1602端口        4管脚

sbit rw=P2^6;//lcd1602控制端口 5管脚

sbit num1=P1^0;                                                //占空比加1

sbit num2=P1^1;                                                                   //占空比减一

sbit num3=P1^2;                                                                                           //正传

sbit num4=P1^3;                                                                                                         //反转

sbit num5=P1^4;                                                                                                                   //开始停止切换


sbit out=P3^4;                                                         //PWM输出用于正传

sbit out1=P3^7;                        //PWM输出用于反转


uint zhuansu,flag,z1,z2,m,flag_1,zheng,fan,kai;





void delay(uint z)//延时1ms函数

{


uint x,y;

for(x=0;x

     for(y=0;y<110;y++);

}




void write_com(uchar com)//向1602写一字节(控制指令)

{

  rs=0;

  P0=com;

  delay(5);

  en=0;

  delay(10);

  en=1;

}

void write_data(uchar date)//向1602写一字节(数据)

{

  rs=1;

  P0=date;

  delay(5);

  en=0;

  delay(5);

  en=1;

}

void init()//初始化函数

  en=0;

  rw=0;

  write_com(0x01);         //lcd初始化

  write_com(0x38);                                           //5X7显示

  write_com(0x0c);                         //关闭光标

  TMOD=0x01;               //定时器方式1           

  TH0=0xdc;

  TL0=0x00;                //定时器装入初值 

  EA=1;                    //开总中断 

  ET0=1;                   //定时器0开中断

  TR0=1; 

  EX1=1;

IT1=1;                 //定时器启动  

TH1=0xfc;

  TL1=0x66;//定时100us

  ET1=1;                   //定时器1开中断

  TR1=1;

  write_com(0x80);

  write_data('V');

  write_data(':');

  write_com(0x87);                 //第一行显示转速

  write_data('r');

  write_data('p');

  write_data('m');

  write_com(0xc0); 

  write_data('z');

  write_data('h');

  write_data('a');

  write_data('n');

  write_data('k');

  write_data('o');

  write_data('n');

  write_data('g');

  write_data('b');

  write_data('i');          //在第二行显示zhankongbi:

  write_data(':');

  displaym();

}

void keyscan()  //键盘扫描函数

  if(num1==0)     

  {

    delay(5);      //消除抖动

         if(num1==0)

         {

                if(m<=199)

                 m++;

                        displaym();                                                                  //设定占空比加一

     }

  }

  if(num2==0)

  {

    delay(5);

         if(num2==0)

         {

                  if(m>=1)

                m--;

                        displaym();                                        //设定占空比减一

        

         }

  }

    if(num3==0)

  {

    delay(5);

         if(num3==0)

         {

          zheng=1;                //正传标志置1

          fan=0;          // 反转标志置0

        

         }

  }

      if(num4==0)

  {

    delay(5);

         if(num4==0)

         {

          zheng=0;                 //正传标志置0

          fan=1;          // 反转标志置1

        

         }

  }

      if(num5==0)

  {

    delay(5);

         if(num5==0)

         {

         while(num5==0)         ;

          kai=1-kai;

         }

  }

}

void display()

{

  write_com(0x82);

  zhuansu=zhuansu*30;          //将两秒内的计数乘以30得到转每分


  if(zhuansu/10000!=0)

   write_data(zhuansu/10000+0x30);                                                  //如果转速的万位不为0        正常显示否则显示空格

   else

   write_data(' ');


  if(zhuansu/1000==0)

  write_data(' ');

  else 

  write_data(zhuansu%10000%1000+0x30);                                                                //如果转速小于1000 千位为空格 否则正常显示

  

  if(zhuansu/100==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000/100+0x30);                                           //如果转速小于100 百位为空格 否则正常显示


    if(zhuansu/10==0)

  write_data(' ');

  else

  write_data(zhuansu%10000%1000%100/10+0x30);                                  //如果转速小于10 十位为空格 否则正常显示


  write_data(zhuansu%10000%1000%100%10+0x30);

  write_com(0xd0);                          //如果没有这句,当中断内的显示函数执行完,就会在转速的位置显示占空比数据,导致乱码

}

void displaym()

{

write_com(0xcb);

   if(m/200%10!=0)

write_data(m/

[1] [2]
关键字:单片机  PWM  直流电机  调速系统  H桥驱动 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479495.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AT89S52单片机16LED摇摇棒设计
下一篇:单片机测速与1602显示程序与电路

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR单片机测温基于DS18B20
#include<iom16v.h>#include<macros.h>#include<delay.h>#define uint unsigned int#define uchar unsigned char#define dula_set PORTA |=BIT(3) //数码管段选#define dula_clr PORTA &=~BIT(3)#define wale_set PORTA |=BIT(4)//数码管位选#define wale_clr PORTA &=~BIT(4) #define DQ_IN DDRA&=~BIT(5)#define DQ_
发表于 2019-11-20
AVR单片机控制继电器
#include "macros.h"#define uchar unsigned char#define uint  unsigned intvoid delay_ms(uchar i){uchar a,b;for(a=1;a<i;a++)   for(b=1;b<141;b++)   {;}}void main(void){DDRA=0X80;PORTA=0X80;DDRB=0XFF;PORTB=0XFF;DDRC=0X01;PORTC=0X01;DDRD=0X00;PORTD=0XFF;while(1)  {&nbs
发表于 2019-11-20
AVR单片机控制继电器
PIC16F877A单片机的PWM输出程序
//////////////////////////////////////////在PICC编译器主,调试通过,PIC16F877A的PWM信号输出#include<pic.h>#define uchar unsigned char#define uint unsigned int__CONFIG(0x1832);void delay(){uint k;for(k=0;k<5000;k++); }void main(){uchar k;T2CON=0X04;  //开定时器2CCPR1L=0X0F; //PWM匹配初值CCP1CON=0X3C;    //设置CCP1
发表于 2019-11-20
LCD1602在PIC单片机中的使用程序
#include<pic.h>__CONFIG(0x1832);        //芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡#define rs RA1#define rw RA2#define e  RA3const char web[ ]={' ','W','W','W','.','P','I','C','1','6','.','C',&#
发表于 2019-11-20
LCD1602控制要领(pic单片机)
PIC板使用LCD时需要将J401摘除LCD 4脚(RS数据/命令选择端H/L)-----RB2LCD 5脚(R/W读写选择端H/L)---------RB1LCD 6脚(E使能读H,写L->H)----------RB0控制要领:如无检忙则可在每次操作之前作适当延时即可.写命令:rs = 0;rw = 0;ep = 0->1->0;(用于初始化和在控制显示的位置)写数据:rs = 1;rw = 0;ep = 0->1->0;(用于显示内容)初始化:Write_COM(0x38);//双列16X2Write_COM(0x0C);//开显示;无不显光标;光标不闪烁Write_COM(0x06);//写入数
发表于 2019-11-20
PIC单片机在MPLAB-IDE中使用HitechC编译器
PIC单片机的C语言使用(一)在MPLAB-IDE中使用HitechC编译器 一、装入编译器:1、启动MPLAB-IDE,如下图所示选择Project-》Install Language Tool2、在弹出的安装语言工具对话框里“Language Suite”选项现在显示的是Microchip,点击后面的箭头来选择语言。 我使用的工具是HI-TECH PICCME,所以选择为“HI-TECH PICC”。3、接下来在“Tool Name”里选择编译器组件的调用路径,这里有“PICC Compiler”(C编译器)、“PICC Assembler”(汇编器)和“PICC Linker”(链接器)3项都需要设置
发表于 2019-11-20
PIC单片机在MPLAB-IDE中使用HitechC编译器
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved