直流电机调速论文Word文档格式.docx
《直流电机调速论文Word文档格式.docx》由会员分享,可在线阅读,更多相关《直流电机调速论文Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
![直流电机调速论文Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/1/656123cb-016b-4cde-9ec4-555dc2c79089/656123cb-016b-4cde-9ec4-555dc2c790891.gif)
直接采用四个三极管搭成桥式电路来控制电机的转动。
由于系统要求驱动电机为小电机,考虑性价比上,直接采用四个三极管进行控制。
3、键盘电路的设计
由于系统要求功能简单,所以直接采用行式键盘进行控制。
键盘用来输入启动、停止信号和设定的速度值。
4、显示电路的设计
显示电路采用LCM1602进行显示。
5、速度测量电路的设计
速度测量采用光电开关,进行速度采集,经过单片机中断,将采样的数据经过换算,显示出来。
3.2.3系统组成
经过比较与论证,最终确定的系统组成框图如图1所示,其中采用ATmega16为主控制芯片,采用1602进行显示,键盘控制电路和电机控制电路。
图1系统组成框图
4、系统硬件的设计与实现
4.1ATmega16单片机主控制电路图
ATmega16芯片介绍:
该芯片是基于增强的AVRRISC结构的低功耗8位CMOS微处理器,数据吞吐率高达1MIPS/MHz。
有如下特点:
16K字节的系统内可编程Flash,512字节EEPROM,1K字节SRAM,32个通用I/O口线,32个通用工作寄存器,用于边界扫描的JTAG接口,支持片内调试与编程,三个定时器/计数器等。
引脚说明:
VCC:
数字电路的电源
GND:
地
端口A(PA7—PA0):
端口A作为A/D转换器的模拟输入端,为8位双向I/O口。
端口B(PB7—PB0):
8位双向I/O口。
端口C(PC7—PC0):
端口D(PD7—PD0):
~RESET:
复位输入引脚。
XTAL1:
反向振荡放大器与片内时钟操作电路的输入端。
XTAL2:
反向振荡放大器的输出端。
AVCC:
AVCC是端口A与A/D转换器的电源
AREF:
A/D的模拟基准输入引脚。
图2ATmega16单片机主控制电路图
4.2主要单元电路的设计
4.2.1显示电路的设计
该部分采用LCM1602液晶模块。
LCM1602是一种使用非常广泛的液晶模块,它支持5*7点阵和2行*16字符2两种模式,背光亮度和显示对比度可调,是一种功能较齐全,价格较便宜的液晶显示器件。
它由显示屏和驱动器两部分组成,单片机可通过写控制字的方式访问驱动器来实现对显示屏的控制。
图3LCM1602显示电路图
4.2.2键盘电路设计
键盘电路采用行式键盘电路
图4键盘电路图
4.2.3电机驱动电路的设计
图5电机驱动电路
工作原理简述如下:
当ctr_A=1,ctr_B=0:
则Q4导通Q2截止,Q3截止Q1导通。
于是电流i流经电机M的路径为:
VccQ1MD2Q4地,电机正转。
当ctr_A=0,ctr_B=1:
则Q3导通Q1截止,Q4截止Q2导通。
VccQ2MD1Q3地,电机反转。
采用光耦电路进行电路隔离,有效提高电路的抗干扰性,当OC1A为1时,则ctr_A=1,当OC1A为0时,则ctr_A=0。
图6光耦电路
4.2.4电机测速电路的设计
电机转速测量电路,采用光电开关进行对脉冲计数。
图7电机测速电路图
5、软件设计
软件编写主要包括PWM波形的产生,电机转速的实时检测,PID控制算法,键盘扫描和液晶显示程序。
5.1核心部分算法
1、PWM波形的产生
脉冲调制PWM开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。
通俗说的PWM就是波形,波形的波峰与波谷的关系成为占空比,可以通过PWM来控制电机。
AVR单片机可以轻松实现PWM功能。
ATmega16的timer0和timer2都具有PWM功能,timer0和timer2都为8位定时器。
timer2为异步操作定时器,在操作过程中要等待寄存器状态更改完成。
本设计中设定使用timer0来实现PWM功能。
OC0outputmode设定了PWM输出控制选择:
正常的端口操作,不与OC0相连接,比较匹配发生时OC0取反,比较匹配发生时OC0清零,比较匹配发生时OC0置位。
Waveformmode设定了波形产生模式:
比较匹配输出模式,快速PWM模式,相位修正PWM模式。
程序代码如下:
#include
voidport_init(void)
{
PORTA=0x00;
DDRA=0x00;
DDRB=0x08;
//PB3为PWM输出,非常重要,否则无法输出波形
DDRB=0x00;
PORTC=0x00;
//m103outputonly
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
}
//TIMER0initialize-prescale:
64
//WGM:
Normal
//desiredvalue:
1KHz
//actualvalue:
1.002KHz(0.2%)
voidtimer0_init(void)
TCCR0=0x00;
//stop
TCNT0=0x8D;
//设置定时器计数值/*TCNT0*/
OCR0=0x73;
//设置定时器比较的值/*OCR0*/
TCCR0=0x23;
//初始化控制timer0的寄存器/*TCCR0*/
#pragmainterrupt_handlertimer0_comp_isr:
20
voidtimer0_comp_isr(void)
//compareoccuredTCNT0=OCR0
#pragmainterrupt_handlertimer0_ovf_isr:
10
voidtimer0_ovf_isr(void)
//reloadcountervalue
//callthisroutinetoinitializeallperipherals
voidinit_devices(void)
//stoperrantinterruptsuntilsetup
CLI();
//disableallinterrupts
port_init();
timer0_init();
MCUCR=0x00;
GICR=0x00;
TIMSK=0x03;
//定时器中断选项/*TIMSK*/
SEI();
//re-enableinterrupts
//allperipheralsarenowinitialized
voidmain(void)/*加上这些,程序就可以运行了。
*/
init_devices();
while
(1)
;
程序中几个关键的寄存器的意义:
1.TCNT0:
定时器计数值,定时过程中不断增大,溢出后重新置数,开始下一轮。
2.OCR0:
定时器比较的值,当TCNT0=OCR0时,会产生timer0_comp_isr中断。
3.TCCR0:
控制timer0的寄存器。
4.TIMSK:
定时器中断选项,这里允许timer0比较中断,溢出中断。
5.预分频器:
预分频器是独立运行的。
也就是说,其操作独立于T/C的时钟选择逻辑,且它由T/C1与T/C0共享。
由于预分频器不受T/C时钟选择的影响,预分频器的状态需要包含预分频时钟被用到何处这样的信息。
一个典型的例子发生在定时器使能并由预分频器驱动(6>
CSn2:
0>
1)的时候:
从计时器使能到第一次开始计数可能花费1到N+1个系统时钟周期,其中N等于预分频因子(8、64、256或1024)。
PWM的工作流程:
1.初始化,定时器开始工作,TCNT0逐渐增大,在预分频这么多个时钟周期里变化一次。
2.输出比较寄存器包含一个8位的数据,不间断地与计数器数值TCNT0进行比较。
匹配事件可以用来产生输出比较中断,或者用来在OC0引脚上产生波形。
3.TCNT0溢出,溢出中断用于在OC0上产生波形,置位或者清零。
4.TCNT0复位,进行下一次定时操作。
PWM的占空比:
调节PWM的占空比,只需要用程序更改OCR0的值即可,根据不同的情况,可能是增加也可能是减小。
注意:
因为Timer2是异步控制器,使用Timer2时,调节OCR2需要等待寄存器更新完成才能进行其他操作。
2、PID控制算法
要使电机的转速稳定在某一预定的转速,需要随时监测(采样)电机的转速并与预定值(设定值)相比较,根据比较的结果来不断调整电机的转速,使之尽量接近设定值,这一过程成为闭环反馈控制,其控制方法(控制策略)称为控制算法,控制算法可以有多种多样,其中典型的一种算法叫做PID(比例—积分—微分)算法(或PID控制)。
PID控制有连续PID控制和数字PID控制两种,前者由模拟电子线路构成,不含智能元件(单片机),后者以微计算机为核心构成。
数字PID控制常常采用增量PID算法,表达式如下:
y(k)=y(k-1)+△y(k)
其中y(k)——第k次输出的控制(信号)值
y(k-1)——前一次输出的控制(信号)值
△y(k)——输出增量(可为正、负数)
△y(k)=kp[e(k)-e(k-1)]+kie(k)+kd[e(k)-2e(k-1)+e(k-2)]
其中kp——比例系数
Ki——积分系数
Kd——微分系数
e(k):
第k次采样时的偏差值(采样值与设定值之差)
e(k-1):
第k-1次采样时的偏差值(采样值与设定值之差)
e(k-2):
第k-2次采样时的偏差值(采样值与设定值之差)
闭环系统框图如下:
voidPID()
{
inty;
//本次速度值
floatu;
//电压差值
intz;
//输出增量
intt;
//采样时间
chartemp1;
//暂存
intI;
intspeed;
//速度设定
floatk[3];
//PID参数记录
for(i=0;
i<
=2;
i++)
EEPROMReadBytes(i*4,floatxin.c,4);
K[i]=floatxin.x;
}
EEPROMReadBytes(0x0010,intxin.c,1);
//读EEPROM
speed=intxin.x;
t=itime*0.0001275;
y=TCNT2;
Ek=y-speed;
u=k[0]*((Ek-Ek_1)+(t/k[1]*Ek+(k[2]/t)*(Ek-2*Ek_1+Ek_2)));
z=u/U1*0xff;
temp1=OCR2;
if(flage==1)//监控状态
Data[4]=0xb0;
Data[5]=temp1;
Data[6]=y>
>
8;
Data[7]=y;
Putdata(Data);
temp1=temp1+z;
if(temp1<
=0)//结果小于0时输出0
temp1=0x00;
if(temp1>
=0xf0)//结果大于0xf0时输出0xf0
temp1=0xf0;
OCR2=temp1;
Ek_2=Ek_1;
Ek_1=Ek;
TCNT2=0x0000;
//计数器清零
5.2程序流程图
图5.2.1主程序流程图
图5.2.2速度控制程序流程图
图5.2.3测速中断服务程序流程图
图5.2.4PID算法流程图
图5.2.5PWM波形的产生流程图
6、调试
6.1硬件调试
硬件调试是利用开发系统、基本测试仪器,通过执行开发系统有关命令或运行适当的测试程序,检查用户系统硬件中存在的故障。
硬件调试可分为静态调试和动态调试。
1、静态调试
首先,对每一块加工好的印刷电路板要仔细的检查,检查它的印制线是否断线,是否有毛刺,是否与其他印制线或焊盘或过孔粘连,焊盘是否脱落,过孔是否有未金属化等现象,查出的故障及时排除。
然后用万用表复核认为可疑的连接线或接点,检查它们的通断状态是否与设计规格相符。
再检查各种电源线与地线之间是否有短路现象并排除。
最后,加电检查,加电过程中细心观察芯片或器件是否出现打火、过热、变色、冒烟和异味等现象,如有,立即断电检查。
2、动态调试
首先按逻辑功能将用户系统硬件电路分为若干模块进行单独调试。
调试某模块时将整个电路板中与该模块无关的器件全部拔除,当各独立模块调试无故障后,然后逐步将接近的相关模块加入到应用系统中,并每加入一个模块后再对各模块功能进行调试,若在这个过程中出现故障,则基本上是各模块协调关系上出了问题。
6.2软件调试
首先,采取先使用断点运行方式以查看程序运行中间结果,将程序故障定位在一个较小的范围内。
然后,针对故障程序段再使用单步运行调试方法来精确定位错误所在。
最后,要连续运行调试,以防止某些错误在单步运行调试时被掩盖。
有些实时性操作(如中断等)必须采用连续运行方式来调试,为了准确地对错误进行定位,可使用连续加断点运行方式来调试这类程序。
最终确定出错误位置并加以排除。
7、总结
本次课程设计我做的是直流电机调速,虽然以前也接触过,但都是在实验台上实现,并不需要应用到现实生活中。
通过本次课程设计我了解了许多关于直流电机调速的知识,也查询了许多的资料,并结合自己的想法完成了课题。
经过学习,使我对AVR单片机有了初步的了解,对一个系统的设计要如何入手有了更加深刻的体会。
在整个设计过程中,也遇到了一些问题,如PID算法等,但经过努力都一一解决了。
通过这次案例分析课程设计,我学到了很多东西,感觉到理论和现实的差别。
在过去的两年多的大学学习中,大部分时间是在跟着老师学习,学习过去的一些基本理论一些基本的思想,感觉上好像学习就应是这个样子,就应该是老师让我们干什么我们就干什么,没有自己真正实践过。
第一次接触这样的课程,十分高兴,我深入到实际的工程案例中。
它能充分调动大家的积极性,趣味性强,不仅锻炼能力,而且可以学到很多书本上没有的东西。
我们上网查找相关的资料,并从众多资料中筛选出对自己有用的东西,真正锻炼了我们的能力。
虽然起初感觉有点无从下手,但慢慢就变得得心应手。
在这次的设计中,也得到了同学和老师的帮助。
通过这次学习,使我对本专业有了更深的认识,也大大提高了我的动手能力。
8、参考文献
1、李朝青.《单片机原理及接口技术》.北京:
北京航空航天大学出版社,1999年。
2、求是科技.《8051单片机程序设计》北京:
人民邮电出版社,2006年。
3、马潮.《高档8位单片机原理与开发应用指南(上)》.北京:
北京航空航天大学出版社,2004年。
4、网站:
5、网站:
www.IC
6、网站:
。
7、中国工控网。