基于STC8G2K64S4单片机控制舵机
#前言
本文从硬件和软件两方面介绍了使用STC8G2K64S4单片机控制舵机的方法
舵机也是一个很常用的模块,每个竞赛几乎都用得到,相对电机来说它的控制也相对简单,话不多说直接上才艺
硬件方面
舵机的选择一般是两个参数,扭力和角度。扭力一般25kg就够用,角度的话可以择需选择也可以稍微大点的270度,这样之后也可以用。旁边的配件一般都会有,方便配合机械臂等其他结构。
现在说说连线,主要有三根线
红线是正极,这里需要接6V最好,5V不太够,所以需要额外从电池接一根出来,再通过稳压模块降压到6V就行了,负极就是GND接地
白线是信号线,通过输出PWM信号来控制角度
PWM波是可以改变占空比的,占空比是决定舵机角度最关键的因素。舵机的驱动信号是50hz的方波信号,每个周期为20ms,其中高电平的占比在0.5ms-2.5ms之间
t=0.5ms 占空比20% 舵机角度0°
t=1.0ms 占空比40% 舵机角度45°
t=1.5ms 占空比60% 舵机角度90°
t=2.0ms 占空比80% 舵机角度135°
t=2.5ms 占空比100% 舵机角度180°
这里是180度舵机的占空比输出所对应的角度,仅供参考,实际的可能有偏差,按照实际的来
软件方面
依旧是keil写代码,代码如下:
sbit P46 //定义P46为信号输出口
void main()
{
DisableGlobalIRQ(); //关闭总中断
board_init(); //初始化内部寄存器,勿删除此句代码。
pwm_init(PWM4_P46, 50, 0); //初始化pwm端口
pca_dealy_init(); //初始化延时函数
EnableGlobalIRQ(); //开启总中断
while(1)
{
pwm_duty(PWM4_P46, 1000); //舵机旋转
pca_delay_ms(1000);
pwm_duty(PWM4_P46, 250); //舵机更改角度
pca_delay_ms(1000);
}
}
舵机的驱动信号是50hz所以初始化的时候就写了50hz。因为舵机是通过改变占空比来改变角度,所以选择函数pwm_duty来改变舵机的速度
下面分享一个让舵机旋转得慢一点得的方法,因为正常的转速相对过快,可能会导致旋转抓着物块的机械臂上的物块掉落。思路是每个5ms输出一个+1的pwm波值,这样就能实现慢速旋转了
int x,y,z
sbit P10 //定义P10为输出pwm端口
void rotate(x,y) //rotate(起始位置,结束位置)
{
if(x<y) //判定顺时针还是逆时针
{
for(z=x;z<y;z++)
{
pwm_duty(PWM1_P10, z);
pca_delay_ms(5);
}
}
else
{
for(z=x;z>y;z--)
{
pwm_duty(PWM1_P10, z);
pca_delay_ms(5);
}
}
}
舵机的控制相对简单很多,也蛮好理解的,只要还是需要对pwm的概念理解
本人小白,有问题交流讨论,虚心受教