2光电编码器
根据测量原理编码器可分为接触式和非接触式两种,接触式编码器采用电刷输出,以电刷接触到点区和绝缘区分别表示代码的1和0,非接触处编码器的敏感元件是光敏元件和磁敏元件,采用光敏元件时以透光区和不透光区表示代码1和0 。 根据测出的信号,编码器可分为绝对式和增量式两 实验部分
舵机的内部结构:一般来说,我们用的舵机有以下几个部分组成:直流电动机、减速器(减速齿轮组)、位置反馈电位计、控制电路板(比较器)。舵机的输入线共有三根,红色在中间,为电源正极线,黑色线是电源负极(地线)线,黄色或者白色线为信号线。其中电源线为舵机提供6V到7V左右电压的电源。
2、PWM信号控制精度制定
上面已经提到了八位单片机,我们的舵机需要的是方波信号。单片机的精度直接影响了舵机的控制精度,这里就详细的说明一下。
我们采用的是8位 STC12C5410ADCPU,其数据分 辨率为256,那么经过舵机极限 参数实验,得到应该将其划分为 250份。 那么0.5mS---2.5Ms的宽度 为2mS = 2000uS。 2000uS÷250=8uS 则:PWM的控制精度为8us 我们可以以8uS为单位递增 控制舵机转动与定位。 舵机可以转动185度,那么 185度÷250=0.74度, 则:舵机的控制精度为0.74度 图4-4
我们在这里做了一些名词上的定义。DIV是一个时间位置单位,一个DIV等于8us,关系入公式:
1 DIV = 8uS 250DIV=2mS
实际寄存器内的数值为:(#01H)01 ———(#0FAH)250。
共185度,分为250个位置,每个位置叫1DIV。则:
185÷250 = 0.74度 / DIV
PWM高电平函数: 0.5mS + N×DIV
0uS ≤ N×DIV ≤ 2mS
0.5mS ≤ 0.5Ms+N×DIV ≤ 2.5mS
根据这些知识,我们就可以开始编程,并做一些初步的实验了,学会舵机控制是研究机器人的一个比较技术手段,需要完全掌握。
6根据动作需要将各端口输出通道按舵机目的位置的数值大小进行排序
// ──────────────────────────────────────── // 函数原型:void sorting() // 函数名称:排序子程序(Sorting Subroutine) // 功 能:对所有通道口的数值进行排序。 // 参 数: // 返 回 值:无 // ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ void sorting() { uchar i=0,j=0,x=0; //定义循环变量 //为选择的输出通道提供低电平 kouchu[0]=0xFE; //11111110 kouchu[1]=0xFD; //11111101 kouchu[2]=0xFB; //11111011 kouchu[3]=0xF7; //11110111 kouchu[4]=0xEF; //11101111 kouchu[5]=0xDF; //11011111 kouchu[6]=0xBF; //10111111 kouchu[7]=0x7F; //01111111 //通过冒泡法排序,将舵机目的位置数值按从小到大的顺序排列起来 for(i=0;i<=6;i++) for(j=i+1;j<=7;j++) if(paixu_ncha[i] 7、将排好序的数值进行N差计算,得出每相邻的两个数值间的差值,用于累计延时获得N×DIV动作要求高电平时长。 // ─────────────────────────────────────── // 函数原型:void N_value() // 函数名称:N差子程序(N poor Subroutine) // 功 能:对临近数值做差,求出相对差值,用于延时。 // 参 数: // 返 回 值:无 // ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ void N_value() { uchar i; //定义循环变量 for(i=0;i<=6;i++) paixu_ncha[i]=paixu_ncha[i]-paixu_ncha[i+1]; // N差计算 } 8、为舵机每一次动作提供间隔延时,用来控制其整体的动作速度 // ─────────────────────────────────────── // 函数原型:sao_wei(uchar saowei) // 函数名称:扫尾子程序 // 功 能:控制舵机转动的速度和加速度 // 影 响: // 入口参数:saowei,表示扫尾系数 // 返 回 值:无 // ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ void sao_wei(uchar saowei) { uchar i; //定义循环变量 for(i=0;i 任务一:如何让机器人摆头 主函数调用范例: baitou(uchar cnt); 动作函数详解: void baitou(uchar cnt) { uchar i,j; //定义循环变量 for(j=0;j 注:减小舵机每次循环的增量可以增加动作的流畅度。 任务二:如何让机器人鞠躬 主函数调用范例: jugong(uchar step,uchar times); 动作函数详解: void jugong(uchar step,uchar times) { uchar i,j; //定义循环变量 for(i=0;i