单片机课程设计步进电机的控制与无线通信_第1页
单片机课程设计步进电机的控制与无线通信_第2页
单片机课程设计步进电机的控制与无线通信_第3页
单片机课程设计步进电机的控制与无线通信_第4页
单片机课程设计步进电机的控制与无线通信_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 设计课程名称 单片机课程设计 设计项目名称 步进电机的控制与无线通信 19题目:步进电机的控制与无线通信一设计任务:1protel软件的学习与pcb版的制作2步进电机控制。3红外遥控的发送与接收。 二设计内容:1. protel 99se软件的学习与pcb版的制作学习protel99 se 软件的时间不多,但是收获也不少。至少知道了很多软件都能实现pcb版图的设计与制作。在protel99 se里面学到了很多东西,由于上课的时间断,所以就不得不在网上找相关的资料、教程、以及文库。首先我就下载了有快捷键,让我在使用的过程中方便有快捷。在protel99 se的库文件中不是所有的原件都和我们用的

2、原件一样,有一样的管脚。有很大一部分是不同的,比如数码管本来是十个角而protel99 se里面就只有八个,和实际的不一样。用元件编辑可以编辑自己想要的元件,型号和管脚。很多封装模型也没有,这些都可以自己画封装。不过在画之前,先要知道元件的尺寸大小。不然尺寸过大过小都不能正确的安装元件,导致浪费人力物力。各部分截图如下:时钟电路电路图:pcb 图:元件布局图:2.单片机对步进电机的控制与无线通信单片机原理与应用是电子信息工程专业的一门重要专业课,对应用能力和动手能力要求很高,课程设计环节是学生学习该课程后进行的一项必不可少的基本训练。其主要目的是使学生增进对单片机的感性认识,加深对单片机理论方

3、面的理解,巩固学生所学理论知识;使学生掌握单片机的内部功能模块的应用,培养学生系统设计的思想;培养学生的软件设计能力,提高学生的动手能力;培养学生查阅相关资料、撰写文档的能力和自学、科研的能力。了解红外通信知识,掌握红外数据收发的电路、编解码的编程方法。内容1、能控制步进电机的正常工作,且做一定调整。(1)能控制步进电机作正向和反向运转,要有正转和反转控制按钮。(2)步距角为45 度。(3)在一定的范围内可以控制运转的速度,有加速和减速控制按钮。(4)要求随时可以在不断电源情况下可以暂停,有一个暂停按钮。2、根据系统提供的红外收发电路,单片机一方面从发送端发出数据,一方面从接收端接收数据,并比

4、较收到的数据与发送的是否一致。方案3.1控制电机正/反向转步进电动机有三相绕组a、b、c、d,当某一项绕组通电时,在其内部形成n-s极,产生磁场,在磁场的作用下,转子将会转动,步进一步。若步进电动机按四相八拍方式来工作,则在a、b、c、d,四相绕组上依次输入脉冲的顺序为:步进电动机将沿顺时针方向转动。若在a、b、c、d四相绕组上依次输入脉冲的顺序为:则步进电动机将沿逆时针方向转动(d、c、b、a,则顺时针方向旋转)。因而只要控制脉冲输出的顺序,就可实现对步进电动机正/反转的控制。3.2控制电机运转速度 步进电动机运转的速度是由输入到a、b、c、d四相绕组的频率所决定的。频率越高,电动机运转的速

5、度越快,否则,速度就越慢。因而通过延时程序控制输出脉冲的频率,就可以实现对步进电动机颛顼的控制。3.3控制电机转动角度通常,按aabbbcccdddaa(或aadddcccbbbaa)的顺序轮流通电,则步进电动机会沿瞬时针(或逆时针)方向转动,这种运行方式被称为四相八三拍方式。“四相”是指定子四相绕组;“单”是指每次只有一相绕组通电;“拍”是指从一种通电状态转换到另一种通电状态;“八拍”是指经过八次切换控制绕组的通电状态为一个循环,第八拍通电状态是重复第一拍的情况。如果将该方式下每周运行的拍数(步数)设为n,则四相八拍方式下每周运行的拍数恰恰为2n。步进电机 四相八拍工作,步距角是7.5度.如

