基于单片机的pwm电机控制.docx
《基于单片机的pwm电机控制.docx》由会员分享,可在线阅读,更多相关《基于单片机的pwm电机控制.docx(34页珍藏版)》请在冰豆网上搜索。
基于单片机的pwm电机控制
目录
第一章:
绪论…………………………………………………
第二章:
统设计要求和解决方案…………………………………
2.1系统设计要求……………………………………………………………2.2解决方案…………………………………………
第三章:
硬件系统设计……………………………………………
3.1电源模块设计………………………………………………………
3.2键盘模块设计…………………………………………………………
3.3显示模块设计…………………………………………………………
3.4电机驱动电路-H桥模块设计………………………………………
3.5霍尔测速模块设计……………………………………………………
3.6ADC转换模块设计………………………………………………………
3.7单片机双机通讯模块设计…………………………………………
第四章:
软件系统及程序流程图…………………………………
第五章:
心得体会……………………………………………
附录一硬件原理图…………………………………………
附录二元件清单…………………………………………
附录三参考文献………………………………………………
第一章绪论
直流电动机具有优良的调速特性和良好的启动性能和调速特性,调速平滑、方便,调速范围广;过载能力大,能承受频繁的冲击负载,可实现频繁的无级快速起动、制动和反转;能满足生产过程自动化系统各种不同的特殊运行要求,启动转矩大,最大转矩大,能在宽广的范围内平滑、经济地调速,转速控制容易,调速后效率很高。
与交流调速相比,直流电机结构复杂,生产成本高,维护工作量大。
电动机调速系统采用微机实现数字化控制,是电气传动发展的主要方向之一。
采用微机控制后,整个调速系统实现全数字化,结构简单,可靠性高,操作维护方便,电动机稳态运转时转速精度可达到较高水平,静动态各项指标均能较好地满足工业生产中高性能电气传动的要求。
由于单片机性能优越,具有较佳的性能价格比,所以单片机在工业过程及设备控制中得到日益广泛的应用。
PWM调速系统与可控整流式调速系统相比有下列优点[1]:
由于PWM调速系统的开关
频率较高,仅靠电枢电感的滤波作用就可获得平稳的直流电流,低速特性好;同样,由于开关频率高,快速响应特性好,动态抗干扰能力强,可以获得很宽的频带;开关器件只工作在开关状态,主电路损耗小,装置效率高。
PWM调速系统很早已出现,但是因为缺乏高速开关元件而未能在生产实际中推广应用。
在近年来,由于大功率开关器件的制造成功和成本的不断下降,PWM调速系统又受到重视。
尽管如此,我认为设计一个直流电机调速系统,不论是从学习还是实践的角度,对一名电子信息工程专业的大学生都会产生积极地作用,有利于提高学习热情。
第二章系统设计要求和解决方案
2.1系统设计要求
1、设计题目:
直流电机数字调速系统。
2、课设内容:
(1)、本地控制
①通过键盘设置电机转速(给定值),通过控制程序使直流电机达到给定转速;
②通过电位器设置电机转速(给定值),通过控制程序使直流电机达到给定转速;
(2)、本地控制与远传控制(选作)
通过键盘或电位器设置电机转速(给定值),实现本地直流电机的转速控制,同时,利用通讯模块(有线),控制远方电机的转速。
3、具体要求及说明:
(1)、八段码数码管或(LCD液晶显示器—可选)显示给定转速和实际转速;
要求:
直流电机按照给定的转速运行,当给定值变化时,电机转速随之变化。
同时在LED显示(8位八段码)给定转速值和实际转速值,显示格式如上下图所示:
(2)、键盘设置参数可以把键盘定义为数字键(0-9)、设置键、通讯键、确认键和开始(运行)、停止键等。
也可利用少键盘定义一键多能,如设置键、加一、减一、确认、开始(运行)、停止键等。
(3)、速度上限和下限报警功能,如高于转速120%或低于转速20%,通过声光器件报警。
(4)、速度可以考虑正反转。
2.2解决方案
1、键盘设置电机转速
(1)、原理
通过键盘按键在数码管上显示出来电机的给定转速,键盘给定的数字量越大,PWM占空比越大,就驱动晶体管导通的时间越长,这样输出的计数脉冲在单位时间内也就越多,这样就相当于电机的电压越大,其转速也就会越快,我们再用单片机对输出脉冲计数,PID调节器就把这个计数脉冲和预先设定的值进行比较,比设定值小,这样就会得到一个偏差,再把这个偏差给定电压,这样就相当于加大了PWM的占空比,要是比设定值大,这样也会得到一个偏差,就把这个变差与给定的电压向减,这样就可以减少PWM的占空比,通过改变占空比来改变晶体管的导通时间,就可以改变压频转换器的输入电压,也就改变压频转换器的单位计数脉冲,达到调电动机速度的目的。
电机转速控制原理示意图
2、AD转换设置电机转速
(1)、原理
基本的设计核心是运用PID调节器,运用A/D转换芯片将滑动变阻器的模拟电压转换为数字量作为控制直流电机速度的给定值;我们现运用AD芯片,运用单片机来控制AD芯片来转换模拟电压到数字电压,AD给定的电压越大,则产生的数字量越大,单片机再控制这个数字量来产生一个PWM,PWM占空比越大,就驱动晶体管导通的时间越长,这样加到压频转换器的电压也就越大,电压越大,则压频转换器输出的计数脉冲再单位时间也就越多,这样就相当于电机的电压越大,其转速也就会越快,我们再用单片机对压频转换器的输出脉冲计数,PID调节器就把这个计数脉冲和预先设定的值进行比较,比设定值小,这样就会得到一个偏差,再把这个偏差加到AD的给定电压,这样就相当于加大了PWM的占空比,要是比设定值大,这样也会得到一个偏差,就把这个变差与给定的电压向减,这样就可以减少PWM的占空比,通过改变占空比来改变晶体管的导通时间,就可以改变压频转换器的输入电压,也就改变压频转换器的单位计数脉冲,达到调电动机速度的目的。
(2)、模块图
3、单片机双机通讯
(1)、基本概念
①数据通信的传输方式
单工方式:
数据仅按一个固定方向传送。
因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集。
半双工方式:
数据可实现双向传送,但不能同时进行,实际的应用采用某种协议实现收/发开关转换。
全双工方式:
允许双方同时进行数据双向传送,但一般全双工传输方式的线路和设备较复杂。
多工方式:
以上三种传输方式都是用同一线路传输一种频率信号,为了充分地利用线路资源,可通过使用多路复用器或多路集线器,采用频分、时分或码分复用技术,即可实现在同一线路上资源共享功能,我们盛之为多工传输方式。
② 串行数据通信两种形式:
异步通信:
在这种通信方式中,接收器和发送器有各自的时钟,它们的工作是非同步的,异步通信用一帧来表示一个字符,其内容如下:
一个起始位,仅接着是若干个数据位,图2是传输45H的数据格式。
同步通信:
同步通信格式中,发送器和接收器由同一个时钟源控制,为了克服在异步通信中,每传输一帧字符都必须加上起始位和停止位,占用了传输时间,在要求传送数据量较大的场合,速度就慢得多。
同步传输方式去掉了这些起始位和停止位,只在传输数据块时先送出一个同步头(字符)标志即可。
(2)、模块图
4、调速原理
PWM(即脉冲宽度调制)是通过控制固定电压的直流电源开关频率,改变负载两端的电压,从而达到控制要求的一种电压调整方法。
PWM可以应用在许多方面,比如:
电机调速、温度控制、压力控制等等。
采用由达林顿管组成的H型PWM电路。
用单片机控制达林顿管使之工作在占空比可调的开关状态,精确调整电动机转速。
这种电路由于工作在管子的饱和截止模式下,效率非常高;H型电路保证了可以简单地实现转速和方向的控制;电子开关的速度很快,稳定性也极佳,是一种广泛采用的PWM调速技术。
我们采用了定频调宽方式,因为采用这种方式,电动机在运转时比较稳定;并且在采用单片机产生PWM脉冲的软件实现上比较方便。
且对于直流电机,采用软件延时所产生的定时误差在允许范围。
第三章硬件系统
3.1电源模块设计
(1)、原理
通过变压器将220V的交流电压变为约为12V的交流电压,通过整流桥将交流电压变为直流电压,由于电压有波动,需经电容滤波滤除杂波,而后在经过稳压管(三端稳压集成电路有正电压输出的78××系列和负电压输出的79××系列。
故名思义,三端IC是指这种稳压用的集成电路只有三条引脚输出,分别是输入端、接地端和输出端。
)7805和7809将电压变为基本稳定的5V和9V的直流电压
(2)、电路图
3.2键盘模块设计
(1)、原理
键是一种常开型按钮开关,平时键的二个触点处于断开状态,按下键时它们才闭合。
键盘上闭合键的识别由专用的硬件译码器实现并产生键编号或键值的称为编码键盘,在按键数量较多的场合,矩阵键盘与独立按键键盘相比,要节省很多的I/O口。
矩阵键盘的按键设置在行、列线的交点上,行、列线分别连接到按键开关的两端。
列线通过上拉电阻接到+5V。
平时无按键动作时,列线处于高电平状态,而当由按键按下时,列线电平状态将由与此列线相连的行线电平决定。
行线电平如果为低,则列线电平为低;行线电平如果为高,则列线电平亦为高。
当键盘中没有键按下时,所有行线的输出都应为低电平,以区别于列线状态,当矩阵键盘中任何一只键按下时,与门输出由高电平变为低电平,向CPU申请中断,由于矩阵键盘中行、列线为多键共用,各按键均影响该键所在行和列的电平。
因此各按键彼此将相互发生影响,所以必须将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置。
(2)、电路图
键值
789*
456键盘
123AD
清零0确认停止
3.3显示模块设计
(1)、原理
数码管显示电路的链接比较简单,当键盘输入的键值(即转速值)输入完成后,数码管开始进行显示,从低到高依次显示速度值的百位,十位和个位。
依靠不断扫描形成全部都显示的目的
(2)、电路图
3.4电机驱动电路-H桥模块设计
(1)、原理
H桥式电机驱动电路包括4个三极管和一个电机,电路得名于“H桥驱动电路”是因为它的形状酷似字母H。
要使电机运转,必须导通对角线上的一对三极管。
根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。
(2)、电路图
3.5霍尔测速模块设计
(1)、霍尔传感器的工作原理
霍尔开关集成电路中的信号放大器将霍尔元件产生的幅值随磁场强度变化的霍尔电压UH放大后再经信号变换器、驱动器进行整形、放大后输出幅值相等、频率变化的方波信号。
信号输出端每输出一个周期的方波,代表转过了一个齿。
单位时间内输出的脉冲数N,因此可求出单位时间内的速度V=NT,从而实现达到测电机转速的功能。
(2)、电路图
3.6ADC转换模块设计
(1)、原理
在这里ADC转换我们通过IIC总线原理来实现的。
IIC总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
各种被控制电路均并联在这条总线上,所以每个电路和模块都有唯一的地址,在信息的传输过程中,IIC总线上并接的每一模块电路既是主控器,又是发送器,这取决于它所要完成的功能。
CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别及需要调整的量。
IIC总线在传送数据过程中共有三种类型信号,它们分别是:
开始信号、结束信号和应答信号。
开始信号:
SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:
SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:
接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
(2)、电路图
3.7单片机双机通讯模块设计
串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。
由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。
(1)、原理
①波特率选择:
波特率就是在串口通信中每秒能够发送的位数。
MCS-51串行端口在四种工作模式下有不同的波特率计算方法。
②通信协议的使用:
通信协议是通信设备在通信前的约定。
单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。
假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:
0xA1:
单片机读取P0端口数据,并将读取数据返回PC机;
0xA2:
单片机从PC机接收一段控制数据;
0xA3:
单片机操作成功信息。
(2)、电路图
第四章软件系统程序及流程图
4.1、软件系统程序
(1)单片机①软件系统程序
/****************************
包含头文件
****************************/
#include
#include
/**************************
数码管表格
***************************/
unsignedcharledmap[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8c,0xf0,0xbf};//0x88,0x83,0xc6,0xa1,0x86,0x8e
unsignedcharledbuf[8];
unsignedcharflag;
unsignedcharnum=0;
unsignedcharkeybuf[2];
unsignedcharm,n,k,l,s;
unsignedcharkeydata;//键盘输入值
unsignedintcount=0;//定时器的累加器
unsignedintCYCLE;//定义定时器的周期
unsignedintplus=0;//接收到外部脉冲的数
unsignedchardatabuf;//转速处理值
unsignedintCYC;//定义周期该数字X基准定时时间如果是1000则周期是1000x0.1ms
unsignedintPWM_ON;//定义高电平时间
unsignedintcont;
unsignedchartmp;//串口接收值
unsignedcharFlag1=0;
unsignedchartt=0;
unsignedcharj;
sbitled1=P3^5;
sbitpwm=P3^6;//定义pwm输出口
sbitBee=P3^7;//定义蜂鸣器端口
/*----------------------------
定时器初始化子程序
--------------------------*/
voidInit_Timer(void)
{TMOD|=0x21;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=0xDC;
TL0=0x00;//定时10mS
TH1=0xA3;//晶振12M定时0.1ms
TL1=0xA3;
ET0=1;//定时器中断打开
ET1=1;
}
/*****************************
延时子程序
*****************************/
voiddelay(unsignedchart)
{unsignedchari;
while(t--!
=0)
for(i=255;i!
=0;i--);
}
/*----------------------------
定时器初始化子程序
---------------------------*/
voidInit_int0(void)
{IT0=1;//电平触发
EX0=1;//外部中断0开
}
/*----------------------------
外部中断0中断子程序
---------------------------*/
voidint0(void)interrupt0
{plus++;
led1=~led1;
}
/*--------------------------
定时器中断子程序
----------------------------*/
voidtime0(void)interrupt1
{count++;
if(count==CYCLE)
{count=0;
databuf=plus;
plus=0;
if(tt!
=2)
tt++;
}
TH0=0xDC;
TL0=0x00;//定时10mS
}
/*----------------------------
转速数据处理显示子程序
---------------------------*/
voiddatamake(unsignedintth)
{unsignedchara1,a2;
a1=th/10;
a2=th%10;
ledbuf[0]=ledmap[10];
ledbuf[1]=ledmap[12];
ledbuf[2]=ledmap[a1];
ledbuf[3]=ledmap[a2];
}
/***************************
定时器中断函数
****************************/
voidtime1(void)interrupt3//定时器1中断
{cont++;
if(cont==PWM_ON)
{pwm=1;}//灯灭
if(cont==CYC)
{cont=0;
pwm=0;
}//灯亮
}
/*****************************
按键检测子程序
***************************/
unsignedchartestkey()
{P1=0x0f;
return(~P1&0x0f);
}
/*****************************
比较处理函数
****************************/
voidcompare(unsignedintth1,unsignedintth2)
{if(th1!
=th2)
{if(th1Flag1=1;
else
Flag1=2;
if(Flag1==1)
{PWM_ON=PWM_ON+10;
if(PWM_ON>800)
{Bee=0;
delay(100);
Bee=1;
}
}
if(Flag1==2)//亮度递减同上,是个相反的过程
{PWM_ON=PWM_ON-5;
if(PWM_ON<45)
{Bee=0;
delay(100);
Bee=1;
}
}
}
}
/*****************************
函数功能:
LED显示子程序
*****************************/
voiddisplay()
{unsignedchari;
unsignedcharpos;
unsignedcharled;
pos=0xfe;
for(i=0;i<8;i++)
{P2=0xff;
led=ledbuf[i];
P0=led;
P2=pos;
delay
(1);
pos=_crol_(pos,1);
}
}
/****************************
函数功能:
键盘扫描子程序
****************************/
voidkeyscan(void)
{unsignedcharn;
//扫描第一行
P1=0xfe;
n=P1;
n&=0xf0;
if(n!
=0xf0)
{P1=0xfe;
n=P1;
n&=0xf0;
if(n!
=0xf0)
{switch(n)
{case(0xe0):
flag=7;break;
case(0xd0):
flag=4;break;
case(0xb0):
flag=1;break;
case(0x70):
flag=0x0a;break;
}
}
}
//扫描第二行
P1=0xfd;
n=P1;
n&=0xf0;
if(n!
=0xf0)
{P1=0xfd;
n=P1;
n&=0xf0;
if(n!
=0xf0)
{switch(n)
{case(0xe0):
flag=8;break;
case(0xd0):
flag=5;break;
case(0xb0):
flag=2;break;
case(0x70):
flag=0;break;
}
}
}
//扫描第三行
P1=0xfb;
n=P1;
n&=0xf0;
if(n!
=0xf0)
{P1=0xfb;
n=P1;
n&=0xf0;
if(n!
=0xf0)
{switch(n)
{case(0xe0):
flag=9;break;
case(0xd0):
flag=6;break;
case(0xb0):
flag=3;break;
case(0x70):
flag=0x0b;break;
}
}
}
//扫描第四行
P1=0xf7;
n=P1;
n&=0xf0;
if(n!
=0xf0)
{P1=0xf7;
n=P1;
n&=0xf0;
if(n!
=0xf0)
{switch(n)
{case(0xe0):
flag=0x0f;break;
case(0xd0):
flag=0x0e;break;
case(0xb0):
flag=0x0d;break;
case(0x70):
flag=0x0c;break;
}
}
}
}
/****************************
A/D转换子程序
*****************************/
voiduart_int()
{SCON=0x50;//设定串行口工作方式
PCON&=0xef;//波特率不倍增
TH2=0xFF;
TL2=0xDC;
RCAP2H=0xFF;//波特率9600
RCAP2L=0xDC;
T2CON=0x34;//定时器1工作于8位自动重载模式,用于产生波特率
TR2=1;//启动定时器1
}
/****************************
函数功能:
主程序
*****************************/
voidmain(void)
{unsignedchari;
bitconv;
num=0;
pwm=1;
CYCLE=100;
CYC=1