单片机控制直流电机并测速电压ADDA转换以及pwm按键调速正转反转.docx
- 文档编号:10075537
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:27
- 大小:424.50KB
单片机控制直流电机并测速电压ADDA转换以及pwm按键调速正转反转.docx
《单片机控制直流电机并测速电压ADDA转换以及pwm按键调速正转反转.docx》由会员分享,可在线阅读,更多相关《单片机控制直流电机并测速电压ADDA转换以及pwm按键调速正转反转.docx(27页珍藏版)》请在冰豆网上搜索。
单片机控制直流电机并测速电压ADDA转换以及pwm按键调速正转反转
单片机原理及应用
课程设计报告书
题目:
用单片机控制直流电动机并测量转速
姓名:
徐银浩
学号:
1110702225
专业:
电子信息工程
指导老师:
沈兆军
设计时间:
2014年11月
信息工程学院
3.1AT89C51最小系统3
3.2按键电路4
3.3A/D转换模块4
3.4.D/A转换模块6
3.5电机转速测量电路7
3.6显示电路8
3.7总电路图10
4.1系统主程序设计12
4.2按键扫描程序设计12
4.3显示子程序12
4.4定时中断处理程序12
4.5A/D转换程序13
用单片机控制直流电动机并测量转速
1引言
1.1.设计意义
电动机作为最主要的动力源,在生产和生活中占有重要地位。
电动机的调速控制过去多用模拟法,随着计算机的产生和发展以及新型电力电子功率器件的不断涌现,电动机的控制也发生了深刻的变化,本系统利用直流电机的速度与施加电压成正比的原理,通过滑动变阻器向ADC0809输入控制电压信号,经AD后,输入到AT89C51中,AT89C51将此信号转发给DAC0832,通过功放电路放大后,驱动直流电机。
1.2.系统功能要求
单片机扩展有A/D转换芯片ADC0809和D/A转换芯片DAC0832。
通过改变A/D输入端可变电阻来改变A/D的输入电压,D/A输入检测量大小,进而改变直流电动机的转速。
手动扩展。
在键盘上设置两个按键——直流电动机加速键和直流电动机减速减。
在手动状态下,每按一次键,电动机的转速按照约定的速率改变。
用显示器LED或LCD显示数码移动的速度,及时形象地跟踪直流电动机转速的变化情况。
2方案设计
为了使用单片机对电动机进行控制,对单片机的基本要求应有足够快点速度;有捕捉功能。
总体设计方案如图所示
图2.1总体设计方案
(1)键盘向单片机输入相应控制指令,由单片机通过P3.0口输出信号,该编码通过DAC0832译成相应的模拟电压,经过信号放大实现电动机转向与转速的控制。
(2)可变电阻接ADC0808转变成相应电压的数字信号,单片机通过P1口读取,再由P2口输出与转速相应的8位BCD编码与DAC0832相接。
电动机的运转状态则通过四位数码管显示出来。
(3)电机的测速显示,采用光电传感器测量电机的转速,在设计中,在电机转轴末梢上安装纸卡,在纸卡上留出两个孔。
电机转轴每转一圈,发射二极管发出的光便通过纸卡的孔到达接受二极管,就可在接受二极管上产生相应的脉冲信号。
计算下1s内输出的脉冲信号的个数,把计数的结果取一半,就可得到电动机的转动速度。
(4)通过Max7219驱动器驱动4位共阴极LED灯,这样节省了许多I/O口。
3硬件设计
3.1AT89C51最小系统
AT89C51是一种带4K字节FLASH存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
图3.1单片机最小系统的设计
AT89C51提供以下标准功能:
4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
3.2按键电路
单片机的P3.6和P3。
7口分别接一个按键用于控制电机。
当按下“叫”键时,电机转速提高,进入加速状态;当按下“减”键时,电机转速减慢,进入减速状态。
通过“加”“减”两个按键可以达到键盘控制电机的作用。
3.3A/D转换模块
(1)ADC0808
ADC0808是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D模数转换器。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
是目前国内应用最广泛的8位通用A/D芯片。
主要特性
1)8路输入通道,8位A/D转换器,即分辨率为8位。
2)具有转换起停控制端。
3)转换时间为100μs(时钟为640kHz时),130μs(时钟为500kHz时)
4)单个+5V电源供电。
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度。
7)低功耗,约15mW。
ADC0809的工作过程
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
转换数据的传送A/D转换后得到的数据应及时传送给单片机进行处理。
数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。
为此可采用下述三种方式。
(1)定时传送方式
对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。
例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。
可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。
(2)查询方式
A/D转换芯片由表明转换完成的状态信号,例如ADC0808的EOC端。
因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。
(3)中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。
首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。
图3.3AD转换电路的设计
(2)工作原理
如图3.3所示,外部电源通过滑动变阻器向ADC0808输入控制电压信号,经A/D处理后,输入到AT89C51中,交由AT89C51处理,进行下一步动作。
3.4D/A转换模块
(1)DAC0832
DAC0832是8分辨率的D/A转换集成芯片。
与微处理器完全兼容。
这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。
D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。
主要特性参数
1.分辨率为8位;
2.电流稳定时间1us;
3.可单缓冲、双缓冲或直接数字输入;
4.只需在满量程下调整其线性度;
5.单一电源供电(+5V~+15V);
6.低功耗,20mW。
DAC0832的工作方式
DAC0832进行D/A转换,可以采用两种方法对数据进行锁存。
第一种方法是使输入寄存器工作在锁存状态,而DAC寄存器工作在直通状态。
具体地说,就是使和都为低电平,DAC寄存器的锁存选通端得不到有效电平而直通;此外,使输入寄存器的控制信号ILE处于高电平、处于低电平,这样,当端来一个负脉冲时,就可以完成1次转换。
第二种方法是使输入寄存器工作在直通状态,而DAC寄存器工作在锁存状态。
就是使和为低电平,LE为高电平,这样,输入寄存器的锁存选通信号处于无效状态而直通;当和端输入1个负脉冲时,使得DAC寄存器工作在锁存状态,提供锁存数据进行转换。
图3.4DA转换电路的设计
(2)工作原理
如上图3.4所示,电压信号输入后经过AD转换输入到AT89C51,由单片机通过P1口输出与转速相应的8位BCD编码,该编码通过DAC0832译成相应的模拟电压,经过信号放大实现电动机转向与转速的控制。
3.5电机转速测量电路
图3.5光电传感器测速设计
采用光电传感器测量电机的转速,在设计中,在电机转轴末梢上安装纸卡,在纸卡上留出两个孔。
电机转轴每转一圈,发射二极管发出的光便通过纸卡的孔到达接受二极管,就可在接受二极管上产生相应的脉冲信号。
计算下1s内输出的脉冲信号的个数,把计数的结果取一半,就可得到电动机的转动速度。
3.6显示电路
(1)MAX7219
MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。
其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。
只有一个外部寄存器用来设置各个LED的段电流。
MAX7221与SPI™、QSPI™以及MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。
一个方便的四线串行接口可以联接所有通用的微处理器。
每个数据可以寻址在更新时不需要改写所有的显示。
MAX7219/MAX7221同样允许用户对每一个数据选择编码或者不编码。
整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。
功能特点:
1、10MHz连续串行口
2、独立的LED段控制
3、数字的译码与非译码选择
4、150μA的低功耗关闭模式
5、亮度的数字和模拟控制
6、高电压中断显示
7、共阴极LED显示驱动
8、限制回转电流的段驱动来减少EMI(MAX7221)
9、SPI,QSPI,MICROWIRE串行接口(MAX7221)
(2)工作原理
如图3.6所示,可变电阻接ADC0808转变成相应电压的数字信号,单片机通过P0口读取,再由P1口输出与转速相应的8位BCD编码到MAX7219。
经由MAX7219处理后通过四位数码管显示出来。
采用光电传感器测量电机的转速,在设计中,在电机转轴末梢上安装纸卡,在纸卡上留出两个孔。
电机转轴每转一圈,发射二极管发出的光便通过纸卡的孔到达接受二极管,就可在接受二极管上产生相应的脉冲信号。
计算下1s内输出的脉冲信号的个数,把计数的结果取一半,就可得到电动机的转动速度。
图3.6显示电路的设计
3.7总电路图
由各子模块设计给得出总硬件电路设计如下图3.7所示
图3.7硬件总电路图
4软件设计
4.1系统主程序设计
本系统编程部分工作采用KELI-C51语言完成,采用模块化的设计方法,与各子程序做为实现各部分功能和过程的入口,完成键盘输入、按键识别、ADC0809读取和DAC0832输出、脉冲计数以及数码管显示等部分的设计。
N
Y
图4.1主程序流程图
4.2按键扫描程序设计
按键扫描程序采用中断方式,按下键,完成延时去抖动、键码识别、按键功能执行。
要实现按住加/减速键不放时恒加或恒减速直到放开停止,就需在判断是否松开该按键时,每进行一次增加/减少一定的占空比。
4.3显示子程序
Max7219驱动显示子程序用于处理DAC0832处理出来的8位BCD,利用数组方式定义显示缓存区,缓存区有8位,分别存放各个数码管要显示的值。
流程图如下图4.3所示
数码管显示数据
图4.3max7219驱动显示电路
4.4定时中断处理程序
定时中断处理程序:
采用定时方式1,因为单片机使用12M晶振,可产生最高约为65.5ms的延时。
对定时器置初值B1E0H可定时20ms,即系统时钟精度可达0.02s。
当20ms定时时间到,定时器溢出则响应该定时中断处理程序,完成对定时器的再次赋值,并对全局变量time加1,这样,通过变量time可计算出系统的运行时间。
4.5A/D转换程序
首先判断A/D转换是否允许进行,当WR又低变高时AD开始转换,再读取转换数据结果,把数据存到ad_data中,完成A/D转换。
流程图如下图4.4所示
N
、Y
图4.5A/D转换程序流程图
5系统调试
图5.1Keilc51编译调试
因为代码设计到的知识点比较多,并且很多知识我们都忘了,所以在编写的时候,有很多不会的,但是最终自己通过查阅图书馆资料解决了那些问题。
图5.2仿真结果图
5设计总结
上个学期的单片机课已经早早的上完了,但是理论纯属理论,没有与实践的结合总让我们学的不踏实,感觉没有达到学以致用的效果。
这学期我们大四了,老师给我们安排了这次单片机课程设计,给了我们学以致用的做好的实践。
关于这次课程设计,我花费了比较多的心思,既是对课程理论内容的一次复习和巩固,还让我们丰富了更多与该专业相关的其他知识,比如软件应用等,在摸索中学习,在摸索中成长,在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获,在真正设计之前我们做了相当丰富的准备,首先巩固一下课程理论,再一遍熟悉课程知识的构架,然后结合加以理论分析、总结,有了一个清晰的思路和一个完整的的软件流程图之后才着手设计。
在设计程序时,我们不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;养成注释程序的好习惯是非常必要的,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也能为资料的保存和交流提供了方便;我觉得在设计课程过程中遇到问题是很正常,但我们应该将每次遇到的问题记录下来,以免下次再碰到同样的问题的课程设计又出错了。
除了对此次设计的准备工作之外,我们还学到了很多平时难得的东西,首先是团队协作,在这次设计当中,难免和同学产生观点和意见的分歧,以及分工明细、时间安排等不合理,通过这次设计,我们体会到了团结合作的重要性及力量之强大,还有让我们处理事情更加有条理,思路更加清晰明了了,发现、提出、分析、解决问题和实践能力的提高都将受益于我在以后的学习、工作和生活中。
此次的设计,其实也是我们所学知识的一次综合运用,让我深深的认识到了学习单片机要有一定的基础,要有电子技术方面的数字电路和模拟电路等方面的理论基础,特别是数字电路;也要有编程语言的汇编语言或C语言。
要想成为单片机高手,我们首先要学好汇编语言,然后转入C语言学习,所以我们不能学到后面就忘了前面的知识,更应该将所学的知识紧紧的结合在一起,综合运用,所谓计,就是要求创新,只有将知识综合运用起来才能真正的设计好。
7参考文献
[1]陈益飞,沈兆军.单片机原理及应用技术.国防工业出版社,2011.
[2]陈忠平.基于proteus的51单片机设计和仿真.电子工业出版社.2013.
[3]MarkNelson著.潇湘工作室译.串行通信开发指南[M].中国水利水电出版社,2002.
[4]王宜怀.单片机原理及其嵌入式应用教程[M].北京希望电子出版社,2002.
[5]韩润萍,陈小萍.点阵LED显示屏控制系统[J].微计算机信息,2003,19(10):
50-51.
[6]张毅刚,刘旺.单片机原理及应用.北京高等教育出版社,2013.6:
287-291.
8附录A;源程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineda1_7P2//da转换口
#definead1_7P0//ad转换口
sbitST=P1^3;
sbitOE=P1^7;
sbitEOC=P1^6;//ad转换完成标志
sbitLOAD=P1^1;//max7219load
sbitDIN=P1^0;//max7219输入
sbitCLK=P1^2;//max7219clk
sbitMotor=P3^0;
sbitInc=P3^6;//速度增加
sbitDec=P3^7;//速度减小
ucharflag_add=0,flag_dec=0;
ucharspeed=90,t=0;
uintmotorspeed,counter=0,calsp;
uinttemp;
uchardisp[4];
ucharcodedispaly_list[]=
{0x00,0x01,0x02,0x03,0x04,
0x05,0x06,0x07,0x08};
voidkey();
voiddisplay();//max7219显示
voidcalspeed();//速度计数
voiddelay(uintz);//延时
voidInitDis();//max7219初始化
voidinit_timer0();//中断初始
voidw_max7219(unsignedcharaddr,unsignedcharwdata);
voidmain(void)
{
InitDis();
init_timer0();
while
(1){
key();
ST=0;
ST=1;
ST=0;//start降,AD开始转换
delay(10);
OE=0;
while(EOC==0);//等待转换结束
OE=1;
temp=ad1_7;
da1_7=temp;//
OE=0;//
display();
calspeed();
}
}
/*******按键检测函数***********/
voidkey()//按键检测函数
{
if(flag_add==0)
{
if(!
Inc)//p3.6加
{
flag_add=1;//标志
speed+=5;
if(speed>=100)
speed=100;
}
}
if(Inc)
flag_add=0;
if(flag_dec==0)
{
if(!
Dec)
{
flag_dec=1;
speed-=5;
if(speed<=5)
speed=5;
}
}
if(Dec)
flag_dec=0;
}
/*******初始化定时**************/
voidinit_timer0()
{
EA=1;
EX0=1;
IT0=1;//外中断1
TMOD=0X01;
TH0=(65535-10000)/256;//10MS
TL0=(65535-10000)%256;
TR0=1;//定时1
ET0=1;
}
/******脉冲计数**********/
voidcalspeed()
{
if(calsp>=100)//100*10ms=1s
{
motorspeed=counter;
counter=0;//计数清零
calsp=0;//标志清零
}
}
void_timer0()interrupt1//硬件调用
{TH0=(65535-10000)/256;//10MS
TL0=(65535-10000)%256;
calsp++;//定时次数等待100次及1s
////
t++;//10ms加1
if(t>=100)
{
t=0;
}
if(t Motor=1; else Motor=0; } void_INT0()interrupt0 {counter++;}//外中断计数 voiddelay(uintz)//延时 { uintx,y; for(x=z;x>0;x--) for(y=19;y>0;y--); } /*------------------------------------------------- MAX7219初始化 -------------------------------------------------*/ voidInitDis(void) { w_max7219(0x0b,0x07);/*设置扫描界限*/ w_max7219(0x09,0xff);/*设置译码模式*/ w_max7219(0x0a,0xf5);/*设置亮度*/ w_max7219(0x0c,0x01);/*设置电源工作模式*/ } voidw_max7219(unsignedcharaddr,unsignedcharwdata) {unsignedintADS,j,i; LOAD=0; i=0; while(i<16) { if(i<8) ADS=addr; elseADS=wdata; for(j=8;j>=1;j--) { DIN=ADS&0x80; ADS=ADS<<1; CLK=1; CLK=0;} i+=8;} LOAD=1;} /***************调用显示****************/ voiddisplay() { uinti; disp[0]=motorspeed%10;//求速度个位值,送到个位显示缓冲区 disp[1]=(motorspeed/10)%10;//求速度十位值,送到十位显示缓冲区 disp[2]=(motorspeed/100)%10;//求速度百位值,送到百位显示缓冲区 disp[3]=motorspeed/1000;//求速度千位值,送到千位显示缓冲区 for(i=0;i<4;i++) { if(i==0)//显示个位 { w_max7219(0x04,dispaly_list[d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 控制 直流电机 测速 电压 ADDA 转换 以及 pwm 按键 调速 反转