直流小电动机调速系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++;