文章目录

  • 原理图
    • 驱动电路
    • MOTOR-ENCODER详解
    • 串口通信
  • 电机测速原理
  • PWM
  • 软件部分
  • 成果

临近期末,学校的单片机课程需要做课程设计,主要内容是基于51单片机的可调速电机,具体要求如下,在此记录一下具体的一个解题方案。

  1. 要求利用单片机输出PWM波形,通过改变占空比,改变电枢两端电压的平均值,从而改变电动机的转速
  2. 通过按键进行手动速度调整(速度+ 速度-)
  3. 利用串口调试助手或编写上位机软件,通过上位机控制直流速度调整
  4. 测量直流电机转速,并实时显示

原理图

首先是绘制原理图如下,右下角示波器为方便观察PWM脉冲波形用,可忽略

驱动电路

由于单片机的输出功率不足以驱动电机运动,因此这里使用L298芯片搭建一个驱动电路,驱动电压为12V,用于驱动电机运动。驱动电路如图。L298芯片的工作电压为5V(VCC接5V电压),支持同时驱动两台电机,可接驱动电压范围为(+5V~+46V),输出电流高达4A。

L298芯片控制引脚状态与电机对应状态如下图。因此,若要让电机运动则需要,ENA置1,IN1与IN2引脚所处电平相反。

ENA IN1 IN2 直流电机状态
0 X X 停止
1 0 0 制动
1 0 1 正转
1 1 0 反转
1 1 1 制动

MOTOR-ENCODER详解

这里由于需要测量电机转速,使用需要使用带有编码器的电机,Proteus中带有这样的一个电机,元件名称为MOTOR-ENCODER。MOTOR-ENCODER有5根引脚,其中左右两个接工作电压。上面三根引脚,左边与右边电机每转一圈就输出设定的脉冲数(这里设定每转一圈输出360个脉冲),二者脉冲相位相差90°。中间的引脚电机每转一圈引脚输出一个脉冲。 电机具体属性参数如下,这里设置电机额定电压为12V(因为驱动电路的驱动电压为12V),每转脉冲数为360(取值范围为1~360),其余保持默认。

串口通信

由于需要用到串口通信,因此需要用到Proteus中的虚拟串口COMPIM,将元件端口设置为COM1,波特率设置为9600,数据位8位,无校验位,停止位1位。将虚拟串口的RXD与单片机的RXD相连,TXD与TXD相连(与一般的串口连接不同,一般需要TXD与RXD交叉相连)。

然后打开VSPD虚拟串口连接软件(VSPD软件的下载与使用可参考该文章: 虚拟串口 VSPD 的使用),将COM1与COM2端口进行虚拟链接。然后进入串口助手打开COM2端口(一定不能打开COM1口,因为COM1口已被单片机占用) 设置好波特率、校验位与停止位,即可与单片机成功硬件连接。

电机测速原理

测速原理:单位时间内,根据该时间段内统计的脉冲数计算电机实际速度,这里单位时间为50ms。

由于编码器设置为每圈发出360个脉冲,则统计在50ms内的脉冲数即可知道在这50ms内电机转了多少圈,从而可推算出电机每分钟的转速。

设编码器单圈总脉冲数为C,在时间T0内,统计到的编码器脉冲数为M0,则转速n的计算公式为:
n = M0/(C*T0)。

PWM

PWM即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效的获得所需要的模拟参量。

其实就是通过控制高低电平的时间,来对输出的波形进行控制。

其中有几个重要的参数

PWM的频率:
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
也就是说一秒钟PWM有多少个周期
单位: Hz
表示方式: 50Hz 100Hz

PWM的周期:
T=1/f
周期=1/频率
50Hz = 20ms 一个周期
如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期

占空比:
是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: % (0%-100%)
表示方式:20%

一个简单的生成PWM的方法: 利用定时器进行定时中断,分别设置两个变量counter和compare。其中compare表示占空比。假设每100us定时器产生一次中断,则每进一次中断counter++,中断100次为一个周期,即T=10ms。

假设设置compare为60,即占空比为60%

每次定时器进入中断后,将当前counter值与compare进行判断,若counter<compare则置引脚为高电平,否则置低电平。这样在一个周期中,counter从1至100计数,counter为1~60时引脚均为高电平,即在一个周期内有60%的时间引脚都处于高电平。

这样我们就可以通过调整compare变量的值来控制PWM的占空比,从而达到控制电机转速的目的。

