直流小电动机调速系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

题目直流小电机测速系统

一.题目要求

设计题目:直流小电动机调速系统

描述:采用单片机、uln2003为主要器件,设计直流电机调速系统,实现电机速度开环可调。

具体要求:1、电机速度分30r/m、60r/m、100r/m共3档;

2、通过按选择速度;

3、检测并显示各档速度。

实验器件:

实验板、STC89C52、直流电机、晶振(12MHz)、电容(30pFⅹ2、10uFⅹ2)、)uln2003、小按键、按键(4个)、、数码管、以及

电阻等

二.组内分工

摘要

在电气时代的今天,电动机在工农业生产与人们日常生活中都起着十分重要的作用。直流电机作为最常见的一种电机,具有非常优秀的线性机械特性、较宽的调速范围、良好的起动性以及简单的控制电路等优点,因此在社会的各个领域中都得到了十分广泛的应用。

本文设计了直流电机测速系统的基本方案,阐述了该系统的基本结构、工作原理、运行特性及其设计方法。本系统采用PWM 测量电动机的转速,用MCS-51单片机对直流电机的转速进行控制。本设计主要研究直流电机的控制和测量方法,从而对电机的控制精度、响应速度以及节约能源等都具有重要意义。

·关键词:直流电机单片机PWM 转速控制

硬件部分

1.时钟电路

系统采用12M晶振与两个30pF电容组成震荡电路,接STC89C52的XTAL1与XTAL2引脚

2.按键电路

三个按键分别控制电机的不同转速,采用开环控制方法

3.电机控制与驱动部分

电机的运行通过PWM波控制。PWM波通过STC89C52的口输出。

显示部分

采用4位共阳极数码管实现转速显示。数码管的位选端1~4分别接STC89C52的~管脚。

完整仿真电路图

软件部分

系统软件采用Keil集成开发环境开发

程序如下:

#include <>

sbit P2_0=P2^0; //数码管位

sbit P2_1=P2^1;

sbit P2_2=P2^2;

sbit P2_3=P2^3;

sbit P2_4=P2^4; //电机位

sbit keysp30=P1^1; //30

sbit keysp60=P1^2; //60

sbit keysp100=P1^3; //100

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

unsigned int spd; //电机转速

unsigned char ge,shi,bai,qian; //电机转速spd的各个位

unsigned int counter=0; //光电传感器脉冲数

unsigned int pwm; //pwm占空比

unsigned int mid; //占空比设置值

unsigned int c; //设定多长时间计算一次速度

void display(); //数码管显示电机速度

void delay(); //延迟函数

void ctrlpwm(); //控制电机占空比

void speed(); //计算电机速度,放于motorspeed变量中void keys(); //按键扫描

void main()

{

P2=P2&0x0f;

vid=0;

initial();

while(1)

{

keys();

display();

ctrlpwm();

speed();

}

}

void initial() //初始化程序

{

EA=1; //开启总中断

EX0=1; //开启外部中断0

IT0=1; //设置成下降沿触发方式

TMOD=0x01; //设置定时器0为模式1,即16位计数模式TH0=(65536-10000)/256; //计数时间为10ms

TL0=(65536-10000)%256;

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

TR0=1; //启动定时器0

}

void keys() //键盘扫描

{

if(keys1 == 0)

{

delay();

if(keysp1 == 0)

vid=1;

}

if(keys2 == 0)

delay();

if(keys2 == 0)

vid=3;

}

if(keys3 == 0)

{

delay();

if(keys3 == 0)

vid=5;

}

}

void speed()

{

if(c>=100) //100*10ms=1s计算一次电机转速{

frq1=counter/3; //转的圈数除以时间

counter=0; //清零脉冲数

c=0; //清零标志

}

void ctrlpwm()

{

if(pwm>=0 && pwm

{ P2_4=1;

}

else if(pwm>=mid && pwm<10)

{

P2_4=0;

}

else pwm=0;

}

void _TIMER0() interrupt 1

{

TH0=(65536-10000)/256; //重新装入初值,计数时间为10ms TL0=(65536-10000)%256;

pwm++;

c++;

相关文档
最新文档