资源描述
第一章:序言
Pwm 电机调速原理 对于电机转速调整,我们是采取脉宽调制(PWM)措施,控制电机 时候,电源并非连续地向电机供电,而是在一个特定频率下以方 波脉冲形式提供电能。不一样占空比方波信号能对电机起到调速作 用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突 变能力,所以脉冲输入信号被平均分配到作用时间上,这么,改变 在始能端 EN1 和 EN2 上输入方波占空比就能改变加在电机两端 电压大小,从而改变了转速。 此电路中用微处理机来实现脉宽调制,通常方法有两种:
(1)用软件方法来实现,即经过实施软件延时循环程序交替改变端 口某个二进制位输出逻辑状态来产生脉宽调制信号,设置不一样延时 时间得到不一样占空比。
(2)硬件试验自动产生 PWM 信号,不占用 CPU 处理时间。 这就要用到 STC89C52 在 PWM 模式下计数器 1,具体内容可参考 相关书籍。
51 单片机 PWM 程序
产生两个 PWM,要求两个 PWM 波形占空全部为 80/256,两个波形之间要 错开,不能同时为高电平!高电平之间相差 48/256,
PWM 这个功效在 PIC 单片机上就有,不过假如你就要用 51 单片机
话,也是能够,不过比较麻烦.能够用定时器 T0 来控制频率,定 时器 T1 来控制占空比:大致编程思绪是这么:T0 定时器中止 是让一个 I0 口输出高电平,在这个定时器 T0 中止当中起动定时器 T1,而这个 T1 是让 IO 口输出低电平,这么改变定时器 T0 初值就 能够改变频率,改变定时器 T1 初值就能够改变占空比。
1.1 序言:
直流电机定义:将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能 (直流发电机)旋转电机。
多年来,伴随科技进步,直流电机得到了越来越广泛应用,直流含有优 良调速特征,调速平滑,方便,调速范围广,过载能力强,能承受频繁冲击 负载,可实现频繁无极快速起动、制动和反转,需要满足生产过程自动化系统 多种不一样特殊要求,从而对直流电机提出了较高要求,改变电枢回路电阻调 速、改变电压调速等技术已远远不能满足现代科技要求,这是经过 PWM 方法控 制直流电机调速方法就应运而生。
采取传统调速系统关键有以下缺点:模拟电路轻易随时间飘移,会产生 部分无须要热损耗,和对噪声敏感等。而用 PWM 技术后,避免上述缺点, 实现了数字式控制模拟信号,能够大幅度减低成本和功耗。而且 PWM 调速系统开 关频率较高,仅靠电枢电感滤波作用就能够取得平滑直流电流,低速特征好; 同时,开关频率高,快响应特征好,动态抗干扰能力强,可获很宽频带;开关 元件只需工作在开关状态,主电路损耗小,装置效率高,含有节省空间、经济 好等特点。
伴随中国经济和文化事业发展,在很多场所,全部要求有直流电机 PWM 调速系统来进 行调速,诸如汽车行业中多种风扇、刮水器、喷水泵、熄火器、反视镜、宾馆中自动门、 自动门锁、自动窗帘、自动给水系统、柔巾机、导弹、火炮、人造卫星、宇宙飞船、舰艇、 飞机、坦克、火箭、雷达、战车等场所。
1.2 本设计任务:
任务: 单片机为控制关键直流电机 PWM 调速控制系统 设计关键内容和技术参数:
功效关键包含:
1) 直流电机正转;
2) 直流电机反转;
3) 直流电机加速;
4) 直流电机减速;
5) 直流电机转速在数码管上显示;
6) 直流电机开启;
7) 直流电机停止;
第二章:总体设计方案
总体设计方案硬件部分具体框图图一所表示。
数码管显示
按键控制
单片机
PWM 电机驱动
键盘向单片机输入对应控制指令,由单片机经过 P1.0 和 P1.1 其中一口输出和转速相 应 PWM 脉冲,另一口输出低电平,经过信号放大、光耦传输,驱动 H 型桥式电动机控制电 路,实现电动机转向和转速控制。电动机运转状态经过数码管显示出来。电动机所处速 度级以速度档级数显示。正转时最高位显示“三” ,其它三位为电机转速;反转时最高位 显示“F”,其它三位为电机转速。每次电动机开启后开始显示,停止时数码管显示出“0000”。
1、系统硬件电路设计和分析
电动机 PWM 驱动模块电路设计和实现具体电路见下图。本电路采取是基于 PWM 原理 H 型桥式驱动电路。
PWM 电路由复合体管组成 H 型桥式电路组成,四部分晶体管以对角组合 分为两组:依据两个输入端高低电平决定晶体管导通和截止。4 个二极 管在电路中起预防晶体管产生反向电压保护作用,预防电动机两端电流 和晶体管上电流过大保护作用。
在试验中控制系统电压统一为 5v 电源,所以若复合管基极由控制系 统直接控制,则控制电压最高为 5V,再加上三极管本身压降,加到电动机两 端电压就只有 4V 左右,严重减弱了电动机驱动力。基于上述考虑,我 们利用了 TLP521-2 光耦集成块,将控制部分和电动机驱动部分隔离开来。 输入端各经过一个三极管增大光耦驱动电流;电动机驱动部分经过外接 12V 电源驱动。这么不仅增加了各系统模块之间隔离度,也使驱动电流得 到了大大增强。
在电动机驱动信号方面,我们采取了占空比可调周期矩形信号控制。 脉冲频率对电动机转速有影响,脉冲频率高连续性好,但带带负载能力差脉 冲频率低则反之。经试验发觉,当电动机转动平稳,但加负载后,速度下降
显著,低速时甚至会停转;脉冲频率在 10Hz 以下,电动机转动有显著跳动 现象。而具体采取频率可依据部分电动机性能在此范围内调整。经过 P10 输入高电平信号,P11 输入低电平,电机正转;经过 P10 输入低电平信号, P11 输入高电平,电机反转;P10、P11 同时为高电平或低电平时,电机不转。 经过对信号占空比调整来对电机转速进行调整。
2、系统软件设计
本系统编程部分工作采取 KELI-C51 语言完成,采取模块化设计方法, 和各子程序做为实现各部分功效和过程入口,完成键盘输入、按键识别和 功效、PWM 脉宽控制和数码管显示等部分设计。
单片机资源分配以下表:
P0
显示模块接口
键盘中止
P1
键盘模块接口
P1.0/P1.1
PWM 电机驱动接口
系统时钟
①PWM 脉宽控制:本设计中采取软件延时方法对脉冲宽度进行控制,延时程 序函数以下:
/*****************延时函数*************************/ delays()
{
uchar i; for(i=5000;i>0;i--);
}
②键盘中止处理子程序:采取中止方法,按下键,完成延时去抖动、键码识 别、按键功效实施。
要实现按住加/减速键不放时恒加或恒减速直到放开停止,就需在判定是否松 开该按键时,每进行一次增加/降低一定占空比。
③显示子程序:利用数组方法定义显示缓存区,缓存区有 8 位,分别存放各 个数码管要显示值。
④定时中止处理程序:采取定时方法 1,因为单片机使用 12M 晶振,可产生 最高约为 65.5ms 延时。对定时器置初值 B1E0H 可定时 20ms,即系统时钟精度 可达 0.02s。当 20ms 定时时间到,定时器溢出则响应该定时中止处理程序,完 成对定时器再次赋值,并对全局变量 time 加 1,这么,经过变量 time 可计算 出系统运行时间。
3、软件设计中特点:
对于电机启停,在 PWM 控制上使用渐变脉宽调整,即开启后由停止匀加速到默认速 度,停止则因为目前速度逐步降至零。这么有利于保护电机。键盘处理上采取中止方法,不 必使程序对键盘反复扫描,提升了程序效率。
第三章:系统硬件电路设计
第四章:系统功效调试
3、输出波形以下:
4、加速分 5 档,波形依次以下:
5、减速分 5 档,波形以下:
第五章:程序
/************头文件*********/
#include<reg51.h>
#include<absacc.h>
#include <intrins.h>
/************************** /
/********自定义变量********/
#define uint unsigned int //自定义变量
#define uchar unsigned char char gw,sw,bw,qw;
uchar j; //定时次数,每次 20ms uchar f=5; //计数次数
sbit P10=P1^0; //PWM 输出波形 1 sbit P11=P1^1; //PWM 输出波形 2 sbit P12=P1^2; //正反转
sbit P13=P1^3; //加速 sbit P14=P1^4; //减速 sbit P15=P1^5; //停止 sbit P16=P1^6; //开启 uchar k;
uchar t; //脉冲加减
/**************************/*
/*********控制位定义********************/
uchar code
smg[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x73,0x71};// 程 序存放区定义字型码表
char data led[4]={0x08,0x04,0x02,0x01}; //位码 uint x; //数码管显示数值
display(); //数码管显示 delays(); //延时函数 key();
displays();
/*****************************************/
/***************主函数********************/ main (void)
{
TMOD=0x51; //T0 方法 1 定时计数 T1 方法 1 计数 TH0=0xb1; //装入初值 20MS
TL0=0xe0;
TH1=0x00; // 计数 567 TL1=0x00;
TR0=1; //开启 t0
TR1=1; //开启 t1 gw=sw=bw=qw=0; //数码管初始化 P0=0xc0;
P2=1;
while(1) //无限循环
{
display(); //数码管显示 key();
}
}
/*****************************************/
/***************数码管显示****************/ display()
{
uchar i;
gw=x%10; //求速度个位值,送到个位显示缓冲区 sw=(x/10)%10; //求速度十位值,送到十位显示缓冲区 bw=(x/100)%10; //求速度百位值,送到百位显示缓冲区 qw=x/1000; //求速度千位值,送到千位显示缓冲区 for(i=0;i<4;)
{
P2=led[i];
if(i==0) //显示个位
{
P0=smg[gw]; delays();
}
else if(i==1) //显示十位
{
P0=smg[sw]; delays();
}
else if(i==2) //显示百位
{
P0=smg[bw]; delays();
}
else if(i==3) //显示千位
{
if(k==0) //正转时显示"三"
{
P0=0x49;
delays();
}
else
{
i++;
}
}
P0=0x71; //反转时显示"F"
}
}
/*******************************************************/
/*****************延时函数*************************/ delays()
{
uchar i; for(i=5000;i>0;i--);
}
/************************************************/
/*********t0 定时*中止函数*************/ void t0() interrupt 1 using 2
{
TH0=0xb1; //重装 t0 TL0=0xe0;
f--;
if(k==0)
{
if(f<t) P10=1;
else P10=0; P11=0;
}
else
{
if(f<t) P11=1;
else P11=0; P10=0;
}
if(f==0)
{ f=5;
} j++;
if(j==50)
{ j=0;
x=TH1*256+TL1; //t1 方法 1 计数,读入计数值 TH1=0x00;
TL1=0x00;
x++;
display();
}
}
/****************按键扫描**************/ key()
{
if(P12==0) //假如按下,
{
while(!P12) //去抖动 display();
k=~k;
}
if(P16==0) //开启
{
while(P16==0); IE=0x8a;
}
if(P13==0) //加速
{
while (P13==0); t++;
}
if(t>=5) t=5;
if(P14==0) //减速
{
while(P14==0); t--;
}
if(t<1) t=1;
if(P15==0) //停止
{
while(P15==0);
EA=0; P10=0; P11=0;
}
}
/******************************************************/
展开阅读全文