单片机控制8路舵机_第1页
单片机控制8路舵机_第2页
单片机控制8路舵机_第3页
单片机控制8路舵机_第4页
单片机控制8路舵机_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、 单片机控制舵机附:单片机控制8路舵机程序,串口通讯上位机程序(C#)一、 设计内容综述机械臂主要由手部和运动机构组成。手部是用来抓持工件的部件,运动机构使手部完成各种转动、移动或复合运动来实现规定的动作。为了抓取空间中任意位置和方位的物体,需有6个自由度,用六个舵机来控制。由单片机产生六路占空比可调的PWM信号来控制机械手的运动。利用上位机与单片机通信,改变占空比从而控制机械臂。为了使机械手运动时保持一定的连贯性,同时刻到达指定位置,机械手不同部位运动的速度应该不同,转一个小角度时舵机的速度应该慢一些,从而达到柔性控制。 二、所使用的关键器件和基本参数舵机TR213:1.速度:0.15秒/6

2、0度(4.8V);0.12秒/60度(6.0V) 2.扭矩:13kg·cm 3.范围:180° 4.控制精度:0.5° 5.精度:精度高,步进角度很小 MAX232: 1.符合所有的RS-232C技术标准 2.只需要单一 +5V电源供电,片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V-3.功耗低,典型供电电流5mA 4.内部集成两个RS-232C驱动器,两个RS-232C接收器三、工作原理说明及计算1、PC机与单片机通信在工业控制系统中,各种数据的采集和执行机构的控制都是由下位机来完成。由于单片机具有体积小、价格低廉、可应用于恶劣工业

3、环境的特点,在分布式控制系统中大多采用单片机作为下位机来进行数据采集和现场控制。在这些应用中,单片机只是直接面向被控对象底层。而对采集到的数据进行进一步分析和处理的工作是由功能强大的主控PC机来完成的。因此,PC机和单片机之间就有着大量的数据交换。 通常PC机和单片机之间的通信是通过串行总线RS-232实现的。因此采用一种以MAX232为核心的通信接口电路。该接口电路适用于由一台PC机与多个单片机串行通信的设计,其原理和方法同样适用于PC机与其它单片机之间的串行数据通信。 RS-232C该框图中,起着重要作用的是RS-232C通信接口电路。它是上位机和下位机之间信息传递的枢纽,一切数据的传输必

4、需由它完成,上位机利用它的RS-232串行口,为此,采用了RS-232串行通信来接收或上传数据和指令。但RS-232信号的电平和单片机串口信号的电平不一致,必须进行二者之间的电平转换。在此电路中,采用MAX232实现TTL逻辑电平和RS-232电平之间的相互转换。 MAX232由单一的+5V电源供电,只需配接5个高精度10F/50V的钽电容即可完成电平转换。转换后的串行信号TXD、RXD直接与PC机的串行口连接。如此设计,既可发挥出PC强大的计算和显示功能,又可以体现出单片机灵活的控制功能,有利于对现场信号的实时采集、处理和监控。串口通讯软件2、舵机的结构舵机简单的说就是集成了直流电机、电机控

5、制器和减速器等,并封装在一个便于安装的外壳里的伺服单元。能够利用简单的输入信号比较精确的转动给定角度的电机系统。舵机安装了一个电位器(或其它角度传感器)检测输出轴转动角度,控制板根据电位器的信息能比较精确的控制和保持输出轴的角度。这样的直流电机控制方式叫闭环控制,所以舵机更准确的说是伺服马达,英文servo。舵机的主体结构有五个部分:外壳、减速齿轮组、电机、电位器、控制电路。工作原理:控制电路接受来自信号线的控制信号,控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈

6、,然后控制电路板,根据所在位置决定电机的转动方向和速度,从而达到目标停止。舵机的输入线共有三条,红色中间,是电源线,一边黑色的是地线,这辆根线给舵机提供最基本的能源保证,主要是电机的转动消耗。电源有两种规格,一是4.8V,一是6.0V,分别对应不同的转矩标准,即输出力矩不同,6.0V 对应的要大一些;另外一根线是控制信号线,一般为桔黄色。舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0180 度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉

7、冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms 的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。由此可见,舵机是一种位置伺服的驱动器,转动范围不能超过180 度,适用于那些需要角度不断变化并可以保持的驱动当中。舵机的外壳一般是塑料的,特殊的舵机可能会有金属铝合金外壳。金属外壳能够提供更好的散热,可以让舵机内的电机运行在更高功率下,以提供更高的扭矩输出。金属外壳也可以提供更牢固的固定位置。FUTABA-S3003 型舵机的内部电路 标准舵机示意图 舵机输出转角与输入信号脉冲宽度的关系正是因为舵

8、机有很多优点,所以应用已经扩展到各种机电产品中来,在机器人控制中应用也越来越广泛。3、用单片机来控制舵机舵机的控制信号是一个脉宽调制信号,所以很方便和数字系统进行接口。只要能产生标准的控制信号的数字设备都可以用来控制舵机。我们使用单片机产生舵机的控制信号来进行控制的方法,编程语言为C51。单片机有两个(或两个以上)内部计数器,我们就用它来产生周期20 ms 的脉冲信号,根据需要,改变输出脉宽。脉冲信号的输出是靠定时器的溢出中断函数来处理,时间很短,因此在精度要求不高的场合可以忽略。因此如果忽略中断时间,从另一个角度来讲就是主程序和脉冲输出是并行的,因此,只需要在主程序中按要求改变A值,例如让A

9、从500 变化到2500,就可以让舵机从0 度变化到180 度。另外舵机的转动需要时间的,因此,程序中A值的变化不能太快,不然舵机跟不上程序。根据需要,选择合适的延时,用一个递增循环,可以让舵机很流畅的转动,而不会产生像步进电机一样的脉动。这些还需要实践中具体体会。舵机的速度决定于你给它的信号脉宽的变化速度。一般来讲,舵机最大转动速度在4.8V 时为0.23s/60 度,也就是说,如果你要求的速度比这个快的话,舵机就反应不过来了;如果要求速度比这个慢,可以将脉宽变化值线性到你要求的时间内,做一个循环,逐渐的增加脉宽值,就可以控制舵机的速度了。当然,具体这个量到底是多少,就需要做试验了,不然的话

10、,不合适的话,舵机就会向步进电机一样一跳一跳的转动了。还有一点很重要,就是舵机在每一次脉宽值改变的时候总会有一个转速由零增加再减速为零的过程,这就是舵机会产生像步进电机一样运动的原因。如果系统中需要控制几个舵机的准确转动,可以用单片机和计数器进行脉冲计数产生P W M 信号。脉冲计数可以利用51 单片机的内部计数器来实现,由于时间及专业限制,我们暂时使用这种方法。当系统的主要工作任务就是控制多个舵机的工作,并且使用的舵机工作周期均为20ms 时。要求硬件产生的多路P W M 波的周期也相同。使用51 单片机的内部定时器产生脉冲计数。一般工作正脉冲宽度小于周期的1/8 。这样可以在1个周期内分时

11、启动各路P W M 波的上升沿。再利用定时器中断T0 确定各路PWM 波的输出宽度。定时器中断T1 控制20ms 的基准时间。第1 次定时器中断T0 按20ms 的1/8(由于数比较好算,所以用1/8) 设置初值,并设置输出I/O 口,第1 次T0 定时中断响应后,将当前输出I/O 口对应的引脚输出置高电平,设置该路输出正脉冲宽度,并启动第2 次定时器中断,输出I/O口指向下一个输出口。第2 次定时器定时时间结束后,将当前输出引脚置低电平,设置此中断周期为20ms 的1/8 减去正脉冲的时间,此路P W M 信号在该周期中输出完毕,往复输出。在每次循环的第16次(2 *8=16)中断实行关定时

12、中断T0的操作,最后就可以实现8路(实际上六路就可以完成机械臂的控制)舵机控制信号的输出。但是从软件系统的稳定性和程序结构的合理性看,宜使用外部的计数器,还可以提高CPU 的工作效率。采用单片机和8253、8254 这样的计数器芯片的PWM 信号产生电路是可靠的。基于8253 产生PWM 信号的程序主要包括三方面内容:一是定义8253寄存器的地址,二是控制字的写入,三是数据的写入软件。所以当系统需要产生多路P W M 信号时,使用上述方法可以减少电路降低成本,也可以达到较高的精度。调试时注意到由于程序中脉冲宽度的调整是靠调整定时器的初值,中断程序也被分成了8个状态周期,并且需要严格的周期循环,

13、而且运行其他中断程序代码的时间需要严格把握。在实际应用中,采用51单片机简单方便地实现了舵机控制需要的P W M 信号,对机器人舵机控制的测试表明舵机控制系统工作稳定,P W M 占空比(0.52.5ms 的正脉冲宽度)和舵机的转角(-90 90 )线性度较好。4、上位机上位机是指人可以直接发出控制命令的计算机,一般是PC。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机之类的。上位机发出的命令首先给下位机,下位机再根据此命令解释成相应时序信号直接控制相应设备。下位机不时读取设备状态数据(一般为模拟量),转换成数字信号反馈给上位机。为了在短时间内完成上位机编程,我们使用C#来制作

14、串口通讯上位机。C#(C Sharp)是微软为.NET Framework量身订做的程序语言,C#拥有C/C+的强大功能以及Visual Basic简易使用的特性,是第一个组件导向的程序语言,和C+与Java一样亦为对象导向程序语言。四、调试中遇到问题及解决方法在进行串口调试过程中,我们发现电脑经常出现找不到串口的情况,无论重新安装驱动,还是重新启动,都只是维持很短暂的时间,然后又出现上述情况。经检查应该是硬件的问题,我们估计是单片机学习板的串口连接脱焊导致的。我们还发现学习板的P0及P5口被其他的原件占用,无法直接从这两个口输出PWM信号,所以控制机械臂的接口只能跳过这两个,选用其他的。 在

15、调试控制舵机时,因为最开始用的舵机已经坏了,所以无论怎么调试,舵机都无法转动。拿到新的舵机后,我们最先用信号发生器产生脉冲信号,测试舵机转动角度的范围,发现并不是0-180,而是150度。虽然角度小了些,但还是能正常转动的。作为初期的练习控制舵机,基本满足要求,所以就没再换新的。由于机械臂的配合及机械物件连接不连贯,经常出现卡壳的状况,我们经过拧紧螺丝后,有所改善,但还是不够理想,希望以后可以买到更好的硬件。在调试的过程中,发现舵机的扭矩不是很大,可能是因为舵机过多,电流太小,无法达到额定扭矩,所以电路最好是制作一个驱动电路,以提高机械臂性能。在进行程序调试时经常会出现问题,这与我们对程序的学

16、习不够,有着直接的关系。在经过我们组成员一个学期的努力下,终于把程序完成,并不断改进。五、个人体会及心得本学期我们组在进行项目研究方面花费了很长时间,同时也遇到了很多困难,也学到了很多。由于专业的差异,我们研究的范围注定只局限于项目之内,即使这样我们的进度也是不尽如人意。主要原因还是在编程方面,虽然我们组成员都过了二级,但是还缺乏实际的动手编程经验,还需要加强这方面的能力。和以前做作业不同,本学期的项目需要每个队员的合作。有明确的分工,才会有效率,不能只等着别人。希望在下学期的努力学习下,能够将我们组的项目成功的完成,学习到一些感兴趣的知识,不给自己留下遗憾。单片机控制8路舵机程序:; T1

17、serial port to high T2 pwmPWMOUT0BITP0.0PWMOUT1BITP0.1PWMOUT2BITP0.2PWMOUT3BITP0.3PWMOUT4BITP0.4PWMOUT5BITP0.5PWMOUT6BITP0.6PWMOUT7BITP0.7T2CONDATA0C8HTF2BITT2CON.7EXF2BITT2CON.6RCLKBITT2CON.5TCLKBITT2CON.4EXEN2BITT2CON.3TR2BITT2CON.2C_T2BITT2CON.1CP_RL2BITT2CON.0T2BITP1.0T2EXBITP1.1RCAP2LDATA0CAHRC

18、AP2HDATA0CBHTL2DATA0CCHTH2DATA0CDHET2BITIE.5PT2BITIP.5/PWMWIDEQU048H; 16048H05FH ; First low 8bits then high 8bitschannelEQU032H;phaEQU033H;/ORG0000HLJMPMAINORG000BHLJMPT0_ISRORG002BHLJMPT2_ISRORG0100HMAIN:MOVSP, 60HMOV96H, #00HMOV8EH, #00H; InitSETB EA; enable interruptSETBET2CLR TCLKCLR RCLKMOV SC

19、ON, #050H; 8bit serialMOV TL2, #000H MOV TH2, #000HMOV RCAP2L, #03CH; 2.5msMOV RCAP2H, #0F6HCLRTF2SETBTR2CLR ES; disable serial interruptCLR TI; clear serial FLAGMOV TMOD, #21HMOVTH0, #000H; make time for T0_ISR to runCLR TF0SETB ET0CLR TR0MOVTL1,#0F3HMOVTH1,#0F3HSETBTR1CLR AMOV pha,AMOVA, #035HMOVP

20、WMWID+00H, AMOVPWMWID+02H, AMOVPWMWID+04H, AMOVPWMWID+06H, AMOVPWMWID+08H, AMOVPWMWID+0AH, AMOVPWMWID+0CH, AMOVPWMWID+0EH, AMOVA, #0FAHMOVPWMWID+01H, AMOVPWMWID+03H, AMOVPWMWID+05H, AMOVPWMWID+07H, AMOVPWMWID+09H, AMOVPWMWID+0BH, AMOVPWMWID+0DH, AMOVPWMWID+0FH, A; CommunicationCOMMU:JNB RI, COMMUCLR

21、 RIMOV channel,SBUFMOV SBUF,channelMOV A,channelJNB ACC.7, COMMUJBACC.6, COMMUJNB RI, $ANL channel, #07FHMOV A, #PWMWIDADD A, channelADDA, channelMOV R0, AMOVR1, SBUFCLRCMOVA, #0FFHSUBBA, R1; ADDCA, #12HMOVSBUF, AMOV R0, ACLRRIJNBRI, $MOVR1, SBUFMOVA, #0FFHSUBBA, R1INCR0MOVSBUF, AMOVR0, ACLR RISJMP

22、COMMUT0_ISR:PUSHACCCLRTR0MOVA,phaRLAMOVDPTR, #TABLEJMPA+DPTRTABLE:SJMPS0SJMPS1SJMPS2SJMPS3SJMPS4SJMPS5SJMPS6SJMPS7S0:CLRPWMOUT0POPACCRETIS1:CLRPWMOUT1POPACCRETIS2:CLRPWMOUT2POPACCRETIS3:CLRPWMOUT3POPACCRETIS4:CLRPWMOUT4POPACCRETIS5:CLRPWMOUT5POPACCRETIS6:CLRPWMOUT6POPACCRETIS7:CLRPWMOUT7POPACCRETIT2

23、_ISR:CLRTF2PUSH ACCINC phaANLpha, #07HMOVA,phaRLAMOVDPTR,#TABLE2JMPA+DPTRTABLE2:SJMPSS0SJMPSS1SJMPSS2SJMPSS3SJMPSS4SJMPSS5SJMPSS6SJMPSS7SS0:MOVTH0,PWMWID+01HMOVTL0,PWMWID+00HSETBPWMOUT0SETBTR0POPACCRETISS1:MOVTH0,PWMWID+03HMOVTL0,PWMWID+02HSETBPWMOUT1SETBTR0POPACCRETISS2:MOVTH0,PWMWID+05HMOVTL0,PWMW

24、ID+04HSETBPWMOUT2SETBTR0POPACCRETISS3:MOVTH0,PWMWID+07HMOVTL0,PWMWID+06HSETBPWMOUT3SETBTR0POPACCRETISS4:MOV TH0, PWMWID+09HMOV TL0, PWMWID+08HSETBPWMOUT4SETBTR0POPACCRETISS5:MOV TH0, PWMWID+0BHMOV TL0, PWMWID+0AHSETBPWMOUT5SETBTR0POPACCRETISS6:MOV TH0, PWMWID+0DHMOV TL0, PWMWID+0CHSETBPWMOUT6SETBTR0

25、POPACCRETISS7:MOVTH0,PWMWID+0FHMOVTL0,PWMWID+0EHSETBPWMOUT7SETBTR0POPACCRETIEND上位机程序(C#):using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Text;using System.Windows.Forms;namespace Cois public partial class Cois : Form private byte P = new by

26、te4; private byte checker; public Cois() InitializeComponent(); private void Form1_Load(object sender, EventArgs e) init(); private void Message() throw new NotImplementedException(); private void init() GetPortName(); this.CBx_baud.Text = global:Cois.Properties.Settings.Default.BaudRate; private vo

27、id GetPortName() string portNames = System.IO.Ports.SerialPort.GetPortNames(); CBx_port.Items.Clear(); foreach (string name in portNames) CBx_port.Items.Add(name); if (!CBx_port.Items.Contains(CBx_port.Text) try this.CBx_port.Text = (string)CBx_port.Items0; catch this.CBx_port.Text = global:Cois.Pro

28、perties.Settings.Default.PortName; private void CBx_port_SelectedIndexChanged(object sender, EventArgs e) serialPort.PortName = CBx_port.Text; private void CBx_baud_SelectedIndexChanged(object sender, EventArgs e) serialPort.BaudRate =Convert.ToInt32( CBx_baud.Text); private void write(int number) b

29、yte CMD = new byte3; CMD0 = (byte)number; CMD0 |= (byte)0x80; switch(number) case 0: CMD1 = (byte) (Servo0.Value+17)%256); CMD2 = (byte)(Servo0.Value +17)/ 256); serialPort.Write(CMD, 0, 3); break; case 1: CMD1 = (byte)(Servo1.Value+17)%256); CMD2 = (byte)(Servo1.Value+17) / 256); serialPort.Write(C

30、MD, 0, 3); break; case 2: CMD1 = (byte)(Servo2.Value+17)%256); CMD2 = (byte)(Servo2.Value +17)/ 256); serialPort.Write(CMD, 0, 3); break; case 3: CMD1 = (byte)(Servo3.Value+17)%256); CMD2 = (byte)(Servo3.Value+17) / 256); serialPort.Write(CMD, 0, 3); break; case 4: CMD1 = (byte)(Servo4.Value+17)%256

