直流电机转速控制系统报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机系统与应用课程设计
实验报告
直流电机转速测量与控制系统设计与实现
评语:成
绩
教师:
年月日
班级:
学号:
姓名:
实验地点:
实验时间:
直流电机转速测量与控制系统设计与实现一、应用系统设计方案设计目的:
了解以微机为核心的闭环控制系统的组成原理。掌握电机转速闭环控制系统的构成方法。
了解霍尔器件的工作原理:电机转速的测量与控制的基本原理。
掌握PWM调速原理和应用方法。
掌握控制系统的设计与调试方法,提高分析问题和解决问题能力。
二、课程设计的内容:
设计一个对直流电机转速测量与转速控制的闭环控制系统。微机控制中心在监控界面上设置电机转速。电机转速测量利用霍尔传感器电路产生转速脉冲,定时/计数电路通过脉冲计数获得转速参量。电机转速调整采用PWM(脉宽调节)方法,控制中心采样到电机转速参量,算得转速值同预定转速设置值进行比较,若不相同,则调整控制转速脉冲的占空比,来达到调速的目的。(占空比=脉冲宽度/脉冲周期)
三、系统功能要求与设计要求:
1)系统监控界面设计:
监控系统具有转速参数设置窗口、采样的电机转速数据显示窗
口、转速动态曲线显示窗口及强行干预系统运行的按钮功能或相应功能选择菜单。
2)监控程序设计要求:
监控程序用查询方式获取转速数据。
监控程序用中断方式获取转速数据。
3)硬件设计要求:
充分利用现有实验系统资源设计一个性能较好的直流电机转速闭环控制系统。利用带锁存的I/O接口电路(如8255,74LS273,D/A-DA0832)输出控制电机转速的脉冲。采样转速用霍尔传感器件提供电机转速脉冲。利用定时/计数电路对电机转速脉冲计数。微机可从定时/计数电路中获得电机转速数值,并产生控制电机转速的PWM 脉冲。
四、设计详情:
1)闭环控制系统原理图
图一电机转速测量与控制闭环系统基本功能图
2)电机控制及转速测量原理图
图二电机控制及转速测量原理图
3)硬件连线图
图三硬件连线图
4)操作步骤
直流电机在控制脉冲作用下转动,电机转盘上的永久磁铁随之旋转,霍尔传感器件3101T受磁场的影响,从端口OUT输出脉冲信号,电机旋转一圈,霍尔传感器输出一个脉冲,脉冲频率于电机转速成正比。通过测出脉冲信号的频率(单位时间脉冲个数)就可以计算出电机的转速。
测量转速时,需要一个定时器,设定时间为T,还需要一个计数器,将霍尔传感器的(OUT端)输出脉冲引导计数器的输入端。电机转动时,同时启动定时器和计数器,当定时器定时时间T到时,停止计数器的脉冲计数,并读出计数器的计数值S(即:时间T内的转数),可以计算出主流电机的转速R=S/T。
直流电机转速调整:
首先确定控制脉冲占空比的调整方式,一种是设定正(或负)脉冲宽度,不断调整负脉(或正)冲宽度实现转速,当转速高于设定转速时,加大负脉冲(或减小正脉冲)的宽度。另一种是同时调整正负脉冲的宽度实现直流电机转速调整。
在调整了脉冲占空比后,同时启动的定时器和计数器,进行转速测量,直流电机转速调整与测量交叉进行。
A.编制利用带锁存功能I/O端口(如8255,74LS273,D/A-DA0832)输出控制电机转速的PWM脉冲程序
B. 编制利用定时器/计数器测量电机转速程序
C.A)程序和B)程序合并,实现电机转速测量与控制
D.编制系统监控界面的程序
E.电机转速测量与闭环控制系统的连调。
五、课程设计试验环境:
a)实验仪器
●微机一台(Pentium 4)
●微机接口技术实验箱一个
●ISA – PCI转接卡一块
●连接电缆一条
●万用表一块
●微机接口技术实验讲义一本
●导线、剥线钳等
b)软件环境:
Windows XP 平台和Visual C++ 6.0 编译器六、实验主要代码
// ReaderDlg.cpp : implementation file
#include
#include "stdafx.h"
#include "Reader.h"
#include "ReaderDlg.h"
#include "PCI9052Dll.h" //总线转换
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
int iospeed; //设置转速
int rate; //实际转速
int times = 0; //运行时间
double key = 1.0; //占空比
int normal = 0; //异常判断
int stop = 0;
/////////////////////////////////////////////////////////////////////////////
// CReaderDlg dialog
CReaderDlg::CReaderDlg(CWnd* pParent /*=NULL*/)
: CDialog(CReaderDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CReaderDlg)
m_edit6 = _T("");
m_edit4 = _T("");
m_edit5 = _T("");
m_speed = 0;
m_edit3 = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CReaderDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CReaderDlg)
DDX_Text(pDX, IDC_EDIT6, m_edit6);
DDX_Text(pDX, IDC_EDIT4, m_edit4);
DDX_Text(pDX, IDC_EDIT5, m_edit5);
DDX_Text(pDX, IDC_EDIT1, m_speed);
DDV_MinMaxInt(pDX, m_speed, 0, 2500);
DDX_Text(pDX, IDC_EDIT3, m_edit3);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CReaderDlg, CDialog)
//{{AFX_MSG_MAP(CReaderDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_EN_CHANGE(IDC_EDIT3, OnChangeEdit3)
ON_EN_CHANGE(IDC_EDIT6, OnChangeEdit6)
ON_EN_CHANGE(IDC_EDIT4, OnChangeEdit4)
ON_EN_CHANGE(IDC_EDIT5, OnChangeEdit5)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CReaderDlg message handlers