SaintStefan
2/15/2020 - 6:14 PM

舵机控制


#ifndef __SERVOMOTOR_H__
#define __SERVOMOTOR_H__

#include <stdio.h>
#include <wiringPi.h>

/*使用C语言GPIO库wiringPi约定的编号
 */
#define servopin 26							// 设置舵机驱动脚到数字口

int angle;									// 定义角度变量
int pulsewidth;								// 定义脉宽

void IO_ServoInit()
{
	printf("Servomotor Init begin\n");
	pinMode(servopin,OUTPUT);				// 初始化舵机IO口
	printf("Servomotor Init end\n");
}

void servopulse(int angle)	// 生成一个脉冲函数,模拟PWM值
											// 定义一个脉冲函数,用来模拟产生PWM值;
											// 通过接口产生占空比不同的方波,模拟产生PWM信号进行舵机定位。
{
	int pulsewidth;

	pulsewidth = (angle * 11) + 500;		// 将角度转化为500-2480的脉宽值 
											// 舵机的控制一般需要一个20ms的时基脉冲,
											// 脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。
											// 0.5ms->0度;1.0ms->45度;1.5ms->90度;2.0ms->135度;2.5ms->180度;
	digitalWrite(servopin, HIGH);			// 将舵机接口电平置高
	delayMicroseconds(pulsewidth);			// 延时脉宽值的微秒数
	digitalWrite(servopin, LOW);			// 将舵机接口电平置低
	delay(20 - pulsewidth/1000);			// 延时周期内剩余时间
}

void Detection_front()						// 车头朝前就是90度,右侧是0度,左侧是180度
{
	for(int i = 0; i <= 15; i++)			// 产生PWM个数,等效延时以保证能转到响应角度
	{
		servopulse(90);
	}
} 

void Detection_left()
{
	for(int i = 0; i <= 15; i++)
	{
		servopulse(0);						// SG90: 舵机的180度在小车的左侧,0度在小车的右侧。
											// SRM - 102: 舵机的180度在小车的右侧,0度在小车的左侧。
	}
}

void Detection_right()
{
	for(int i = 0; i <= 15; i++)
	{
		servopulse(180);
	}
}

/*int main(void)
{
	wiringPiSetup();
	if (-1 == wiringPiSetup()) 
	{
		printf("Setup wiringPi failed!");
		return 1;
	}

	IO_ServoInit();
	
	while(1)
	{
		Detection_front();
		delay(1000);
		Detection_left();
		delay(1000);
		Detection_front();
		delay(1000);
		Detection_right();
		delay(1000);
		Detection_front();
	}
}*/

#endif