6、果我正转1圈,则需要360/7.5=48个脉冲。但电机运行拍数定义不同,是指电机转过一个齿(轮)距所需脉冲数,要区分步进角和电机运行拍数。红外遥控控制在很多单片机应用系统中,常常利用非电信号(如光信号、超声波信号等)传送控制信息和数据信息,以实现遥控或遥测的功能。红外通信具有控制简单、实施方便、传输可靠性高的特点,是一种较为常用的通信方式。实现单片机系统红外通信的关键在于红外接口电路的设计以及接口驱动程序的设计。1红外通信的基本原理红外通信是利用950nm近红外波段的红外线作为传递信息的媒体,即通信信道。发送端采用脉时调制(ppm)方式,将二进制数字信号调制成某一频率的脉冲序列,并驱动红外发射

7、管以光脉冲的形式发送出去;接收端将接收到的光脉转换成电信号,再经过放大、滤波等处理后送给解调电路进行解调,还原为二进制数字信号后输出。2红外发送器红外发送器电路包括脉冲振荡器、驱动管q1和q2、红外发射管q3等部分。其中脉冲振荡器由2206组成,用以产生38khz的脉冲序列作为载波信号;红外发射管q3用来向外发射950nm的红外光束。红外发送器的工作原理为:串行数据由单片机的串行输出端data送出并驱动q1管,数位“0”使q1管导通,通过q2管调制成38khz的载波信号,并利用红外发射管q3以光脉冲的形式向外发送。数位“1”使q1管截止,红外发射管q3不发射红外光。若传送的波特率设为1200b

8、ps,则每个数位“0”对应32个载波脉冲调制信号的时序,如图35-1所示。35-1 调制信号时序图3红外接收器红外接收电路选用专用红外接收模块。该接收模块是一个三端元件,使用单电源+5v电源,具有功耗低、抗干扰能力强、输入灵敏度高、对其它波长(950nm以外)的红外光不敏感的特点,其内部结构框图如图35-2所示。如图35-2 红外接收模块内部结构框图接收模块的工作原理为:首先,通过红外光敏元件将接收到的载波频率为38khz的脉冲调制红外光信号转化为电信号,再由前置放大器和自动增益控制电路进行放大处理。然后,通过带通滤波器和进行滤波,滤波后的信号由解调电路进行解调。最后,由输出级电路进行反向放大

9、输出。为保证红外接收模块接收的准确性,要求发送端载波信号的频率应尽可能接近38khz,因此在设计脉冲振荡器时,要选用精密元件并保证电源电压稳定。再有,发送的数位“0”至少要对应14个载波脉冲,这就要求传送的波特率不能超过2400bps。4本实验需要用到cpu模块(f3区)和红外收发模块(a3区)、函数信号发生器模块(a2区),红外收发电路原理参见图35-3。图35-3 红外收发电路实验步骤1、 我们先用老师给的事例程序调试了熟悉了一下,实验平台的使用方法。单片机的下载和硬件电路都熟悉了以后开始下一步的工作。2、 然后修改调试老师给的事例程序,最后可以实现,用四个按键控制步进电机的启动停止、正反

10、转、加速、减速 四个功能,并且用lcd屏显示出来。3、 在网上查询红外遥控的资料,了解红外遥控的原理,以及实现控制的方式。然后把红外遥控加到电机的控制中,用遥控器去控制电机的正转、反转、加速、减速、启动停止,并且将电机的所有状态在lcd屏上显示出来的。(由于不能用软件仿真所以,只能硬件调试。很多步骤,所以用了很长的时间才调试出来,而且电路板一开始晶振是不振动的。放了很久,后面我用手触了几下上面的一些管脚然后能用了。)修改、调试红外控制电机程序(程序见附录1 ):修改、调试后键盘控制电机并显示(程序见附录2):总结首先要感谢马老师给我这次机会,学习、熟悉、应用单片机,以及自己动手设计的机会。通过

11、这次的课程设计,我了解了步进电机的工作原理,了解的红外控制的原理。知道了完成单片机最小系统课程设计的一般方法和步骤,对于我在以后的学习于应用中都有很大的帮助。让我更深层次的了解了单片机的工作原理以及使用方法。在实验的过程中也暴露了自己不少的缺点,不如说耐心不够啊,在做的时候如果很长时间都还没有出结果的话就会有想放弃的想法。不过多亏了,一组的同学一起才能得以完成。心得体会1、 我要再次感谢马老师,在这次的课程设计中,提高了我们应用单片机和自己动手的能力。增进我们对单片机的感性认识,加深对单片机的理解,(虽然近代电子学也用单片机做做,但是没有这次的深,没有这次透彻。)巩固我们以前所学的单片机理论知

