基于51单片机的闭环控制 附带源程序 - 图文

更新时间:2023-12-20 08:35:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《电气技术》 研究生课程设计报告

题 目 基于51单片机的直流电机PID调速系统 学 院 机械与汽车工程学院 专业班级 车辆工程 学 号 221601852023 学生姓名 木飞 指导教师 完成日期 2017年01月12日

1 引言

1.1研究对象介绍 1.2选题的目的和意义

直流电动机具有良好的起动、制动性能,宜于在大范围内平滑调速,在许多需要调速或快速正反向的电力拖动领域中得到了广泛的应用。从控制的角度来看,直流调速还是交流拖动系统的基础。早期直流电动机的控制均以模拟电路为基础,采用运算放大器、非线性集成电路以及少量的数字电路组成,控制系统的硬件部分非常复杂,功能单一,而且系统非常不灵活、调试困难,阻碍了直流电动机控制技术的发展和应用范围的推广。

2 设计原理、方法及概述

2.1 设计原理及方法

直流电动机根据励磁方式不同,直流电动机分为自励和他励两种类型。不同励磁方式的直流电动机机械特性曲线有所不同。但是对于直流电动机的转速有以下公式: n=U/Cc?-TR内/CrCc? 其中:U—电压;R内—励磁绕组本身的电阻;?—每极磁通(Wb);Cc—电势常数;Cr—转矩常量。由上式可知,直流电机的速度控制既可采用电枢控制法,改变电枢回路电阻,也可采用磁场控制法。对于要求在

一定范围内无级平滑调速系统来说,以调节电枢供电电压的方式为最好。改变电阻只能是有级调速;减弱磁通虽然能够平滑调速,但是调速范围不大,往往只是配合调压方案,在基速(额定转速)以上做小范围的减弱升速。因此,自动控制的直流调速往往以变压调速为主。

本文主要研究了利用MCS-51系列单片机,通过PWM方式控制直流电机调速的方法。PWM控制技术以其控制简单、灵活和动态响应好的优点而成为电力电子技术最广泛应用的控制方式,也是人们研究的热点。由于当今科学技术的发展已经没有了学科之间的界限,结合现代控制理论思想或实现无谐振软开关技术将会成为PWM控制技术发展的主要方向之一。

2.2 设计总概述

以直流电机电枢上电压的占空比来改变平均电压的大小,从而控制电动机的转速为依据,实现对直流电动机的平滑调速,并通过单片机控制速度的变化。本文所研究的直流电机调速系统主要是由硬件和软件两大部分组成。硬件部分是前提,是整个系统执行的基础,它主要为软件提供程序运行的平台。而软件部分,是对硬件端口所体现的信号,加以采集、分析、处理,最终实现控制器所要实现的各项功能,达到控制器自动对电机速度的有效控制。但是此设计中电机只需要正转,所以相对来说简单点。

3硬件设计

3.1 8051单片机简介

AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。

AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。部分功能如下:

(1)8kB可反复擦写(大于1000次)Flash ROM; (2)32个双向I/O口; (3)256x8bit内部RAM;

(4)3个16位可编程定时/计数器中断; (5)时钟频率0-24MHz;

(6)2个串行中断,可编程UART串行通道; (7)2个外部中断源,共8个中断源; (8)2个读写中断口线,3级加密位;

3.2直流电机

设计中采用直流电机,自带高精度的磁编码器,性能介绍如图一所示, 接线说明如图二所示:

性能介绍图一

case(3):

LSA=1;LSB=1;LSC=0; break;//显示第3位 case(4):

LSA=0;LSB=0;LSC=1; break;//显示第4位 case(5):

LSA=1;LSB=0;LSC=1; break;//显示第5位 case(6):

LSA=0;LSB=1;LSC=1; break;//显示第6位 case(7):

LSA=1;LSB=1;LSC=1; break;//显示第7位 }

GPIO_DIG=DisplayData[i];//发送段码