31、); CMD2 = (byte)(Servo4.Value+17) / 256); serialPort.Write(CMD, 0, 3); break; case 5: CMD1 = (byte)(Servo5.Value+17)%256); CMD2 = (byte)(Servo5.Value+17) / 256); serialPort.Write(CMD, 0, 3); break; case 6: CMD1 = (byte)(Servo6.Value+17)%256); CMD2 = (byte)(Servo6.Value+17) / 256); serialPort.Write(C

32、MD, 0, 3); break; case 7: CMD1 = (byte)(Servo7.Value+17)%256); CMD2 = (byte)(Servo7.Value+17) / 256); serialPort.Write(CMD, 0, 3); break; private void Btn_connect_Click(object sender, EventArgs e) if (serialPort.IsOpen) Btn_connect.Text = "Unconnected" Btn_connect.CheckState = System.Windo

33、ws.Forms.CheckState.Unchecked; serialPort.Close(); else try serialPort.Open(); catch Btn_connect.CheckState = System.Windows.Forms.CheckState.Unchecked; if (serialPort.IsOpen) Btn_connect.Text = "Connected" Btn_connect.CheckState = System.Windows.Forms.CheckState.Checked; write(0); write(1

34、); write(2); write(3); write(4); write(5); write(6); write(7); private void CBx_port_DropDown(object sender, EventArgs e) GetPortName(); private void Servo0_MouseUp(object sender, MouseEventArgs e) /if (serialPort.IsOpen) write(0); private void Servo1_MouseUp(object sender, MouseEventArgs e) /if (serialPort.IsOpen) write(1); private void Servo2_MouseUp(object sender, MouseEventArgs e) /if (serialPort.IsOpen) write(2); private void Servo3_MouseUp(object sender, MouseEventArgs e) /if (

温馨提示

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

评论

0/150

提交评论