12、识;使我们掌握了单片机的内部功能模块的应用,同时也锻炼了我们系统设计的思想;提高了软件深层次了解和应用软件以及用软件设计的能力;同时我们也在网上学到了不少的东西,在查询资料的时候自己做搜索到的东西不全都是自己现在需要的东西。不过我们在查的时候也在不断的阅读那些现在不要的东西,扩大了我们的阅读面,在查阅的过程中效率越来越高。知道了怎么去查询,所以在以后查询的时候就不用走太多的弯路。在实验设计的过程中,提高了我们的团队协作能力。一个人的能力毕竟是有限的,在一个很大的工程项目下,一个人是完成不了的,必须要有团队的配合。所以对以后我们工作的团队合作也有很大的帮助附录1:/步进电机1.0,p1.1,p1

13、.2,p1.3,遥控器p3.2喇叭p3.7*/遥控器1号键:运行/停止 确认 键:圈数增加2号键:速度增加 键:圈数减少 1 号键:速度减少 键:方向正 键 :方向反 键 * / /*#include /51芯片管脚定义头文件#include /内部包含延时函数 _nop_();#define uchar unsigned char#define uint unsigned int#define delaynop(); _nop_();_nop_();_nop_();_nop_();uchar code ffw8= 0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9

14、;uchar code rev8= 0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1;uchar ircom6=(0x00,0x00,0x00,0x00,0x00,0x00);char code sst5163 _at_ 0x003b;sbit beep = p35; /蜂鸣器sbit irin= p32; /红外接收端口sbit lcd_rs = p24; sbit lcd_rw = p23;sbit lcd_en = p22;bit on_off=0; /运行与停止标志bit direction=1; /方向标志bit rate_dr=1; /速率标志bit

15、snum_dr=1; /圈数标志bit flag; /红外接收有效标志bit pause1=0; /暂停标志/uchar code cdis1 = stepping motor ;/uchar code cdis2 = control process;uchar code cdis1 = ir control ;uchar code cdis2 = stepping motor ;uchar code cdis3 = ir:-h stop ;uchar code cdis4 = num: rate: ;uchar code cdis5 = run ;uchar code cdis6 = sto

16、p;uchar code cdis7 = puse;uchar m,v=0,q=0;uchar number=0,number1=0; uchar snum=50,snum1=50; /预设定圈数uchar rate=8; /预设定速率uchar data_temp,data_temp1,data_temp2; uchar temp;void ir_in();/*/ /* 延时t毫秒 /* 11.0592mhz时钟,延时约1ms /*/void delay(uint t) uchar k; while(t-) for(k=0; k125; k+) /*/void delayb(uchar x)

17、 / x*0.14ms uchar i; while(x-) for (i=0; i13; i+) /*/void beep() uchar j; for (j=0;j100;j+) delayb(5); beep=!beep; /beep取反 beep=1; /关闭蜂鸣器/*/ /*检查lcd忙状态 /*lcd_busy为1时,忙,等待。为0时,闲,可写指令与数据。 /*/ bit lcd_busy() bit result; lcd_rs = 0; lcd_rw = 1; lcd_en = 1; delaynop(); result = (bit)(p0&0x80); lcd_en = 0