j=50; //扫描间隔时间设定 while(j--);

GPIO_DIG=0x00;//消隐 } }

void exter0() interrupt 0 //外部中断脉冲计数

{ //M法测速度(外部中断0和定时器0用在M法测速上)

Inlpuse++; }

void timer0() interrupt 1 {

TH0 = 0x3c; //重装初值 TL0 = 0xb0; time++;

if(time>=20) //1s钟读取一次转速 (2*60ms) { EX0 = 0; TR0 = 0;

num=Inlpuse; //计算转速 Inlpuse=0;

PIDControl();// 100ms 控制一次 Inlpuse=0; EX0 = 1; TR0 = 1; } }

void T1_time() interrupt 3 {

count1++;

if(count1 >= 100) count1 = 0; //计时100us*100=10ms=100Hz

if(count1 < value) pwm = 1; //占空比 else pwm = 0; }

void SystemInit() {

TMOD = 0x21; //设定时器0为工作方式1,定时器1为工作方式2(自动重装初值)

TH0 = 0x3c; //设定50ms一次中断 TL0 = 0xb0;

TH1 = 0x9c; //设定100us一次中断 TL1 = 0x9c;

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

ET1 = 1; //开定时器1中断 EX0 = 1; //开外部中断0

IT0 = 1; //启动下降沿触发有效

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

void main() {

SystemInit(); while(1) {

DigDisplay(); } }

AD采集模块:(这一部分程序只是AD采集模块,用的芯片是XPT2046,用spi通信方式,最后改变电位器可以改变temp的值,这部分程序读者可以自己解决,) #ifndef __XPT2046_H_ #define __XPT2046_H_

//---包含头文件---// #include #include

//---重定义关键词---// #ifndef uchar

#define uchar unsigned char #endif

#ifndef uint

#define uint unsigned int #endif

#ifndef ulong

#define ulong unsigned long #endif

//---定义使用的IO口---// sbit DOUT = P3^7; //输出 sbit CLK = P3^6; //时钟 sbit DIN = P3^4; //输入 sbit CS = P3^5; //片选 uint Read_AD_Data(uchar cmd); uint SPI_Read(void);

void SPI_Write(uchar dat); #endif

#include\

/**************************************************************************** *函数名:TSPI_Start *输 入:无 *输 出:无

*功 能:初始化触摸SPI

****************************************************************************/

void SPI_Start(void) { CLK = 0; CS = 1; DIN = 1; CLK = 1; CS = 0; }

/**************************************************************************** *函数名:SPI_Write

*输 入:dat:写入数据 *输 出:无

*功 能:使用SPI写入数据

****************************************************************************/

void SPI_Write(uchar dat)

{

uchar i; CLK = 0;

for(i=0; i<8; i++) {

DIN = dat >> 7; //放置最高位 dat <<= 1; CLK = 0; //上升沿放置数据 CLK = 1; } }

/**************************************************************************** *函数名:SPI_Read *输 入:无

*输 出:dat:读取 到的数据 *功 能:使用SPI读取数据

****************************************************************************/

uint SPI_Read(void) { uint i, dat=0; CLK = 0; for(i=0; i<12; i++) //接收12位数据 { dat <<= 1; CLK = 1; CLK = 0; dat |= DOUT; } return dat; }

/**************************************************************************** *函数名:Read_AD_Data

*输 入:cmd:读取的X或者Y

*输 出:endValue:最终信号处理后返回的值 *功 能:读取触摸数据

****************************************************************************/ uint Read_AD_Data(uchar cmd)

{ }

uchar i;

uint AD_Value; CLK = 0; CS = 0;

SPI_Write(cmd);

for(i=6; i>0; i--); //延时等待转换结果

CLK = 1; //发送一个时钟周期,清除BUSY _nop_(); _nop_(); CLK = 0; _nop_(); _nop_();

AD_Value=SPI_Read(); CS = 1;

return AD_Value;

本文来源:https://www.bwwdw.com/article/niw5.html

Top