基于STC8G2K64S4单片机控制舵机

#前言

本文从硬件和软件两方面介绍了使用STC8G2K64S4单片机控制舵机的方法

舵机也是一个很常用的模块,每个竞赛几乎都用得到,相对电机来说它的控制也相对简单,话不多说直接上才艺

硬件方面

舵机的选择一般是两个参数,扭力和角度。扭力一般25kg就够用,角度的话可以择需选择也可以稍微大点的270度,这样之后也可以用。旁边的配件一般都会有,方便配合机械臂等其他结构。

esp8266远程舵机 esp8266怎么控制舵机_esp8266远程舵机

现在说说连线,主要有三根线

红线是正极,这里需要接6V最好,5V不太够,所以需要额外从电池接一根出来,再通过稳压模块降压到6V就行了,负极就是GND接地

白线是信号线,通过输出PWM信号来控制角度

esp8266远程舵机 esp8266怎么控制舵机_esp8266远程舵机_02

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的概念理解

本人小白,有问题交流讨论,虚心受教