1、实验目的:
利用硬件PWM进行控制舵机;
硬件PWM使用P6端口;
2、实验设备:
单片机开发板stc8a8k最小核心板;
7pin的OLED
MG90S舵机;
3、原理:
舵机的控制原理,
舵机的伺服系统由可变宽度的脉冲来进行控制,控制线是用来传送脉冲的。脉冲的参数有最小值,最大值,和频率。一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。舵机有最大转动角度,中间位置的定义就是从这个位置到最大角度与最小角度的量完全一样。最重要的一点是,不同舵机的最大转动角度可能不相同,但是其中间位置的脉冲宽度是一定的,那就是1.5ms。如下图:
角度是由来自控制线的持续的脉冲所产生。这种控制方法叫做脉冲调制。脉冲的长短决定舵机转动多大角度。例如:1.5毫秒脉冲会到转动到中间位置(对于180°舵机来说,就是90°位置)。当控制系统发出指令,让舵机移动到某一位置,并让他保持这个角度,这时外力的影响不会让他角度产生变化,但是这个是由上限的,上限就是他的最大扭力。除非控制系统不停的发出脉冲稳定舵机的角度,舵机的角度不会一直不变。
当舵机接收到一个小于1.5ms的脉冲,输出轴会以中间位置为标准,逆时针旋转一定角度。接收到的脉冲大于1.5ms情况相反。不同品牌,甚至同一品牌的不同舵机,都会有不同的最大值和最小值。一般而言,最小脉冲为1ms,最大脉冲为2ms。如下图:
*舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
舵机的追随特性
假设现在舵机稳定在A点,这时候CPU发出一个PWM信号,舵机全速由A点转向B点,在这个过程中需要一段时间,舵机才能运动到B点。
保持时间为Tw
代码:
代码目的:
0度–45度–90度–135度–180度–0度再转动。
这里利用1-0.075等,为什么要1-x呢;
主要是因为自己写的函数,是低电平的时间;
舵机是高电平的占空比;
这个要根据实际的情况使用;
最好用示波器等测试下,是高电平的比例,还是低电平的比例。
用到P61引脚输入到舵机的PWM信号脚
HPWM_Set(1, 50,1-0.150);//1.5/20
频率是50赫兹;
后面的是占空比。
#include "stc8a8k.h"
#include "delay.h"
#include "key.h"
#include "led.h"
#include "oled.h"
#include "hpwm.h"
//全局变量,也可以再外面新建一个头文件,存放全局变量unsigned char KeyNum=100;//按键的代号,存储按键之后返回数值void main()
{int shownum=0;float aaa=0.2;LED_PortMode();KEY_Init();//包括端口和中断初始化OLED_Init();HPWM_Init();delay_tms(2000);OLED_ShowString(2,2, "Hello China!"); while(1){// *************呼吸灯
// HPWM_Set(1, 50,aaa);//0.5/20
// aaa=aaa+0.02;
// delay_tms(100);
// if(aaa>0.92)
// aaa=0.1;
// *************呼吸灯 delay_tms(1000);OLED_ShowString(2,2, "0025!"); HPWM_Set(1, 50,1-0.025);//0.5/20 0dudelay_tms(3000);OLED_ShowString(2,2, "0005!");HPWM_Set(1, 50,1-0.05);//1/20 45dudelay_tms(3000);OLED_ShowString(2,2, "0075!"); // 90du HPWM_Set(1, 50,1-0.075);//1.5/20delay_tms(3000);OLED_ShowString(2,2, "0100!"); //135du HPWM_Set(1, 50,1-0.1);//1.5/20delay_tms(3000);OLED_ShowString(2,2, "0125!"); // 180du HPWM_Set(1, 50,1-0.125);//1.5/20delay_tms(3000);OLED_ShowString(2,2, "0150!"); // 180du HPWM_Set(1, 50,1-0.150);//1.5/20delay_tms(3000);OLED_ShowString(2,2, "aaaaaaa!"); delay_tms(3000);}
}
实验结论:
1、一开始上电,舵机跑到180度的位置;不管是在那个位置,都是会跑到180度的位置;本舵机是MG90S,0-180度的舵机;
2、一开始,可以调节舵机指针的位置,结合实际的场合进行调节。松开,然后放到你需要的位置;
但是不管怎么放,都是在0-180度旋转;
具体操作:
(1)上电,然后舵机回到180度的位置;
(2)断电,把指针放到你需要的极限位置,这个是极限位置;
也可以用本程序,
(1)断电,运行单片机,等舵机回到0-180度的中间位置,也就是90度的位置,作为机械结构的原点位置;拆下舵机指针,然后放到合适的位置。