基于AT89C2051单片机的多路舵机控制器设计文档
- 格式:docx
- 大小:37.31 KB
- 文档页数:3
基于AT89C2051单片机的多路舵机控制器设计摘要舵机是机器人、机电系统和航模的重要执行机构。
舵机控制器为舵机提供必要的能源和控制信号。
本文提出一种以外部中断计数为基础的PWM波形实现方法。
该方法具有简单方便,成本低,可实现多路独立PWM输出的优点。
关键词A T89C205l 舵机控制器外部中断PWM舵机是一种位置伺服的驱动器。
它接收一定的控制信号,输出一定的角度,适用于那些需要角度不断变化并可以保持的控制系统。
在微机电系统和航模中,它是一个基本的输出执行机构。
1 舵机的工作原理以日本FUTABA-S3003型舵机为例,图1是FUFABA-S3003型舵机的内部电路。
舵机的工作原理是:PWM信号由接收通道进入信号解调电路BA66881。
的12脚进行解调,获得一个直流偏置电压。
该直流偏置电压与电位器的电压比较,获得电压差由BA6688的3脚输出。
该输出送人电机驱动集成电路BA6686,以驱动电机正反转。
当电机转速一定时,通过级联减速齿轮带动电位器R。
,旋转,直到电压差为O,电机停止转动。
舵机的控制信号是PWM信号,利用占空比的变化改变舵机的位置。
2 舵机的控制方法标准的舵机有3条导线,分别是:电源线、地线、控制线,如图2所示。
电源线和地线用于提供舵机内部的直流电机和控制线路所需的能源.电压通常介于4~6V,一般取5V。
注意,给舵机供电电源应能提供足够的功率。
控制线的输入是一个宽度可调的周期性方波脉冲信号,方波脉冲信号的周期为20 ms(即频率为50 Hz)。
当方波的脉冲宽度改变时,舵机转轴的角度发生改变,角度变化与脉冲宽度的变化成正比。
某型舵机的输出轴转角与输入信号的脉冲宽度之间的关系可用围3来表示。
3 舵机控制器的设计(1)舵机控制器硬件电路设计从上述舵机转角的控制方法可看出,舵机的控制信号实质是一个可嗣宽度的方波信号(PWM)。
该方波信号可由FPGA、模拟电路或单片机来产生。
采用FPGA成本较高,用模拟电路来实现则电路较复杂,不适合作多路输出。
AT89CX051编程器的设计摘要本文给大家介绍一个实用的A T89CX051编程电路,编程器电路主要有监控电路、编程方式控制电路、与电脑通讯的接口电路、编程电压(VPP)控制电路和电源电路组成。
文章详细地说明了A T89CX051单片机编程时序,利用AT89C2051单片机和MAX232、74LS164构成了AT89CX051编程器。
关键字A T89C2051,MAX232,74LS164,Keil C51,VB1 概述AT89CX051 单片机体积小,外围引脚仅有20只,功能强,有15只可编程I/O口,价格低廉,零售价格不足十元,应用十分广泛,如现在使用的数字钟就是以它为主CPU。
要使用单片机,必不可少的一件东西,那就是编程器。
许多爱好者由于不具备专业的开发环境和编程器,且面对市场上多则几千元,少则几百元的编程器,很多人望而却步,从而无法进行单片机实验。
虽然现在很多单片机都带有ISP或IAP功能,能实现串行下载编程,但此款单片机没有串行下载编程功能。
本人借鉴其他编程器自制了个AT89CX051专用编程器。
这里给大家介绍一个AT89CX051编程电路,编程器电路主要有监控电路、编程方式控制电路、与电脑通讯的接口电路、编程电压(VPP)控制电路和电源电路组成。
监控芯片A T89C2051程序用C51语言编写,使用Keil开发环境,C语言具有可读性强、移植性好等优点。
电脑程序用VB编写,开发简单,是面向对象的可视编程。
利用A T89C2051单片机和MAX232,74LS164构成的AT89CX051编程器,完全满足要求。
2 硬件电路2.1 系统组成和工作原理此编程器主要有监控电路、编程方式控制电路、与电脑通讯的接口电路、编程电压(VPP)控制电路和电源电路组成。
如图1所示:图1 A T89CX051编程器框图AT89CX051单片机编程时序:1.接通电源(Vcc位+5V),置RST,XLAT1为低电平,延时至少10ms。
基于AT89C51单片机的电机控制综合设计目录1 系统的设计 (1)1.1设计的目的和要求 (1)1.2系统原理 (1)2 系统的构成 (2)2.1控制器部分 (2)2.1.1控制器分析 (2)2.1.2控制器主要功能特性 (2)2.1.2控制器引脚功能描述 (2)2.2数据显示部分 (4)2.2.1 12864液晶显示模块概述 (4)2.2.2 基本参数 (4)2.2.3模块引脚说明 (4)2.2.4 具体指令介绍: (5)2.2.5显示坐标关系 (8)3 硬件电路设计 (8)3.1LCD控制电路原理图 (8)3.2电机控制电路 (9)3.3速度反馈电路 (10)3.4MCU接口 (10)3.5按键电路 (11)4 软件设计 (11)4.1程序要求 (11)4.2程序流程图 (12)4.3程序清单 (12)4.3.1 LCD驱动程序 (12)4.3.2 主函数程序 (16)5程序的调试 (21)5.1编程软件KEIL C51简介 (21)5.2程序编译和调试 (21)6 结语 (25)设计、旅行、影视、摄影、科技、音乐、艺术、人文、出版、饮食、漫画游戏11 系统的设计1.1设计的目的和要求基于AT89C51单片机的电机控制综合系统,以电机为被控对象,由AT89C51单片机作为控制器,结合速度反馈和LCD液晶显示模块,组成一个有较好控制性和实时性的电机控制综合系统。
1.2系统原理系统的原理如上图1.2所示,控制器AT89C51通过外围电路控制电机转动。
由速度反馈电路反馈电机的速度信息,并进行伺服计算和控制。
整个系统的主要信息可以在LCD显示模块上显示。
2 系统的构成2.1控制器部分2.1.1控制器分析AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Progr ammable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器。
基于AT89C2051多路无线遥控灯节能控制器系别:专业:学号:姓名:指导老师:前言随着电子科学技术迅猛发展,各种新型器件,智能化电器及产品在国民紧经济各个领域和人民生活各个方面得到了日益广泛的应用。
为了给费者提供更多的方便,我们设计了一款无线遥控节能灯,可以实现中远程控制。
当按下遥控A键时一盏灯亮,再按一次灯灭,当按下遥控B键时两盏灯亮,再按一次灯灭,以此类推。
本次设计的基于AT89C2051多路无线遥控节能灯控制器分别由电源部分,发射部分,接收部分,控制部分和驱动部分组成。
电路具有高保密度遥控距离员工性能稳定可靠和静态功耗低等特点,实现对多路等的开关进行控制,遥控价格低廉,工作稳定可靠,且空间体积小外形美观,共有四个按键。
通过本次的设计使学生能够全面的巩固和应用数字电路和模拟电路的基本理论知识,设计简单使用的电力电子控制器件,解决生活中的实际问题。
培养学生独立思考问题,解决问题和分析问题的能力。
根据提出的问题,探索不一样的设计方案。
优化并选择较好的方案,为个人今后探索问题界却问题起到启蒙作用。
通过查找资料使学生了解电子技术发展的动向,启迪思维,开拓视野。
此设计具有一定的实用性,广泛应用于日常生活中,有一定的节能功能.目录第一章:设计任务书1.设计目的 ---------------------------------52.设计任务 ---------------------------------53.主要技术指标--------------------------------54.使用说明:----------------------------------75.注意事项:-----------------------------------86.编写设计报告书-------------------------------87.设计指导-------------------------------------9第二章:课题分析1.无线遥控 ------------------------------------10 2.基于AT89C2051------------------------------11第三章:总方案设计及论证1.系统构架总框图 -----------------------------13 2.遥控系统设计 ------------------------------13(1)遥控系统设计方框图 -------------------------13(2)编码发射 -----------------------------------14(3)接收解码 -----------------------------------21 3.单片机控制系统设计(1)控制系统原理图 -----------------------------26(2)控制编程 -----------------------------------28 4.电源系统设计(1)降压电路 ----------------------------------30(2)整流电路 -----------------------------------30(3)滤波电路 -----------------------------------31(4)稳压电路 -----------------------------------315.驱动系统设计 ------------------------------32第四章:整机原理1整机原理图 -------------------------------35 2整机原理说明 ------------------------------36第五章:系统调试 ---------------------------37第六章:心得体会 --------------------------38附1 元器件清单 ----------------------------40附2机原理图 -----------------------------42附3参考文献 -----------------------------43毕业设计(论文)任务书设计(论文)题目:基于AT89C2051多路无线遥控灯节能控制器系别:专业:班级:题目下达日期:年月日开始日期:年月日完成日期:年月日学生姓名:指导教师:教研室主任:批准日期:年月日一、设计任务书1.设计目的1) 使学生能够全面的巩固和应用数字电路和模拟电路的基本理论知识,设计简单使用的电力电子控制器件,解决生活中的实际问题。
用AT89C2051单片机设计步进电机的控制系统作者:谷玉玲来源:《科学与财富》2010年第03期[摘要] 本文介绍了一种由AT89C2051单片机对步进电机进行控制的系统,用软件代替由硬件电路组成的步进电机控制器,不仅简化了线路,降低了成本,而且提高了系统的可靠性。
它的主要特点是能实现精确移位、精确定位、无积累误差。
它一般应用于难度较大、要求精度高的绘图机或数控机床等系统中。
[关键词] 步进电机 AT89C2051单片机1、引言步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。
步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。
步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由脉冲信号频率决定。
步进电机的驱动电路根据控制信号工作,控制信号由单片机产生。
2、系统结构AT89C2051将控制脉冲从P1口的P1.4~P1.7输出,经74LS14反相后进入9014,经9014放大后控制光电开关,光电隔离后,由功率管TIP122将脉冲信号进行电压和电流放大,驱动步进电机的各相绕组。
使步进电机随着不同的脉冲信号分别作正转、反转、加速、减速和停止等动作。
图中L1为步进电机的一相绕组。
AT89C2051选用频率22MHz的晶振,选用较高晶振的目的是为了在方式2下尽量减小AT89C2051对上位机脉冲信号周期的影响。
图中的RL1~RL4为绕组内阻,50Ω电阻是一外接电阻,起限流作用,也是一个改善回路时间常数的元件。
D1~D4为续流二极管,使电机绕组产生的反电动势通过续流二极管(D1~D4)而衰减掉,从而保护了功率管TIP122不受损坏。
在50Ω外接电阻上并联一个200μF电容,可以改善注入步进电机绕组的电流脉冲前沿,提高了步进电机的高频性能。
单片机控制多路舵机第一章:引言(约200字)随着科技的不断发展,单片机技术在各个领域的应用越来越广泛。
在机器人、自动化控制等方面,多路舵机常常被用于实现机械的运动控制。
本论文将介绍一种基于单片机的多路舵机控制系统,旨在实现更加灵活和精确的机械运动控制。
第二章:多路舵机系统设计与实现(约300字)本章将详细介绍多路舵机系统的设计和实现细节。
首先,我们选用了一片高性能的单片机作为控制器,通过其IO口控制多个舵机的运动。
然后,根据实际需要,设计了电源电路、信号放大电路等。
接着,我们以舵机的类型和运动范围为基础,设计了控制算法,并利用单片机的定时/计数功能来实现对舵机的精确控制。
第三章:多路舵机系统性能测试与分析(约300字)为了验证多路舵机系统的性能,我们进行了一系列测试。
首先,我们测试了舵机的精确度和速度,通过与标准运动模式进行比较,得到了较为准确的评估结果。
其次,我们测试了整个系统的响应速度和稳定性,在不同负载情况下进行了多次测试,并对结果进行了统计和分析。
最后,我们还对系统的功耗和可靠性进行了测试和评估。
第四章:多路舵机系统应用案例分析(约200字)本章将介绍多路舵机系统在机器人控制领域的应用案例。
通过对一种特定机器人的控制需求进行分析,我们设计了一套多路舵机系统,用于实现机器人的自主行走和手臂动作控制。
通过实际测试,我们证明了多路舵机系统在机器人控制方面的灵活性和可靠性,为机器人技术的发展提供了可靠的基础。
第五章:总结与展望(约200字)通过对多路舵机系统的设计和实验结果进行总结,我们可以得出以下结论:多路舵机系统能够实现对多个舵机的高速、高精度控制,具有良好的扩展性和应用性。
然而,目前的多路舵机系统仍存在一些问题,如功耗较高、响应速度可以进一步提高等。
因此,未来的工作重点可以放在降低功耗、提高响应速度和研究更加精确的控制算法等方面,以进一步提高多路舵机系统的性能和应用范围。
第二章:多路舵机系统设计与实现(约300字)本章将详细介绍多路舵机系统的设计和实现细节。
在机器人机电控制系统中,舵机控制效果是性能的重要影响因素;舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口;舵机是一种位置伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统;其工作原理是:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压;它内部有一个基准电路,产生周期为20ms,宽度为的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出;最后,电压差的正负输出到电机驱动芯片决定电机的正反转;当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动;舵机的控制信号是PWM信号,利用占空比的变化改变舵机的位置;一般舵机的控制要求如图1所示;图1 舵机的控制要求单片机实现舵机转角控制可以使用FPGA、模拟电路、单片机来产生舵机的控制信号,但FPGA成本高且电路复杂;对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz周期是20ms的信号,这对运放器件的选择有较高要求,从电路体积和功耗考虑也不易采用;5mV以上的控制电压的变化就会引起舵机的抖动,对于机载的测控系统而言,电源和其他器件的信号噪声都远大于5mV,所以滤波电路的精度难以达到舵机的控制精度要求;也可以用单片机作为舵机的控制单元,使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度;单片机完成控制算法,再将计算结果转化为 PWM信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠;单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM 周期信号,本设计是产生20ms的周期信号;其次是脉宽的调整,即单片机模拟PWM信号的输出,并且调整占空比;当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将20ms分为两次中断执行,一次短定时中断和一次长定时中断;这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很高;具体的设计过程:例如想让舵机转向左极限的角度,它的正脉冲为2ms,则负脉冲为20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在2ms后发生中断,中断发生后,在中断程序里将控制口改为低电平,并将中断时间改为18ms,再过18ms进入下一次定时中断,再将控制口改为高电平,并将定时器初值改为2ms,等待下次中断到来,如此往复实现PWM信号输出到舵机;用修改定时器中断初值的方法巧妙形成了脉冲信号,调整时间段的宽度便可使伺服机灵活运动;为保证软件在定时中断里采集其他信号,并且使发生PWM信号的程序不影响中断程序的运行如果这些程序所占用时间过长,有可能会发生中断程序还未结束,下次中断又到来的后果,所以需要将采集信号的函数放在长定时中断过程中执行,也就是说每经过两次中断执行一次这些程序,执行的周期还是20ms;软件流程如图2所示;图2 产生PWM信号的软件流程如果系统中需要控制几个舵机的准确转动,可以用单片机和计数器进行脉冲计数产生PWM 信号;脉冲计数可以利用51单片机的内部计数器来实现,但是从软件系统的稳定性和程序结构的合理性看,宜使用外部的计数器,还可以提高CPU的工作效率;实验后从精度上考虑,对于FUTABA系列的接收机,当采用1MHz的外部晶振时,其控制电压幅值的变化为,而且不会出现误差积累,可以满足控制舵机的要求;最后考虑数字系统的离散误差,经估算误差的范围在±%内,所以采用单片机和8253、8254这样的计数器芯片的PWM信号产生电路是可靠的;图3是硬件连接图;图3 PWA信号的计数和输出电路点击放大基于8253产生PWM信号的程序主要包括三方面内容:一是定义8253寄存器的地址,二是控制字的写入,三是数据的写入;软件流程如图4所示,具体代码如下;1.//关键程序及注释:2.//定时器T0中断,向8253发送控制字和数据3.void T0Intinterrupt14.{5.TH0=0xB1;6.TL0=0xE0;//20ms的时钟基准7.//先写入控制字,再写入计数值8.SERVO0=0x30;//选择计数器0,写入控制字9.PWM0=BUF0L;//先写低,后写高10.PWM0=BUF0H;11.SERVO1=0x70;//选择计数器1,写入控制字12.PWM1=BUF1L;13.PWM1=BUF1H;14.SERVO2=0xB0;//选择计数器2,写入控制字15.PWM2=BUF2L;16.PWM2=BUF2H;17.}图4 基于8253产生PWA信号的软件流程当系统的主要工作任务就是控制多舵机的工作,并且使用的舵机工作周期均为20ms时,要求硬件产生的多路PWM波的周期也相同;使用51单片机的内部定时器产生脉冲计数,一般工作正脉冲宽度小于周期的1/8,这样可以在1个周期内分时启动各路PWM波的上升沿,再利用定时器中断T0确定各路PWM波的输出宽度,定时器中断T1控制20ms的基准时间;第1次定时器中断T0按20ms的 1/8设置初值,并设置输出I/O口,第1次T0定时中断响应后,将当前输出I/O口对应的引脚输出置高电平,设置该路输出正脉冲宽度,并启动第2次定时器中断,输出I/O口指向下一个输出口;第2次定时器定时时间结束后,将当前输出引脚置低电平,设置此中断周期为20ms的1/8减去正脉冲的时间,此路 PWM信号在该周期中输出完毕,往复输出;在每次循环的第16次2×8=16中断实行关定时中断T0的操作,最后就可以实现8路舵机控制信号的输出;也可以采用外部计数器进行多路舵机的控制,但是因为常见的8253、8254芯片都只有3个计数器,所以当系统需要产生多路PWM信号时,使用上述方法可以减少电路,降低成本,也可以达到较高的精度;调试时注意到由于程序中脉冲宽度的调整是靠调整定时器的初值,中断程序也被分成了8个状态周期,并且需要严格的周期循环,而且运行其他中断程序代码的时间需要严格把握;在实际应用中,采用51单片机简单方便地实现了舵机控制需要的PWM信号;对机器人舵机控制的测试表明,舵机控制系统工作稳定,PWM占空比~的正脉冲宽度和舵机的转角-90°~90°线性度较好;如何使用AT89S52编写这样一个程序;要求,单片机控制舵机,让舵机到中间位置后,左转15度,延迟2ms,右转15度;度数不要求精确;舵机为~;晶振12Minclude<>unsigned int pwm;unsigned char flag;sbit p10=P1^0;void timer0 interrupt 1 using 1{p10=p10;pwm=20000-pwm;TH0=pwm/256;TL0=pwm%256;flag++;ifflag<10flag++;ifflag==10&&p10==0{pwm=1250;flag=11;}//保证回到90度再左转15;}void timer1 interrupt 3 using 1{ET1=0;//2ms到关闭定时器1ET0=0;TR0=0;pwm=1750;TH0=pwm/256;TL0=pwm%256;ET0=1;TR0=1;}void int0 void interrupt 0 using 1{//判断左转到15,通过传感器判断或者其他信号判断 ,能正好保证刚左转15度,开始延时2msTR1=1;//定时器1开始计数}void mainvoid{p10=1;TMOD=0x11;pwm=1500;//回90度TH0=pwm/256;TL0=pwm%256;TH1=2000/256;TL1=2000%256;EA=1;ET0=1;ET1=1;TR0=1;while1;}舵机控制程序8路舵机控制器芯片:AT89S52晶振:12MHz============================================================================== =====/i nclude<>define uint8 unsigned chardefine uint16 unsigned intsbit key1=P1^4;sbit key2=P1^5;//PWM的输出端口sbit PWM_OUT0=P0^0;sbit PWM_OUT1=P0^1;sbit PWM_OUT2=P0^2;sbit PWM_OUT3=P0^3;sbit PWM_OUT4=P0^4;sbit PWM_OUT5=P0^5;sbit PWM_OUT6=P0^6;sbit PWM_OUT7=P0^7;//PWM的数据值uint16 PWM_Value8={1500,1000,1500,1000,1750,2000,2500,2000};uint8 order1; //定时器扫描序列/============================================================================= ======定时器T0的中断服务程序一个循环20MS = 8============================================================================== =======/void timer0void interrupt 1 using 1{switchorder1{case 1: PWM_OUT0=1;TH0=-PWM_Value0/256;TL0=-PWM_Value0%256;break;case 2: PWM_OUT0=0;TH0=-2700-PWM_Value0/256;TL0=-2700-PWM_Value0%256;break;case 3: PWM_OUT1=1;TH0=-PWM_Value1/256;TL0=-PWM_Value1%256;case 4: PWM_OUT1=0;TH0=-2700-PWM_Value1/256; TL0=-2700-PWM_Value1%256; break;case 5: PWM_OUT2=1;TH0=-PWM_Value2/256;TL0=-PWM_Value2%256;break;case 6: PWM_OUT2=0 ;TH0=-2700-PWM_Value2/256; TL0=-2700-PWM_Value2%256; break;case 7: PWM_OUT3=1;TH0=-PWM_Value3/256;TL0=-PWM_Value3%256;case 8: PWM_OUT3=0;TH0=-2700-PWM_Value3/256; TL0=-2700-PWM_Value3%256; break;case 9: PWM_OUT4=1;TH0=-PWM_Value4/256;TL0=-PWM_Value4%256;break;case 10: PWM_OUT4=0;TH0=-2700-PWM_Value4/256; TL0=-2700-PWM_Value4%256; break;case 11: PWM_OUT5=1;TH0=-PWM_Value5/256;TL0=-PWM_Value5%256;case 12: PWM_OUT5=0;TH0=-2700-PWM_Value5/256; TL0=-2700-PWM_Value5%256; break;case 13: PWM_OUT6=1;TH0=-PWM_Value6/256;TL0=-PWM_Value6%256;break;case 14: PWM_OUT6=0;TH0=-2700-PWM_Value6/256; TL0=-2700-PWM_Value6%256; break;case 15: PWM_OUT7=1;TH0=-PWM_Value7/256;TL0=-PWM_Value7%256;case 16: PWM_OUT7=0;order1=0;TH0=-2700-PWM_Value7/256;TL0=-2700-PWM_Value7%256;order1=0;break;default : order1=0;}order1++;}/============================================================================= ======初始化中断============================================================================== =======/void InitPWMvoid{order1=1;TMOD |=0x11;TH0=-1500/256;TL0=-1500%256;EA=1;EX0=0;ET0=1; TR0=1;PT0=1;PX0=0; }void delayvoid{uint16 i=100;whilei--;}void mainvoid{InitPWM;while1{ifkey1==0{ifPWM_Value0<2500 PWM_Value0++; }ifkey2==0{ifPWM_Value0>500 PWM_Value0--;}delay;}}单片机舵机控制程序include<>define uchar unsigned chardefine uint unsigned intuint a,b,c,d,n;sbit p12=P1^2;sbit p13=P1^3;sbit p37=P3^7;void timer0void interrupt 1 using 1 {p12=p12;c=20000-c;TH0=-c/256;TL0=-c%256;ifc>=500&&c<=2500c=a;elsec=20000-a;}void delay{uint i;fori=0;i<200;i++{}}void init_serialcommvoid{SCON= 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr TMOD |= 0x21; //TMOD: timer 1, mode 2, 8-bit reloadPCON |= 0x80; //SMOD=1;TH1 = 0xF4; //Baud:4800fosc=IE |= 0x93; //Enable Serial Interrupt TR1 = 1; // timer 1 run// TI=1;}void serial interrupt 4 using 3{ifRI{RI = 0;b=SBUF;SBUF=0xff;whileTI==0;TI=0;}}void mainvoid {//TMOD=0x21;init_serialcomm; p12=1;a=1500;c=a;TH0=-a/256;TL0=-a%256;PX0=0;PT0=1;TR0=1;while1{a=b10;}}舵机控制程序改变a值可控制任意角度include<>include<>define uchar unsigned chardefine uint unsigned intuint a,c;sbit p10=P1^0;sbit p11=P1^1;void timer0void interrupt 1{p10=p10;p11=p11;c=20000-c;TH0=-c/256;TL0=-c%256;ifc>=500&&c<=2500c=a;elsec=20000-a;}void delaylong j {forj;j>0;j--;}void mainvoid{p10=1;p11=1;a=2500; //180//c=a;TMOD=0x01; //16位定时器工作方式1 TH0=-a/256;TL0=-a%256;EA=1;ET0=1;TR0=1;fora=2500;a>=500;a--{a=a-10;c=a;delay5000;}}基于AT89C2051的多路舵机控制器设计 2007-11-10 11:37摘要舵机是机器人、机电系统和航模的重要执行机构;舵机控制器为舵机提供必要的能源和控制信号;本文提出一种以外部中断计数为基础的PWM波形实现方法;该方法具有简单方便,成本低,可实现多路独立PWM输出的优点;关键词 AT89:205l 舵机控制器外部中断PWM舵机是一种位置伺服的驱动器;它接收一定的控制信号,输出一定的角度,适用于那些需要角度不断变化并可以保持的控制系统;在微机电系统和航模中,它是一个基本的输出执行机构;1 舵机的工作原理以日本FUTABA-S3003型舵机为例,图1是FUFABA-S3003型舵机的内部电路;舵机的工作原理是:PWM信号由接收通道进入信号解调电路1;的12脚进行解调,获得一个直流偏置电压;该直流偏置电压与电位器的电压比较,获得电压差由的3脚输出;该输出送人电机驱动集成电路,以驱动电机正反转;当电机转速一定时,通过级联减速齿轮带动电位器R;,旋转,直到电压差为O,电机停止转动;舵机的控制信号是PWM信号,利用占空比的变化改变舵机的位置;2 舵机的控制方法标准的舵机有3条导线,分别是:电源线、地线、控制线,如图2所示;电源线和地线用于提供舵机内部的直流电机和控制线路所需的能源.电压通常介于4~6V,一般取5V;注意,给舵机供电电源应能提供足够的功率;控制线的输入是一个宽度可调的周期性方波脉冲信号,方波脉冲信号的周期为20 ms即频率为50 Hz;当方波的脉冲宽度改变时,舵机转轴的角度发生改变,角度变化与脉冲宽度的变化成正比;某型舵机的输出轴转角与输入信号的脉冲宽度之间的关系可用围3来表示;3 舵机控制器的设计1舵机控制器硬件电路设计从上述舵机转角的控制方法可看出,舵机的控制信号实质是一个可嗣宽度的方波信号PWM;该方波信号可由FPGA、模拟电路或单片机来产生;采用FPGA成本较高,用模拟电路来实现则电路较复杂,不适合作多路输出;一般采用单片机作舵机的控制器;目前采用单片机做舵机控制器的方案比较多,可以利用单片机的定时器中断实现PWM;该方案将20ms的周期信号分为两次定时中断来完成:一次定时实现高电平定时Th;一次定时实现低电平定时T1;Th、T1的时间值随脉冲宽度的变换而变化,但,Th+T1=20ms;该方法的优点是,PWM信号完全由单片机内部定时器的中断来实现,不需要添加外围硬件;缺点是一个周期中的PWM信号要分两次中断来完成,两次中断的定时值计算较麻烦;为了满足20ms的周期,单片机晶振的频率要降低;不能实现多路输出;也可以采用单片机+8253计数器的实现方案;该方案由单片机产生计数脉冲或外部电路产生计数脉冲提供给8253进行计数,由单片机给出8253的计数比较值来改变输出脉宽;该方案的优点是可以实现多路输出,软件设计较简单;缺点是要添加l片8253计数器,增加了硬件成本;本文在综合上述两个单片机舵机控制方案基础上,提出了一个新的设计方案,如图4所示;该方案的舵机控制器以单片机为核心,555构成的振荡器作为定时基准,单片机通过对555振荡器产生的脉冲信号进行计数来产生PWM信号;该控制器中单片机可以产生8个通道的PWM信号,分别由的P1.0~12~19引脚端口输出;输出的8路PWM信号通过光耦隔离传送到下一级电路中;因为信号通过光耦传送过程中进行了反相,因此从光耦出来的信号必须再经过反相器进行反相;方波信号经过光耦传输后,前沿和后沿会发生畸变,因此反相器采用施密特反相器对光耦传输过来的信号进行整形,产生标准的PWM方波信号;笔者在实验过程中发现,舵机在运行过程中要从电源吸纳较大的电流,若舵机与单片机控制器共用一个电源,则舵机会对单片机产生较大的干扰;因此,舵机与单片机控制器采用两个电源供电,两者不共地,通过光耦来隔离,并且给舵机供电的电源最好采用输出功率较大的开关电源;该舵机控制器占用单片机的个SCI串口;串口用于接收上位机传送过来的控制命令,以调节每一个通道输出信号的脉冲宽度;为电平转换器,将上位机的电平转换成TTL电平;2实现多路PWM信号的原理在模拟电路中,PWM脉冲信号可以通过直流电平与锯齿波信号比较来得到;在单片机中,锯齿波可以通过对整型变量加1操作来实现,如图5所示;假定单片机程序中设置一整型变量SawVal,其值变化范围为O~N;555振荡电路产生的外部计数时钟信号输入到的INTO脚;每当在外部计数时钟脉冲的下降沿,单片机产生外部中断,执行外部中断INT0的中断服务程序;每产生一次外部中断,对SawVal执行一次加1操作,若SawVal已达到最大值N,则对SawVal清O;SawVal值的变化规律相当于锯齿波,如图5所示;若在单片机程序中设置另一整型变量DutyVal,其值的变化范围为O~N;每当在SawVal清0时,DulyVal从上位机发送的控制命令中读入脉冲宽度系数值,例如为H0≤H≤N;若DutyVal≥SawVal,则对应端口输出高电平;若DutyVal<Sawval,则对应端口输出低电平;从图5中可看出,若改变DutyVal的值,则对应端口输出脉冲的宽度发生变化,但输出脉冲的频率不变,此即为PWM波形;设外部计数时钟周期为TINT0,锯齿波周期PWM脉冲周期为TPWM,PWM脉冲宽度占空比为D,由图5可得出如下关系:由式3可知,PWM波形的周期TPWM一旦确定下来,只须选定计数最大值N,就可以确定外部时钟脉冲所需周期频率;外部时钟脉冲周期TINT0显然是PWM脉冲宽度变换的最小步距,即调节精度;由式4可知,N越大,步距所占PWM周期的百分比越小,精度越高;例如,若采用8位整型变量,最大值N=28-1=255,则精度为1/255+1=1/255;若采用16位整型变量,最大值N=216-1=65535,则精度为1/65536;文中计数变量SawVal采用8位整型变量,因此N=255;对于一般应用,其精度已足够;就舵机而言,要求TPWM=20ms,则可算得外部时钟周期为:因此,设计555振荡电路时,其输出脉冲的频率应为:当有多个变量与SawVal比较,将比较结果输出到多个端口时;就形成了多路PWM波形;各个变量的值可以独立变化,因此各路PWM波形的占空比也可以独立调节,互不相干;多路PWM波形的产生如图6所示;图中以3路PWM波形为例;4 舵机控制器软件的设计舵机控制器的控制核心为单片机;文中,程序用C5l编写,工作方式为前后台工作方式;单片机程序包括系统初始化程序、串口通信程序、上位机命令解释与PWM脉宽生成程序和多路PWM波形输出程序;串行通信程序和多路PWM波形输出程序采用中断方式;串口通信格式为渡特率9600bps、8位数据位、1位停止位、无校验、ASCII码字符通信;串口通信程序用于接收上位机发送过来的控制命令;控制命令采用自定义文本协议,即协议内容全部为ASCII码字符;通信协议格式如图7所示;例如,要控制通道1的PWM脉宽,脉宽系数为25,则通信协议内容为“”“1”“0”“2”“5”“”这6个字符;这时通道l的PWM占空比为25/256=O.098;一个通道号对应一个PWM脉冲输出端口;本设计为8个通道,号码为l~8,对应单片机的P1.o~P1.7;起始符和终止符起到帧同步的作用;串口通信程序流程如图8所示;图8中,CHNo存放的是PWM通道号ASCII码,Dutyl00、DutylO、Duoyl分别存放的是脉宽系数的百位数、十位数和个位数的ASCII码注意,若高位数为O,则该位的字符应为“0”,不能省略;如25,完整字符应为“O”“2”“5”;CharNo为信号量,用于对串口接收的字符顺序以及串口中断与上位机命令解释程序之间进行同步;5 舵机控制器实验图9为舵机控制板输出的其中一路PWM波形带舵机负载;从图9中可看出,舵机控制器输出的PWM波形稳定、干净,符合设计要求;6 结论本文提出的多路舵机控制器设计方法,以单片机为核心,由外部振荡电路提供PWM脉冲的定时基准,控制部分与舵机驱动部分由两个电源供电,两者电气隔离;这种设计方案的优点是:①PWM波形由外部振荡电路提供定时基准,与单片机内部振荡器的频率无关,不影响串口通信、定时器等参数的配置;②PWM波形的调整精度可任意确定;③本没计思路可应用于任意多路的PWM输出,只要单片机能提供足够多的输出端口,例如将换成AT89S5l,就可以提供至少24路的PWM输出P0、Pl、P2;④控制参数由SCI串口输入,适应面广,上位机可以是PC机、单片机或是PLC;⑤本方法具有一般性,任何单片机只要能提供SCI中断、外部中断就可以应用本方法;。
基于AT89C2051单片机的多路舵机控制器设计文档
多路舵机控制器(Multi-Channel Servo Controller)是一种用于控
制多个舵机的电子设备。
它通过单片机来实现对多个舵机的精确控制,使
舵机可以按照设定的角度来旋转,从而实现机械臂、机器人、遥控模型等
设备的运动控制。
本文将详细介绍基于AT89C2051单片机的多路舵机控制
器的设计方案和实现过程。
设计方案:
1.硬件设计:
-AT89C2051单片机:作为控制器的核心,负责接收并处理指令,控
制舵机的旋转。
-舵机:根据具体应用需求选择适当数量的舵机,连接到单片机的输
出引脚上。
-给电源:为舵机和单片机提供稳定的工作电压,根据舵机和单片机
的工作电压要求选择合适的电源电压和电流。
-连接线:将舵机和单片机通过连接线连接起来,确保传输信号的可
靠性和稳定性。
2.软件设计:
-舵机控制程序:使用C语言编写舵机控制程序,实现对舵机的控制。
程序中需要包含对舵机旋转角度的设定和控制信号的发送逻辑。
-指令解析程序:根据通信协议将指令解析为具体的舵机控制指令,
传递给舵机控制程序进行处理。
-用户界面程序:设计简单直观的用户界面,通过串口通信或者其他方式与单片机进行通信,发送舵机控制指令。
实现过程:
1.硬件连接:
-将AT89C2051单片机的引脚连接到舵机的控制引脚上,以便通过单片机产生PWM信号来控制舵机的旋转角度。
-将单片机的其他引脚连接到适当的接口上,用于接收外部指令和连接其他外设(如显示屏、按键等)。
-结合具体应用需求,设计舵机控制器的外部电路,包括电源电压的稳定供应和其他外设的连接。
2.软件开发:
-根据硬件设计确定单片机的引脚分配,编写相应的舵机控制程序。
-编写指令解析程序,将接收到的指令解析为具体的舵机控制指令,传递给舵机控制程序进行处理。
-设计用户界面程序,实现与舵机控制器的通信,发送指令给舵机控制器并接收反馈信息。
3.调试测试:
-将舵机控制器连接到舵机和电源上,并与上位机建立通信。
-通过上位机发送指令,查看舵机是否按照指定角度进行旋转,调试和优化舵机控制程序。
-检验舵机控制器的稳定性和准确性,确保舵机可以按照要求进行精确的控制。
总结:
基于AT89C2051单片机的多路舵机控制器的设计需要考虑硬件和软件两方面的内容。
在硬件设计中,需要合理选择舵机、电源和连接线,并保证电源的稳定供应和信号传输的可靠性。
在软件设计中,需要编写舵机控制程序、指令解析程序和用户界面程序,实现与舵机控制器的通信和指令解析。
通过调试测试,可以验证设计的稳定性和准确性,确保舵机可以按照指定角度进行旋转。