测控实验报告 电机驱动及转速测量实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三电机驱动及转速测量实验
1 实验目的
(1)掌握单片机通用I/O 口的使用;
(2)掌握使用单片机定时器产生占空比可调的PWM 波;
(3)掌握使用单片机定时器2 的捕获功能实现电机转速测量的方法。
2 实验电路
2.1 硬件原理图
电机控制实验箱的原理框图如图1 所示。
2.2 实验装置接口说明
控制系统与电机实验箱通过DB9 插头连接,其接口定义如表1 所示。
3 开发环境
程序开发调试软件为KeilC,下载软件为S51ISP
4 实验要求
(1)通过实验箱上的键盘输入调整PWM 波的占空比,具体要求如下:
当按键为0 时,其占空比为20%,LED1 显示值为0;
当按键为1 时,其占空比为40%,LED1 显示值为1;
当按键为2 时,其占空比为60%,LED1 显示值为2;
当按键为3 时,其占空比为80%,LED1 显示值为3;
(2)将测量到的电机转速显示到实验箱的数码管LED3~LED6 上,转速单位为
“转/分”。
5 软件流程图
6 实验步骤
1)硬件连接
2)程序开发调试软件为KeilC ,下载软件为S51ISP ,先通过单片机控制电机,改变占空比,使用示波器测量转速。
3)硬件连接,将测得转速显示在数码管上。
7 程序
#include
#include
#define COMMAND XBYTE[0x1B31]
#define DATA XBYTE[0x1B30]
#define uchar unsigned char
#define Pwm 9000
#define CountPerMinute 55286000
uchar code table1[]=
{0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; uchar code table2[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit PwmOut=P1^2;
long data PwmH;
long data PwmL;
unsigned int OverFlow=0;
void delay()
{
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
uchar PulsNum=0; //脉冲数计数器
void initmotor();//电机初始化
void inittimer();//定时器初始化
void init8279();//8279初始化
void dis(uchar num,uchar a);//显示子程序
void mode(uchar a);//模式选择子程序
void speed_ctr(uchar a,uchar b,uchar c);//速度显示子程序
void initmotor()
{
PwmOut=0; //输出低电平
PwmH=4500; //PWM 高低点平各定时4500 个数,即占空比为50%
PwmL=4500;
}
void initTimer()
{
TMOD=0x01; //定时器0 工作于方式1
TH0=65535/256; //定时器0 计数初值设置为1
TL0=65535%256;
ET0=1; //定时器0 中断允许
TR0=1; //启动定时器0
T2CON=0x09; //定时器2 工作于捕捉方式
TH2=0x00; //定时器2 计数初值设置
TL2=0x00;
ET2=1; //定时器2 中断允许
PT2=1; //定时器2 中断优先级最高
TR2=1; //启动定时器2
}
void init8279()
{
uchar reg;//清除显示RAM
COMMAND=0xd1;
do
{
reg=COMMAND;
}
while(reg&0x80);
COMMAND=0;//设置工作方式
COMMAND=0x32;//设置工作频率
COMMAND=0x80;//设置显示RAM
}
void key_in() interrupt 0
{
uchar keydata;//键入中断
COMMAND=0x40;//读入行列号到keydata
keydata=DATA;
keydata=keydata&0x3f;//屏蔽高位
keydata=table1[keydata];//得到键值
dis(0x80,keydata);//第1位显示键值
mode(keydata);
}
void mode(uchar a)
{
PwmH=Pwm*((a+1)*20-6.53)/0.87/100.0;//求占空比
PwmL=Pwm-PwmH;
}
void Pwm_ctr() interrupt 1
{
if(PwmOut==1) //当前为高电平
{
TH0=(65536-PwmL)/256; //计数値赋为低电平时间値
TL0=(65536-PwmL)%256;
PwmOut=0; //输出低电平
}
else if(PwmOut==0) //当前为低电平
{
TH0=(65536-PwmH)/256; //计数値赋为高电平时间値
TL0=(65536-PwmH)%256;
PwmOut=1; //输出高电平
}