prom cds55xxyhsc机器人舵机用户手册_第1页
prom cds55xxyhsc机器人舵机用户手册_第2页
prom cds55xxyhsc机器人舵机用户手册_第3页
prom cds55xxyhsc机器人舵机用户手册_第4页
prom cds55xxyhsc机器人舵机用户手册_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

ProMotionCDS55xx””对本文的意见、建议和疑问都可以到“博

发帖讨论,是 技术服务邮箱:robot第一章部件概述proMOTIONCDS系列机器人舵机属于一种集电机、伺服驱动、总线式通讯接口为一控制场合。CDS55XX的特点如下所示: CDS5516:DC

u位置伺服控制模式下转动范围0-300°u可设置为电机模式整周旋转,开环调速u总线连接,理论可串联254个单元 CDS55xx254链型,通过UART异步串行接口统一控制。每个舵机可以设定不同的节点地址,多个舵机可对其进行参数设置、功能控制。通过异步串行接口发送指令,CDS55xx可以设置为电机控制模式或位置控制模式。在电机控制模式下,CDS55xx可以作为直流电机使用,速度可调;在位置控制模式下,CDS55xx0-300°的转动范围,在此范围内具备精确位置经调试器转发给CDS55xx。CDS55xx会执行数据包的指令,并且返回应答数据包。1CDS方式离不开PC机,不能搭建独立的机器人构型。您可以设计的控制器,通过控制器的UART1.3.3UARTCDSUART步串行总线通讯,通讯速度可高达1Mbps,且接口简单、协议精简。CDS55xx通讯的UART第二章通讯协议令中包含ID信息,只有匹配上ID号的舵机才能完整接收这条指令,并返回应答信息。0XFFParameter1...ParameterCheckIDID254IDID254(0XFE),所有的舵机均接收CheckSum=~(ID+Length+Instruction+Parameter1+...Parameter255,则取最低的一个字节,“~”0XFFParameter1...ParameterCheck 含舵机的当前状态ERROR,若舵机当前工作状态不正常,会通过这个0如果收到一个未定义的指令或收到前未收到REGWRITE指令置校验和错误置ERROBI若指令是读指令READDATA,则Parameter1...ParameterN是的信息。值0READDATA(读2WRITEDATA(写不小于不小于00SYNCWRITE(同步写不小于功 写数据到CDS55xx的控制长 N+3(N为写入数据的长度指 参数 参数 参数 第二个数参数 第N个数1CDS55xxID1指令包的ID使用广播ID(0xFE)。指令帧:0XFF0XFF0XFE0X040X030X030X010XFF0X03CheckSum=~(ID+Length+Instruction+Parameter1+...Parameter255,则取最低的一个字节,“~”功 长 指 参数 参数 例2ID为1的CDS55xx的内部温度。指令帧:0XFF0XFF0X010X040X020X2B0X010XFF0X2B返回的数据帧:0XFF0XFF0X010X030X000X20参 0XFF REGWRITEWRITEDATAREGWRITE0x2c)置1。当收到ACTION指令后,的指令最终被执行。长 N+3(N为要写入数据的个数指 参数 参数 参数 参数 要写入的第N个数功 触发REGWRITE指长 指 参 CDS55xxACTION指令时,要用到广播ID(0xFE),因此,发送此指令不功 长 指 参 例3ID号为1的CDS55xx的工作状0XFF0XFF返回的数据帧:0XFF0XFF0X010X020X000XFF不管是广播IDReturnLevelAddress160,PINE功 长 指 参 4复位CDS55xx,ID00XFF0XFF返回的数据帧:0XFF0XFF0X000X020X000XFF功 用于同时控制多个CDS55xx 长 (L+1)*N+4(L:发给每个CDS55xx的数据长度,N:CDS55xx的个数指 参数 参数 参数 第一个CDS55xx的ID参数 参数 写入第一个CDS55xx的第二个数参数 写入第一个CDS55xx的第L个数参数 第二个CDS55xx的ID参数 写入第二个CDS55xx的第一个数参数 写入第二个CDS55xx的第二个数…参数 写入第二个CDS55xx的第L个数REGWRITE+ACTIONSYNCWRITECDS55xxREGWRITE+ACTIONSYNCWRITE54CDS55xxID0:位置:0X010;速度:0X150ID1:位置:0X220;速度:0X360ID2:位置:0X030;速度:0X170ID3:位置:0X220;速度:0X380指令帧:0XFF0XFF0XFE0X180X830X1E0X040X000X100X000X500X010X010X200X020X600X030X020X300X000X700X010X030X200X020X800X030XFF0X1E0X000X100X000X500X010X200X020X600X020X300X000X70

0X030X200X020X80第三章内存控制表和机器人舵机本身的信息和控制参数形成了一,保存在其控制的RAMEEPROM区域。我们通过实时修改表里的内容,可以达到实时控制舵机的目的。这 和读??00度读?读?读?读?读?读?读?读?REGWRITE读读最 最 命令,其范围为0x00—0xff。“--”表示不可修改参数。波特率的计算:Speed(BPS) Address4默认为1,表示的波特率为1M,可按此把波特率修改为用户需要的其特率会被恢复为1M.1137置。时间范围:参数(0~255)*2US,若250500us0,表示则等于限制值,且舵机状态位的角度超范围标志会置1。地址 012 0 0滑度的是ACC,DCC。即加速度和度。由0x22~0x23设置。1,102301023。2102100SPEED 第四章示例 1:把ID1指令=WRITEDATA;地址=0X03;数据=指令包:FFFF0104030300应答包:FFFF010200IDIDl例2:把0号舵机运行的角度范围限制在0~150°之间指令=WRITEDATA;地址=0X08;数据=0XFF,0X01指令包:FFFF00050308FF01EF应答包:FFFF000200 指令=WRITEDATA;地址=0X0B;数据=0X50指令包:FFFF0004030B509D应答包:FFFF000200 指令=WRITEDATA;地址=0X0C;数据=0X3C,指令包:FFFF0005030C3C5A应答包:FFFF000200 指令=WRITEDATA;地址=0X0E;数据=0XFF,指令包:FFFF0005030EFF01应答包:FFFF000200指令=WRITEDATA;地址=0X10;数据=0X00指令包:FFFF0004031000E8应答包:FFFF000200 指令=WRITEDATA;地址=0X18;数据=指令包:FFFF0004031800应答包:FFFF000200 指令=WRITEDATA;地址=0X1E;数据=0x00,0x02,0x00,指令包:FFFF0007031E00020002应答包:FFFF000200 运用REG_WRITE+ACTION指令可以实现它们同时动作ID=2;指令=REG_WRITE;地址=0X1E;数据=0x00,0x00ID=1;指令=REG_WRITE;地址=0X1E;数据=0xFF0x03ID=0XFE;指令=ACTION指令包:FFFF0205041E0000应答包:FFFF020200指令包:FFFF0105041EFF03应答包:FFFF010200指令包:FFFFFE0205 指令=WRITEDATA;地址=0X2F;数据=指令包:FFFF0004032F01应答包:FFFF000200 指令=WRITEDATA;地址=0X30;数据=0X04,指令包:FFFF000503300406应答包:FFFF000200第五AVR 5454321 M128_SCK M128_TXD0 M128_RXD0

Y1

M128_/RST

RobotServo

C1

14U1A

1GND7321

1 1。《EclipseForAVR程序开发》。该程序最初的目标是让一个舵机在两个位置之间摆动,接 Type”列表中展开“AVRCrossTargetApplication”项,选择“EmptyProject”,如弹出目标设备属性设置框,在“MCU”下拉列表中选择“MCUry”中输入“ ”,下图所示。点击“Fin完成工程创”-Eclipse,main.c“ServoControl”工程并处于可编辑状**文件名称(File **最后修订日期(DateLast**最后版本(Last**描述**创建人**创建日期(Date**版本**描述Fileint{}}while{;}控制卡和舵机时通过UART0来通讯的,所以程序运行后首先需要进行UART0的初始化。另外,实现避障小车控制逻辑时,需要连接两个IO量传感器来判断,所以也需要进行IO的初始化。****修订人**修订日期(DatevoidInitGpio(void){/*端口映射表(Portmap)//GPIO0-//GPIO1-//GPIO2-//GPIO3-//////(SetgeneraldigitalI/Oport0andport1toinputDDRE&=~(_BV(PE5)|////(SetSetgeneraldigitalI/Oport0andpull-upPORTE|=(_BV(PE5)|} #include<avr/io.h> 保存main.c,然后点击 #include<avr/io.h>main.c中添加函数InitUart0UART0**函数名称(Function**函数描述**输入变量(Input**返回值(Returnuart0初始化函数(Init**使用宏或常量(Macroorconstant**使用全局变量(Globalvariable**调用函数(Otherfunction**创建人**创建日期(Date**修订人**修订日期(Datevoid{/*设置波特率(SetbaudUCSR0A=0x02; //设置为倍速模式(Settodoublevelocitymode)UBRR0H=0;////(Setmainclockto16M,baudrateto1M)UBRR0L=1;//与发送器使UCSR0B=(1<<RXEN)|(1<<TXEN);//设置帧格式8个数据位1//(Setdataframe:8databits,1stopbit)UCSR0C=(3<<UCSZ0);/*设置端口状态(Setportstate)DDRE& //RX(SetdefaultdirectionofRXtoinputmode)PORTE&=~_BV(PE0); //初始化RX端口默认状态为高阻SetdefaultstateofRXtotri-state)DDRE|=_BV(PE1);//初始化TX端口默认方向为输出(SetdefaultdirectionofTXtooutputmode)PORTE|=_BV(PE1); //初始化TX端口默认状态为高电平SetdefaultstateofRXtohighstate)DDRA|=_BV(PA0);//初始化使能端口状态方向为输出EnabledirectionofPortAasoutput)PORTA&=~_BV(PA0); //初始化使能端口状态为RX状态(SetPortAstateassametoRX)DDRA|=_BV(PA1);//初始化使能端口状态方向为输出//(SetPortAstateassametoRX)PORTA|=_BV(PA1); RX状态//(SetPortAstateassameto}将上面代 粘贴到main.c文件,点击保存main.c,然后点击重新编UART0际发送时,UART0是按字节发送的。为了方便调用,这里首先在main.c中加入一个函数SendUart0Byte,该函数实现通过UART0发送一个字节数据的功能。代码如下:**函数名称(Function **函数描述 unsignedchar创建人修订人voidSendUart0Byte(unsignedchardata){////waitingforfinishingsendingalldatasintheTransmitBufferwhile(!(UCSR0A&(1<<UDRE)));/*将数据放入缓冲器,发送数据*/UDR0=data;}将上面代码粘贴到main.c文件,点击 保存main.c,然后点击 CDS55xx系列舵机可以设置为两种模式:舵机模式和电机模式。舵机出厂时默认是CDS55xx系列舵机可以设置为两种模式:舵机模式和电机模式。舵机出厂时默认是 **函数名称(Function**函数描述(Setservopositionlimitationandchangeservo**输入变量(InputVariable): cw_limit;signedshortintccw_limit;**返回值(Return **使用宏或常量(Macroorconstant **使用全局变量(Globalvariable **调用函数(Otherfunction **创建人 **创建日期(Date 3-**修订人**修订日期(DatevoidSetServoLimit(unsignedcharid,unsignedshortintcw_limit,unsignedshortint{unsignedshortinttemp_ccw ////(tempvelocitytojudgetheunsignedshortinttemp_cw=unsignedchartemp_ccw_h //hhbitstobesended)unsignedchartemp_ccw_l=0; //待发送数据l位//(lbitstobeunsignedchartemp_cw_h=0;unsignedchartemp_cw_l=unsignedchartemp_sum ////(tempvariabletosaveif(ccw_limit>{}{}

temp_ccw ////(limitthevelocityto0-temp_ccw=if(cw_limit>{temp_cw=}{}

temp_cw=temp_ccw_h=(unsignedchar)(temp_ccw>>temp_ccw_l(unsigned //16bit28bit//(split16bitsto2temp_cw_h=(unsignedchar)(temp_cw>> //16bit28bit//(split16bitsto2PORTA|= ////(SetthebustohosttransmitUCSR0A|= //UART0//(Clearwrittenflagof ////(Sendthestartbyte ////(Sendthestartbyte ////(Sendtheservo’s ////(Sendthelengthof //命令数据为“WRITE//(Sendcommand“WRITE //(Sendthestartaddressofcontrolrigister) //发送顺时针位置限制低位(Sendthelowbyteofclockwisepositionlimit) //发送顺时针位置限制//(Sendthehighbyteofclockwisepositionlimit) //发送逆时针位置限制低位//(SendthelowbyteofcounterclockwisepositionSendUart0Byte(temp_ccw_h);//发送逆时针位置限制(Sendthelowbyteofcounterclockwisepositionlimit)temp_sumid70x030x06temp_cw_ltemp_cw_htemp_ccw_ltemp_ccw_h;temp_sum=~temp_sum; //计算校验和(Calculatethechecksum) //发送校验和//(SendwhileUCSR0A&(1<<TXC0)))//}} //(Thebuswillbeoverrodebyslaveafterfinishing//toreceivetheanswer,soheredelays2//(SettheUARTbustohostreceivingPORTA|=};//(Waitingforfinishing{将上面代码粘贴到main.c文件,点击 保存main.c,然后点击 发**函数名称(Function**函数描述**输入变量(Input

设置舵机位置(Setservounsignedcharid;unsignedshortintsignedshortint**返回值(Return **使用宏或常量(Macroorconstant **使用全局变量(Globalvariable **调用函数(Otherfunction **创建人 **创建日期(Date 3-**修订人**修订日期(DatevoidSetServoPosition(unsigned charid,unsigned position,unsigned { ////(tempvelocitytojudgetheunsignedshortinttemp_position= //hhbitstobesended)unsignedchartemp_velocity_l=0; //待发送数据l位//(lbitstobeunsignedchartemp_position_h=0;unsignedchartemp_position_l=unsignedchartemp_sum ////(tempvariabletosaveif(velocity>{}{}

temp_velocity ////(limitthevelocityto0-temp_velocity=if(position>{temp_position=}{}

temp_position=//16bit28bit//(split16bitsto2temp_position_h=(unsignedchar)(temp_position>>//16bit28bit//(split16bitsto2PORTA|= ////(SetthebustohosttransmitUCSR0A|= //UART0//(Clearwrittenflagof ////(Sendthestartbyte ////(Sendtheservo’s ////(Sendthelengthof //命令数据为“WRITE//(Sendcommand“WRITE //(Sendthestartaddressofcontrolregister) //发送速度数据低位(Sendthelowbyteofvelocity) //发送速度数据(Sendthehighbyteofvelocity) (Sendthelowbyteofposition) //发送位置高字节//(Sendthehighbyteoftemp_sum=id+7+0x03+0x1E+temp_position_l+temp_position_h+temp_velocity_l+temp_sum //}});////(Thebuswillbeoverrodebyslaveafterfinishing//toreceivetheanswer,soheredelays2//(SettheUARTbustohostreceivingPORTA|=//while(!(UCSR0A&(1<<TXC0)){;}//(calculatethe//发送校验和(Sendthe将上面代码粘贴到main.c文件,点击 保存main.c,然后点击 现通过UART0现通过UART0**函数名称(Function **函数描述 设置舵机速度(Setservo**输入变量(Input unsignedcharid;signedshortint**返回值(Return **使用宏或常量(Macroorconstant **使用全局变量(Globalvariable **调用函数(Otherfunction **创建人 **创建日期(Date 3-**修订人**修订日期(DatevoidSetServoVelocity(unsignedcharid,signedshortintvelocity){unsignedchartemp_sign //(tempvariabletojudgethedirection)unsignedshortinttemp_velocity=0; //临时速度,用于进行方向判别(tempvelocitytojudgethedirection)unsignedchartemp_value_h=0; //待发送数据h位//(hbitstosend)unsignedchartemp_value_l=0; l位//(lbitstounsignedchartemp_sum ////(tempvariabletosaveif(velocity<{}}{ tive,gettheabsolute temp_sign // //(Setnegativep temp_velocity= temp_sign //c //(Setpositive=-;////(if(temp_velocity>{temp_velocity ////(Limitthevelocityto0-}//bit10为方向位,这时temp_velocity//(Setbit0asdirectionbit,thentemp_velocityisthedatatobesended)temp_velocity|=(temp_sign<<10);//16bit28bit//(Splitthe16bitsto2PORTA|= ////(SetthebustohosttransmitUCSR0A|= //UART0//(Clearwrittenflagof ////(Sendthestartbyte ////(Sendthestartbyte ////(Sendtheservo’s ////(Sendthelengthof //命令数据为“WRITE//(Sendcommand“WRITE //(Sendthestartaddressofcontrolregister) //发送速度数据低位(Sendthelowbyteofvelocity) //发送速度数据(Sendthehighbyteofvelocity)temp_sum=id+5+0x03+0x20+temp_value_l+temp_value_h;temp_sum=~temp_sum; //计算校验和//(Calculatethe //while(!(UCSR0A&(1<<TXC0))) //等待发送完成 }});////thebuswillbeoverrodebyslaveafterfinishing//toreceivetheanswer,soheredelays2//(SettheUARTbustohostreceivingPORTA|=};将上面代码粘贴到main.c文件,点击 保存main.c,然后点击 辑。这里假设要控制的舵机ID是1,修改main函数后代码如下:**函数名称(Function**函数描述

控制舵机摆动(WavetheServoofID**调用函数(Otherfunction**创建人**创建日期(Date**修订人**修订日期(Date将上面代码粘贴到main.c文件,点击保存main.c,然后点击重新编译者IAP的方式程序到控制卡中。详细方法请参考《EclipseForAVR程序开发》。 2(后),小车左侧的舵机ID为3(前)和4(后)。右侧的红外传感器连接到控制器的IO0,左侧的红外传感器连接到IO1。输入变量(Inputunsignedchar*返回值(Return使用宏或常量(Macroorconstant使用全局变量(Globalvariable创建人修订人voidGetGpio(unsignedchar*val){temp_input_value=0;if(PINE& //PINE指定位(Getvalueof{}{}

<<//(_BVisamacrotoshift,_BV(0)meanstemp_input_value&=if(PINE& //PINE指定位(Getvalueof{}{}

temp_input_value|=temp_input_value&=*val=} **函数名称(Function **函数描述 左转(**输入变量(Input unsignedshortint**返回值(Return **使用宏或常量(Macroorconstant **使用全局变量(Globalvariable **调用函数(Otherfunction **创建人 **创建日期(Date 3-**修订人**修订日期(DatevoidTurnLeft(unsignedshortinttime){ //(ControltheservoofID1to//withthevelocityof500)SetServoVelocity(2,500); //(ControltheservoofID2to//withthevelocityof500)SetServoVelocity(3,500); //(ControltheservoofID3to//withthevelocityof500)SetServoVelocity(4,500); //(ControltheservoofID4to//withthevelocityof //延时(Delaytime}**使用宏或常量(Macroorconstant **使用全局变量(Globalvariable **调用函数(Otherfunction **创建人 **创建日期(Date 3-**修订人**修订日期(DatevoidTurnRight(

温馨提示

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

评论

0/150

提交评论