关于51单片机控制舵机(减速电机类似)的详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

sfr CCAPM0=0xDA;//PCA 模块 0 的工作模式寄存器
//--------------------------------------//7 1 0 //- ECMn CAPPn CAPNn MATn T0Gn PWMn ECCFn 6 5 4 3 2
//--------------------------------------//ECOMn:使能比较器, 1 时使能比较器 功能 //CAPPn:正捕获,1 时使能上升沿捕 获 //CAPNn:负捕获,1 时使能下降沿捕 获 //MATn:匹配:1 时,PCA 计数器的值与
//---------------------------------------------//ECF:PCA 计数溢出中断使能:1 时, 使能 寄存器 CCON CF 位的中断。0 时禁止该功能。
sfr CL=0xE9;//CL 和 CH 为正在自由递增计数的 16 位 PCA 定时器的值。
sfr CH=0xF9; /***PWM0 相关特殊功能寄存器***/ sfr CCAP0L=0xEA;//PCA 模块 0 的捕捉/比较寄存器低 8 位 sfr CCAP0H=0xFA;//PCA 模块 0 的捕捉/比较寄存器高 8 位
//-------------------------------//CIDL:计数阵列空闲控制,0 时,空闲 模式下 PCA 计数器继续工作;1 时空闲模式 PCA 停止工作。
//--------------------------------------------//CPS2 CPS1 CPS0: PCA 计数脉冲选择 //000:系统时钟,FOSC/12 //001:系统时钟,FOSC/2 //010:定时器 0 的溢出,可实现可调频 率 PWM 输出
//----------------------------// 7 6 5 4 | 3 2 1 0
sfr CCON=0xD8;//CF CR - - | - - CCF1 CCF0
//----------------------------//CF:PCA 计数阵列溢出标志.计数值翻转 时由硬件置位。 //CR:PCA 计数阵列运行控制位。 //CCF1:PCA 模块 1 中断标志。当出现匹 配或者捕获时由硬件置位。 //CCF0:PCA 模块 0 中断标志。当出现匹 配或者捕获时由硬件置位。
右面是舵机:
安装有 180°舵机的双足机器人:
安装有 360°舵机的搬运机器人: 上一段中,我提到可以通过一定的方法,控制舵机,到 底是什么方法?PWM!我也不是什么老教授, 我不喜欢说太多抽 象的理论,这里,只需要知道,要控制舵机,我们要让单片 机输出一个周期为 20ms-30ms,高电平为 0.5ms-2.5ms 的信 号 即 可 。
关于 51 单片机控制舵机(减速电机类似) 的详解
关于舵机,目前网络上和书本上,很难找到详细可行的 资料(如果有,那估计是我眼瞎,不要理我就好啦 - -! ) , 我在制作 ROBOTCUP 搬运机器人的过程中,由于听取学长的 “建议” ,采用舵机作为机器人的驱动,加之当时太年轻, 使用 90 系列 51 单片机,所以一个舵机耗了 3 个月,并没有 按照预期,参加比赛(这个也真的不怪谁,不走个弯路,也 不会对舵机和 51 单片机有如今的大彻大悟- -! ) 。所以啊, 如果有学弟学妹,想要在以后做之类的比赛甚至于从事相关 的工作,那么好好研究下舵机的控制,对你是十分有帮助的 (无论是对于舵机控制的原理还是对主控芯片的理解都很 有帮助) 。关于舵机的控制,我查询过相关的资料,也请教 过我的导师,但是结果都很不满意,舵机乱转,转速控制不 精确,出现过各种问题。最终,我也硬是通过砸钱和砸时间 (20 块一个的 PWM 调制器不知道烧了多少- -!这个反正烧 的不是我的,不心疼,但是 90 块一个舵机,加上 60 块一个 的航模 PWM 舵机调制器还是砸了几百块进去的) ,和小伙伴 通过实验,反复测试得到的结果,在这里分享出来,希望能 帮助到学弟学妹。 首先,舵机是做什么的?舵机按照旋转的角度,可以分
模块的比较/捕获寄存器的值匹配将置位 CCON 寄存器中断标 志位 CCFn //T0Gn:翻转,1 时,工作在 PCA 告诉 输出模式,PCA 计数器的值与模块的比较/捕获寄存器的值匹 配将是 CEXn 脚翻转 //PWMn:脉宽调节输出模式,1 时,使 能 CEXn 脚用做 PWM 输出 //EECFn:使能 CCFn 中断,使能寄存器 CCON 中的捕获/比较标志 CCFn,用来产生中断 sfr PCA_PWM0=0xF2;//PCA 模块 0,PWM 寄存器
1.5ms,但是结果可能是高电平为 3ms+,为什么?这个问题 困惑了我挺久,我和学长也讨论过,他说,编译过程中,会 将我们写的 c 文件,编译成汇编文件,然后转成机器语言, 这个过程中可能会有误差。 而我觉得, 晶振本身是有误差的, 其次,这样反复的进入中断,细小的误差会被无限的放大。 同样是使用 c,stm32 上 pwm 的精度高的离谱。所以,使用 51 单片机的 8 位定时器来控制舵机, 在我看来, 是完全不可 行的(可以质疑我的能力,但是上面的程序是在我写的众多 定时器控制 pwm 输出程序中早期的一个,放出来理解简单, 但我在很长一段时间里,极力优化代码,尝试过各种思路, 但是结果只能说有提升,但是远远达不到控制舵机的要求) , 有不怕死的小伙伴,也可以自己写点小程序,打在示波器上 看看。不能用定时器,那怎么办?又有小伙伴说了, stc12 系列的 51 单片机是自带 8 位 pwm 模块,是不是可以用 12 系列的单片机实现?看程序: #include<at89x52.h> /*************************** STC12C5A16S2: PWM0 输出为 P1.3 PWM1 输出为 P1.4 /***PWM 相关特殊功能寄存器***/
(1.484375) //230 (2.03125) 为 2ms
void main(void) { ini_T0(); CL 加 1 CMOD=0x04;//定时器 0 溢出率作为时钟输入 //CIDL - - CPS2 CPS1 CPS0 ECF //方式 2,0.078125ms 溢出,每溢出一次
void ini_T0(void) { TMOD=0x02;//T0 方式 2 TH0=0xb2; //12MH 时 TL0=0xb2; TR0=1; } // //频率为 50HZ 周期的 1/50=0.02s,将 0.02S 分成 256 分: 0.02/256=0.000078125S=0.078125ms //0.078125 为一份的时间 一共 256 份 //CCAP0L=223;CCAP0H=223;为 2.5ms //243 时 约 为 1ms (0.9375) //CCAP0L=249;CCAP0H=248;为 0.5ms //236 时 为 1.5ms
//--------------------------------------------//CPS2 CPS1 CPS0: PCA 计数脉冲选择 //000:系统时钟,FOSC/12 //001:系统时钟,FOSC/2 //010:定时器 0 的溢出,可实现可调频 率 PWM 输出 //011:ECI/P3.4 脚的外部时钟输入(最大 速率 FOSC/2) //100:系统时钟,FOSC //101:系统时钟/4,FOSC/4 //110:系统时钟/6,FOSC/6 //111:系统时钟/8,FOSC/8
sfr PCA_PWM1=0xF3;// /***PCA 阵列计数控制位***/ sbit CR=0xDE;//因为只有能和 8 整除的才能位寻址,所 以能些 0xDE,看起来有冲突,实际上不会。 /***AUXR1 寄存器 SFR 地址设置***/ sfr AUXR1=0xA2;//PWM 引脚位置 串口 2 位置 双 DPTR 选 择 AD 转换结果存放方式调整 SPI 位置调整
为 180°和 360°连续旋转舵机。180°舵机,顾名思义,就 是只能旋转 180°的舵机,我们可以通过一定的方法,精确 的控制舵机旋转的角度, 因此, 就我目前接触到的比赛来看, 180°舵机在双足机器人以及飞思卡尔竞速车的转向上使用 的很多, 双足机器人就是模仿人走路的机器人, 通过控制 180° 舵机转动的角度,完成指定的动作。飞思卡尔转向类似于汽 车使用方向盘转向,舵机就起到方向盘的作用。 360°连续 旋转舵机, 可以通过一定手段, 控制舵机的旋转方向和速度, 因此,也常常用于小车型机器人的驱动上。这里需要说明的 是,180°舵机是无法调速的,就是说,他始终会以最快速 度,朝着你设定的角度旋转,直到旋转到目标角度停止。而 360°舵机是无法控制旋转的角度的,只可以控制转和停, 正转和反转以及转速。
//************************************************ *******
// 7
6 பைடு நூலகம் 4
3
2
1
0
sfr CMOD=0xD9;//CIDL - - -
CPS2 CPS1 CPS0 ECF
//-------------------------------//CIDL:计数阵列空闲控制,0 时,空闲 模式下 PCA 计数器继续工作;1 时空闲模式 PCA 停止工作。
void _pwm () interrupt 1 { TH0=0xff; // 0.01ms TL0=0xF6; i++;
if(i<=n){ P1=0XFF; 1.37<<1.47-1.54<<1.63 } else P1=0x00; //
if(i>=2000){ i=1;
} } 看起来程序好像没有什么问题, ste360(n)这个函数, n 就可以控制 pwm 高电平的时间,我设定定时器为每 0.01ms 进入一次中断,所以,要想得到 1.5ms 高电平,是不是 n 填 写 150 就行了?答案是否定的,至于具体结果怎么样,我这 里就不截图了,没有在学校没法用示波器,之后完善吧。我 这里告诉你,虽然程序逻辑是没有问题的,计算出来确实是
关于硬件上的设计,无非是保证供电的稳定和预留出 PWM 的接口,由于我本身也不是做硬件的,这里就不详细说 明了,这里附上一张图,感兴趣的小伙伴可以研究一下,如 果对硬件上有其他的问题,也可以私下联系我,我们组做硬 件 的 小 伙 伴 , 还 是 很 厉 害 的 。
我这里对 360°舵机如果通过 51 单片机的程序进行控 制做详细的说明。对于 360 °舵机而言, PWM 高电平为 0.5-1.5ms 为正转区间,1.5-2.5ms 为反转区间,1.5ms 为舵 机刹车点,实际测试过程中,我发现,我使用的舵机,正转 的调速高电平区间为 1.37ms-1.47ms,反转调速高电平区间 为:1.53-1.63ms,刹车高电平区间为:1.47-1.53ms。是不 是感觉很简单呢?听起来好像是挺简单的,但是有没有想过 如何使用 51 单片机产生我们需要的 PWM 呢?有小伙伴会说, 用定时器啊!当然,我一开始也是这么想的,看看下面这段 程序: unsigned int i=1; int n; void ste360(n){ TMOD=0X01; TL0=0XF6; TH0=0XFF; TR0=1; EA=1; ET0=1; P1=0X00; while(1); } // 0.01ms
//----------------------------------// 0 //PCA_PWMn:- - - - | - - EPCnH EPCnL 7 6 5 4 3 2 1
//----------------------------------/***PWM1 相关特殊功能寄存器***/ sfr CCAP1L=0xEB; sfr CCAP1H=0xFB; sfr CCAPM1=0xDB;
相关文档
最新文档