有关PWM的详细知识可参考以下文章

51单片机-PWM调速(直流电机,智能小车的电机调速)
PWM原理 PWM频率与占空比详解

软件部分

#include <REG51.H>
#define K 21/8
void UartInit(void);
void UART_SendByte(unsigned char Byte);
void Timer0Init(void);sbit motor1_IN1=P0^0;
sbit motor1_IN2=P0^1;
sbit motor1_ENA1=P0^2;
sbit ADD=P0^3;
sbit SUBTRACT=P0^4;
unsigned char led_mod[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极字模
unsigned char led_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点字模
unsigned char counter,compare;//compare为占空比
unsigned int n,m,rad;//n为脉冲数
void delay(unsigned char time)      //1ms@11.0592MHz
{unsigned char i, j;i = 15*time;j = 90;do{while (--j);} while (--i);
}void Display() //LED显示
{P2=(0x01);P1=led_mod[(rad/100)%10];delay(1);P2=(0x01<<1);P1=led_mod[(rad/10)%10];delay(1);P2=(0x01<<2);P1=led_point[rad%10];delay(1);P2=(0x01<<3);P1=led_mod[(rad%10)];delay(1);
}
void move(void) //启动电机
{motor1_IN1=1;motor1_IN2=0;
}
void UartInit(void)     //9600bps@11.0592MHz
{SCON = 0x50;      //8位数据,可变波特率TMOD &= 0x0F;      //设置定时器模式TMOD |= 0x20;     //设置定时器模式TL1 = 0xFD;       //设置定时初始值TH1 = 0xFD;       //设置定时初始值ET1 = 0;      //禁止定时器1中断TR1 = 1;     //定时器1开始计时ES=1;            //开启中断EA=1;            //开启中断PS=1;            //设置优先级
}void Timer0Init(void)      //100微秒@11.0592MHz
{TMOD &= 0xF0;     //设置定时器模式TMOD |= 0x02;     //设置定时器模式TL0 = 0xA4;       //设置定时初始值TH0 = 0xA4;       //设置定时重载值TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时ET0=1;           //定时器0中断开启EA=1;            //EA开启PT0=0;           //定时器0开始计时
}
void UART_Routine(void) interrupt 4 //串口接收中断
{   if(RI==1){    compare=SBUF;  //接收串口传输来的数据SBUF=compare;  //将当前占空比发送回上位机while(!TI);       //等待发送完毕TI=0;          //标志位复位RI=0;           //标志位复位}
}
void Timer0_Routine(void) interrupt 1   //定时器0中断,用于PWM生成
{TL0 = 0xA4;       //设置定时初始值TH0 = 0xA4;       //设置定时初始值counter++;m++; counter%=100;if(counter<compare)    //PWM生成motor1_ENA1=1;  elsemotor1_ENA1=0;if(m==500) //50ms后计算一次转速{rad=n*K;//计算转速,若结果与实际有较大误差则调整比例系数Km=0;  n=0;}
}void interrupt0_int()  //电机编码器脉冲中断初始化
{IT0=1;EX0=1;EA=1;PX0=0;
}void motor_Routine(void) interrupt 0   //编码器脉冲中断函数
{n++; //脉冲数+1
}void main()
{Timer0Init(); //定时器0初始化interrupt0_int();  //电机编码器中断初始化UartInit();  //串口中断初始化compare=70;   //初始占空比70%n=0; //电机旋转圈数初始化m=0;    //计时次数初始化move();    //启动电机while(1){if(ADD==0) {compare=compare+10;  //按下按键占空比+10if(compare>100)compare=100;while(!ADD) //等待松开Display();}if(SUBTRACT==0){compare=compare-10; //按下按键占空比-10if(compare<0)compare=0;while(!SUBTRACT) //等待松开Display();}Display();}
}

成果

电机正常转动,同时数码管显示当前转速,可通过ADD按键和SUBTRACT按键对转速进行加减速 。


可通过串口对转速大小进行调整。

Proteus基于51单片机通过PWM脉冲调制控制电机转速_按键与串口控制转速_电机转速可测相关推荐

  1. 基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频)

    基于51单片机的PWM控制直流电机设计( proteus仿真+程序+报告+讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0031 ...

  2. 基于51单片机的PWM控制马达电机调速正反转(仿真+源码+全套资料)

    资料编号:117 仿真图proteus 7.8 程序编译器:keil 5 编程语言:C语言 采用51单片机,用PWM控制电机脉冲频率应控制在25HZ-35HZ之间 定时1ms,1个周期30ms,脉冲频 ...

  3. 基于51单片机的PWM控制马达电机调速正反转

    资料编号:117  下面是相关功能视频演示: 117-基于51单片机的PWM控制马达电机调速正反转(仿真+源码+全套资料) 仿真图proteus 7.8(理论上高于7.8均可以打开) 程序编译器:ke ...

  4. 基于51单片机直流电机PWM调速设计

    具体实现功能 系统由STC89C52单片机.LCD1602液晶显示屏.霍尔测速传感器.3V直流电机.按键模块构成. 具体功能: 1.采用霍尔传感器非接触式测电机转速: 2.LCD1602液晶显示当前的 ...

  5. 39、基于51单片机小车红外循迹、避障、遥控控制系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.程序 部分代码 七.资料包括 摘要 随着计算机.微电子.信息技术的快速进 ...

  6. hc05与单片机连接图_基于proteus的51单片机开发实例(13)-LED指示那个按键被按下

    1. 基于proteus的51单片机开发实例(13)-LED指示那个按键被按下 1.1. 实验目的 本实例将实现两路外部中断的检测和识别,让我们能够更好地理解51单片机的外部中断以及中断优先级的概念. ...

  7. 基于51单片机的电子温度计系统的设计与实现

    设计一个基于51单片机的电子温度计系统,其采用STC12C5A60S2芯片作为控制中心,DS18B20温度传感器为测温元件,LCD为显示器件.硬件设计部分包括温度传感电路设计.温度控制电路设计及显示电 ...

  8. 基于51单片机设计的电动车控制器

    一.项目介绍 随着社会经济的快速发展,人们对节能环保的要求越来越高,电动车因其无污染.噪音小.使用成本低等优点逐渐成为了市场关注的焦点.同时,随着科技的不断进步和应用,电动车的技术水平也在不断提高. ...

  9. 单片机检测电机频率c语言,基于51单片机的电动机测速表的设计.doc

    基于51单片机的电动机测速表的设计 基于51单片机的电动机测速表设计 摘 要 本文介绍了采用光电传感器实施电机转速测量的方法.基本原理,完成了一种基于AT89C51单片机平台的电动机测速表的软硬件设计 ...

最新文章

  1. 计算机考试那些专业知识点,计算机考研专业课考试知识点分析
  2. 三座”大山“或让谷歌无人机送货项目被冻结
  3. 利用Visual Studio 2005的自动化测试工具来做数据导入
  4. ws配置 zuul_SpringCloud系列研究---服务网关zuul
  5. netflix数据处理2(转)
  6. 如何判断输入的是字符还是数字_[Leetgo]判断字符串是否为数字
  7. Python 列表 list 数组 array
  8. 解决微信小程序使用switchTab跳转后页面不刷新的问题
  9. mysql查询当前时间和用户_MySQL学习笔记(3) - 查询服务器版本,当前时间,当前用户...
  10. python getopt使用_如何使用getopt.getoptpython中的方法?
  11. kvm+libvirt虚拟机快照浅析[转]
  12. 原生js对数组操作(find,findIndex)
  13. 激光slam理论与实践
  14. matlab如何批量去背景,ImageJ怎么消除背景 批量去背景教程
  15. Linux驱动——mmc bus浅析(五)
  16. 2021年,小灰都读了哪些书?
  17. 全国计算机一级学科博士点,一级学科博士点高校排名
  18. 视网膜图像分割数据集整理
  19. 吃货联盟订餐系统 java
  20. Python 头像上右下角添加小红旗

热门文章

  1. 【Crypto】BUGKU-聪明的小羊
  2. A*寻径算法新手入门
  3. 我是如何通过fuzz apache httpd服务发现CVE-2017-7668
  4. netron画yolov4网络结构图
  5. 《炬丰科技-半导体工艺》光刻胶回流特性在金刚石微透镜制造中的应用
  6. JavaFX 更换程序图标 报错Invalid URL: unknown protocol: c
  7. 【NXP】LPC55S69初上手
  8. C语言进阶(五):宏处理
  9. Vue设置背景图片(全屏背景),实际操作与踩雷.
  10. 5、Java基础——变量和常量、数据类型、基本数据类型的默认值、内存单位的换算