测控实验报告 电机驱动及转速测量实验

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

}

相关文档
最新文档