计算机控制课程设计:直流电机调速系统
计算机控制课程设计
直流电机调速系统
一. 实验要求
(1) 使用PID 算法实现直流电机的调速控制。
(2) 利用光电开关测量直流电机转速,通过控制加在直流电机两端的电压调节
其转速,使之达到所设置的转速。
(3) 通过键盘设置期望转速,要求有两组转速显示值,一组为期望转速;一组
为电机的实时转速。
二. 系统需求分析
(1)电机控制需要驱动电路,常用的电机驱动电路是H 桥驱动,bts7960是常用的半桥驱动芯片,利用PWM 波控制半桥驱动电路可实现对电机的速度调节。两片bts7960可以组成一个全桥驱动电路,可以控制电机的转向。实验不要求控制转向,所以可用一片bts7960。
(2)电机控制需要PWM 波,可以利用单片机的定时器模拟PWM ,用一个普通IO 接口进行输出。
(3)光电开关测速输出为脉冲信号,通过检查输出脉冲的频率来计算电机转速,检查信号的频率可以利用单片机的计数器模块。检查脉冲频率需要没个固定时间读取计数器的值。利用一个定时器可以固定一定时间进行中断,在中断子程序中读取计数器的值。
(4)显示可用OLED 液晶屏,选用的液晶屏有SPI 通用接口,可以用普通IO 可模拟SPI 时序。
(5)根据以上要求,需要两个定时器,一个计数器。共需要三个定时器/计数器模块,和一些普通IO 接口,可选用STC89C52单片机,其内部共有三个定时器/计数器模块。定时器0工作在方式三,分为两个八位定时器TL0做计数器,TL1做模拟PWM ,定时器2做定时中断,定时器1作为串口波特率发生器,串口用于调试过程中观察数据。
三. 硬件设计
1. 主电路图:
本系统采用STC89C52单片机主要功能特性:
硬件接口说明:
串口接口:T - P3.0 R - P3.1 测速接口:P3.4
模拟PWM 电机控制接口:P1.0
OLED 显示屏接口:D0 – P2.3 D1 – P2.2 RST – P2.1 DC – P2.0
2. 电机驱动电路
该电机驱动电路是是由两片bts7960组成,BTS7960是NovalithIC 家族三个独立的芯片的一部分:一是p 型通道的高电位场效应晶体管,二是一个n 型通道的低电位场效应晶体管,结合一个驱动晶片, 形成一个完全整合的高电流半桥。所有三个芯片是安装在一个共同的引线框, 利用芯片对芯片和芯片芯片技术。电源开关应用垂直场效应管技术来确保最佳的阻态。由于p 型通道的高电位开关,需要一个电荷泵消除电磁干扰。通过驱动集成技术,逻辑电平输入、电流取样诊断、转换速率调整器,失效发生时间、防止欠电压、过电流、短路结构轻易地连接到一个微处理器上。BTS7960可结合其他的BTS7960形成全桥和三相驱动结构。 当EN1输入高电平EN2输入低电平时,左边的NMOS 导通PMOS 关断,右边的NMOS 关断,PMOS 导通,所以电机电流从左箱右流动,当两个输入口电压取反,MOS 管的开关状态变反,所以电流方向改变,电机转向也改变。
3.
稳压电路
7805
三端稳压集成电路,电子产品中,常见的三端稳压集成电路有正电压输出的78 ×× 系列。用78/79系列三端稳压IC 来组成稳压电源所需的外围元件极少,电路内部还有过流、过热及调整管的保护电路,使用起来可靠、方便,而且价格便宜。
4. 光栅测速码盘
工作原理:当有物体挡在红外光电发光二极管和高灵敏度的光电晶体管之间时,传感器将会输出一个低电平,而当没有物体挡在中间时则输出为高电平,从而形成一个脉冲。系统在光电传感器收发端间加入电动机,并在电动机的转轴上安装一转盘。在这个转盘的上挖一些光栅,把传感器的检测部分放在圆孔的光栅位置。每当转盘随着电机旋转的时候,传感器将向外输出若干个脉冲。可以利用单片机进行计数,即可算出轮子即时的转速
5.OLED 屏
简介:
OLED ,即有机发光二极管(Organic Light-Emitting Diode),又称 为有机电激光显示(Organic Electroluminesence Display, OELD)。
因为具备轻薄、省电等特性,因此从2003年开始,这种显示设备在MP3 播放器上得到了广泛应用,而对于同属数码类产品的DC 与手机,此前只 是在一些展会上展示过采用OLED 屏幕的工程样品。自2007 年后,寿命 得到很大提高,具备了许多LCD 不可比拟的优势。
四. 软件设计
1. 单片机资源分配
根据系统需求分析,电机测速需要一个计数器和一个定时器,电机控速PWM 需要一个定时器。测速定时中断设计为5ms 定时中断,使用定时器2,工作在自动重装工作方式。测速5ms 的脉冲数最大经测速约为200,所以可使用一个8位计数器,模拟PWM 频率为4KHZ ,周期为250us ,所以定时器最长定时时间需250us ,可使用一个8位定时器,所以可以将定时器0工作在工作方式3,作为两个8为定时器使用,因为TH0只能作为定时器,所以将TL0作为计数器用于测速,TH0作为定时器用于定时中断。定时器1作为串口波特率发生器,用于调试过程中查看数据变化。
2. 主函数
主函数流程图
定时器初始化:定时器0工作方式3,TL0做计数器,TH0做定时器,所以TMOD 寄存器值为0xo7。定时器2为5ms 定时中断,所以自动重装寄存器RCAP2H=(65536-5000)/256; RCAP2L=(65536-5000)%256;
因为定时器TH0中断频率比定时器2中断频率高很多,为了不运行定时器2中断程序正常运行将定时器2中断优先级设为高优先级,TH0中断设为低优先级,即PT2=1,PT1=0;
按键检测:按键查询检测可以检测低电平,也可进行下降沿检测,两者各有优缺点,低电平检测优点是程序简单,但对于单次按键检测需要添加延时,如延时过短,会使按下一次按键时检测到多次按键动作,如延时过长会影响程序执行效率。下降沿检测的优点是对于单次按键检测效果较好,但多以需要连续按键时需要多次进行按键操作,而且程序较复杂需求记录按键上次的输入值。
OLED 显示:OLED 是一种点阵型的显示屏,需要对显示的内容进行取模,有使用取模软件进行取模,可显示英文,数字,汉字,简单图形等。
3. 定时器TH0模拟PWM 中断子程序
通过定时设置PWM 高低电平时间。首先判断当前需输出的是高电平还是低电平,如果是高电平则将计数器计数寄存器TH0赋值为 256-高电平时间 ,如果输出的是低电平,则将计数器计数寄存器TH0赋值为高电平时间,在设置输出口设置为需输出的电平,这样就形成了一个周期为256us 的PWM 波。但由于C51序列单片机持程序执行速度较慢,该模拟的PWM 精度不是非常高,但对于电机的PID 控制仍能满足要求,之是在PID 参数上和精度较高的PWM 波控制的参数
有一定的差距。
TH0中断子程序流程图
4. 定时器2定时中断子程序
首先读取计数器TL0的计数值,得到的是光栅测速美5ms 输出的脉冲数,根据该脉冲数可计算得到电机当前的转速,Speed=fc *TL0/N 其中Speed 为转速,单位是转/秒,f c 为测速的频率,N 电机每转测速光栅输出的脉冲数。
得到电机转速后就可作为反馈量与设定速度进行比较,利用增量式的PI 控制方法计算PWM 输出量,对电机速度进行调整(具体算法将在下一部分进行说明)。
5ms 定时中断子程序流程图
5. 增量式PI 控制算法
当今的自动控制技术都是基于反馈的概念。反馈理论的要素包括三个部分:测量、比较和执行。测量关心的变量,与期望值相比较,用这个偏差纠正调节控制系统的响应。这个理论和应用的关键是,做出正确的测量和比较后,如何才能更好地纠正系统。
PID (比例(proportion )、积分(integration )、微分(differentiation ))控制器作为最早实用化的控制器已有近百年历史,现在仍然是应用最广泛的工业控制器。PID 控制器简单易懂,使用中不需精确的系统模型等先决条件,因而成为应用最为广泛的控制器。
PID 控制器由比例单元(P )、积分单元(I )和微分单元(D )组成。 PID 最初始的公式为
为了在计算机上实现PID 函数,需要离散化,得到离散化公式:
更为常用地,转换为增量式:
在电机控速系统中常用到的是PI 控制,即省去D 微分部分
对于电机控速,输出量Uk 就PWM 波的的占空比,ek 即当前速度与设定速度的误差。
PI 控制代码:
五. 系统整体调试
系统整体实物图
PID 参数整定:
试凑法是较为常用的一种PID 参数整定方法,这种方法不需要对系统进行建模,是根据控制器各参数对系统性能的影响程度, 边观察系统的运行, 边修改参数, 直到满意为止。
比例调节作用:是按比例反应系统的偏差, 系统一旦出现了偏差, 比例调节立即产生调节作用用以减少偏差。比例作用大, 可以加快调节, 减少误差, 但是过大的比例, 使系统的稳定性下降, 甚至造成系统的不稳定。
积分调节作用:是使系统消除稳态误差, 提高无差度。因为有误差, 积分调节
就进行, 直至无差, 积分调节停止, 积分调节输出一常值。积分作用的强弱取决与积分时间常数Ti,Ti 越小, 积分作用就越强。反之Ti 大, 则积分作用弱, 加入积分调节可使系统稳定性下降, 动态响应变慢。积分作用常与另两种调节规律结合, 组成PI 调节器或PID 调节器。
实验凑试法的整定步骤为" 先比例,再积分,最后微分" 。
(1)整定比例控制 将比例控制作用由小变到大,观察各次响应,直至得到反应快、超调小的响应曲线。
(2)整定积分环节 若在比例控制下稳态误差不能满足要求,需加入积分控制。 先将步骤(1)中选择的比例系数减小为原来的50~80%,再将积分时间置一个较大值,观测响应曲线。然后减小积分时间,加大积分作用,并相应调整比例系数,反复试凑至得到较满意的响应,确定比例和积分的参数。
六. 总结
经过测试,该电机控速系统可调转速范围为0~40转/秒,最大稳态误差为2转/秒,且抗干扰能力较强。
该系统的不足之处是,未加入软件控制电机的正反转,且没有对电机的正反转测速进行区别,这是该系统可以提高的地方。
总体而言,该系统已符合综合实验对系统的各个要求。
七. 附录(系统C51程序代码) :
#include "include.h"
////模拟PWM//////
sbit PWM1=P1^0; //驱动桥一端接PWM
sbit PWM2=P1^1; //另一端接低
bit flag_PWM=0; //模拟PWM 输出电平标志
int PWM_High=1; //模拟PWM 输出高平时间us ////测速/////////
unsigned char Timer0_Count=0; //计数器 TL0 读数 每5ms 光电码盘脉冲数 float Speed; //速度 单位 转/秒
////控速////////
float KP=15,KI=1.5;
float Speed_Set=0.0;
float Speed_Error=0,Speed_Error_last=0,delta_Speed_Error=0;
////////按键////////////
sbit Key1=P1^2;
sbit Key2=P1^3;
/********************延时子程序*****************/
void Delay1ms(u16 t)
{
u16 i,j;
for(i=0;i
for(j=0;j
}
/********************定时器初始化*****************/
void TC_Init(void)
{
TMOD=0x07; //定时器0工作方式3 TL0做计数器 TH0定时器 ET0=0; //TL0计数器中断禁止 ET1=1; //TH0定时器中断允许 ET2=1; //定时器2中断允许 TL0=0; TH0=0; RCAP2H=(65536-5000)/256; //TC2 重装寄存器 5ms 定时 RCAP2L=(65536-5000)%256; PT1 =0; PT2 =1; TR0=1; //定时器启动 TR1=1;
}
TR2=1;
/**********************主函数************************/
void main(void)
{
LCD_ReDisplay(); //显示屏初始化
TC_Init(); //定时器初始化
PWM2=0; //驱动桥一端输入低电平
Key1=1;
Key2=1;
EA=1;
while(1)
{
LCD_PutData8x16(80,2,Speed); //OLED显示
LCD_PutData8x16(80,4,Speed_Set);
Delay1ms(100);
if(!Key1) //按键调节设定速度
{
Speed_Set++;
}
if(!Key2)
{
Speed_Set--;
if(Speed_Set
}
}
}
/***********************定时器TH0 模拟PWM 频率4KHZ 占空比精度1/255*******************/
void Timer1_IRQ(void) interrupt 3
{
if(PWM_High>255) PWM_High=255; //PWM限制
else if(PWM_High
if(PWM_High)
PWM1=flag_PWM;
else
PWM1=0; //关闭电机
if(flag_PWM)
{
TH0=256-PWM_High; //高电平定时设置
}
else
{
} } TH0=PWM_High; //低电平定时设置 flag_PWM=~flag_PWM; //电平翻转
/**************定时器2 5ms定时中断 *******************/
void Timer2_IRQ(void) interrupt 5
{
EA=0;
////////测速////////// Timer0_Count=TL0; //读计数器
TL0=0; 值
//计数器清零
TF2=0;
Speed=Timer0_Count*0.25; //采样频率200hz 每转脉冲数800 Speed=Timer0_Count*200/800=Timer0_Count*0.25
////////PID控速////////
if(Speed_Set!=0)
{
Speed_Error=Speed_Set-Speed; //误差计算
delta_Speed_Error=Speed_Error-Speed_Error_last; //误差变化计算 de=e(K)-e(K-1)
Speed_Error_last=Speed_Error; //保存这次速度误差
PWM_High=PWM_High+(int)(KP*delta_Speed_Error+KI*Speed_Error ); //PWM输出计算
}
else
{
PWM_High=0; //输出为0
}
/////////////////////////
EA=1;
}