18、; return(result); /*/* /*写指令数据到lcd /*rs=l,rw=l,e=h,d0-d7=指令码。 /* /*/void lcd_wcmd(uchar cmd) while(lcd_busy(); lcd_rs = 0; lcd_rw = 0; lcd_en = 0; _nop_(); _nop_(); p0 = cmd; delaynop(); lcd_en = 1; delaynop(); lcd_en = 0; /*/ /*写显示数据到lcd /*rs=h,rw=l,e=高脉冲,d0-d7=数据。 /*/void lcd_wdat(uchar dat) while

19、(lcd_busy(); lcd_rs = 1; lcd_rw = 0; lcd_en = 0; p0 = dat;/ delaynop(); lcd_en = 1; delaynop(); lcd_en = 0; /*/ /* lcd初始化设定 /*/void lcd_init() delay(30); lcd_wcmd(0x38); /16*2显示,5*7点阵,8位数据 delay(5); lcd_wcmd(0x38); delay(5); lcd_wcmd(0x38); delay(5); lcd_wcmd(0x0c); /显示开,关光标 delay(5); lcd_wcmd(0x06)

20、; /移动光标 delay(5); lcd_wcmd(0x01); /清除lcd的显示内容 delay(5);/*/ /* 设定显示位置 /*/void lcd_pos(uchar pos) lcd_wcmd(pos | 0x80); /数据指针=80+地址变量/*/ /* lcd1602初始显示子程序 /*/void lcd_init_dis() delay(10); /延时 lcd_init(); /初始化lcd lcd_pos(0); /设置显示位置为第一行的第1个字符 for(m=0;m16;m+) lcd_wdat(cdis1m); lcd_pos(0x40); /设置显示位置为第二

21、行第1个字符 for(m=0;m16;m+) lcd_wdat(cdis2m); delay(3000); /延时 lcd_pos(0); /设置显示位置为第一行的第1个字符 for(m=0;m16;m+) lcd_wdat(cdis3m); lcd_pos(0x40); /设置显示位置为第二行第1个字符 for(m=0;m16;m+) lcd_wdat(cdis4m); for(m=0;m0x09) ircom6=ircom6+0x37; else ircom6=ircom6+0x30; ircom5=(ircom5&0xf0)4; /高位 if(ircom50x09) ircom5=irc

22、om5+0x37; else ircom5=ircom5+0x30; /*/*数据显示子程序/*/void data_dis() code_conv(); lcd_pos(0x03); lcd_wdat(ircom5);/ lcd_pos(0x08); lcd_wdat(ircom6); data_temp = snum; /显示圈数 data_conv(); lcd_pos(0x44); lcd_wdat(data_temp1);/ lcd_pos(0x45); lcd_wdat(data_temp2); data_temp = rate; /显示速率 data_conv(); lcd_po

23、s(0x4d); lcd_wdat(data_temp1);/ lcd_pos(0x4e); lcd_wdat(data_temp2);/*/* 显示运行方向符号/*/void motor_dr() if(direction=1) /正转方向标志 for(m=0;m2;m+) lcd_pos(0x0d+m); /显示方向符号 lcd_wdat(0x3e); else for(m=0;m2;m+) /反转方向标志 lcd_pos(0x0d+m); /显示方向符号 lcd_wdat(0x3c); /*/* 显示运行状态/*/void motor_run() if(on_off=1) tr0=1;

24、lcd_pos(7); /设置显示位置为第一行的第1个字符 for(m=0;m5;m+) lcd_wdat(cdis5m); /run motor_dr(); / else tr0=0; p1 =0xf0; lcd_pos(7); /设置显示位置为第一行的第1个字符 for(m=0;m5;m+) lcd_wdat(cdis6m); /stop motor_dr(); / snum=snum1; / number1=0; /清圈数计数器 /* * 主程序 */main() lcd_init_dis(); / ie=0x81; /允许总中断中断,使能 int0 外部中断/ tcon=0x01; /

25、触发方式为脉冲负边沿触发 tmod = 0x01; /t0定时方式1 tl0 = 0x33; th0 = 0xf5; et0 = 1; ea = 1; p1 = 0xf0; while(1) ir_in(); temp=ircom2; if(flag) /* 运行控制*/ if(temp=0x05) /启动、停止 on_off=on_off; motor_run(); /* 设定圈数*/ if(temp=0x19) /增加圈数 if(snum!=0x14) snum+; snum1=snum; if(temp=0x0d) /减少圈数 if(snum!=0x00) snum-; snum1=sn

26、um; /* 方向转换*/ if(temp=0x1e) /正转 direction=1; motor_dr(); if(temp=0x0a) /反转 direction=0; motor_dr(); /* 速率调整*/ if(temp=0x0e) /增加速率,减速 if(rate!=0x10) rate+; if(temp=0x1a) /减少速率,加速 if(rate!=0x01) rate-; if(temp=0x44) if(on_off&(!pause1) pause1=1; tr0=0; /暂停 lcd_pos(7); /设置显示位置 for(m=0;m5;m+) lcd_wdat(cdis7m); /pause else if(pause1) motor_run(); pause1=0; tr0=1; flag=0; / end of if(flag)/*/ if(number1=snum1) /与设定圈数是否相等 number1=0; on

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论