一、PWM与SG90舵机
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
- 0.5ms--------------0度;
- 1.0ms------------45度;
- 1.5ms------------90度;
- 2.0ms-----------135度;
- 2.5ms-----------180度;
2.代码实现
#include <stdio.h>
#include <wiringPi.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <softPwm.h>
#define SERVO 29
int main()
{
if(wiringPiSetup() < 0)
{
perror("硬件接口初始化失败!\n");
exit(-1);//退出当前进程
}
softPwmCreate(SERVO,0,200);//200*100us=20000us=20ms
char cmd[10]={0};//用于存放指令
while(1)
{
printf("请输入你想要转动的角度输入end结束:");
fflush(stdout);
fgets(cmd,10,stdin);
softPwmWrite(SERVO,5+atoi(cmd)*10/90);//如果要转动45度脚,10*100us=1000us=1ms
if(strncmp(cmd,"end",3) == 0)
{
printf("程序退出\n");
break;
}
}
return 0;
}
三、相关函数及算法说明
1.softPwmCreate(SERVO,0,200);//200*100us=20000us=20ms
为什么这里是200?
- PWM输出的每一个“周期”都需要10毫秒,默认范围值为100,因此,尝试每秒改变PWM值超过100次将是徒劳的。(也就是说软件PWM的固定输出频率是100HZ,这个对于驱动一般的电机是足够了);
- 100Hz可以换算成多少毫秒:它是交流电频率与周期的关系,并且是倒数关系:周期T=1/100=0.01秒=10毫秒;
- SG90舵机一般需要20ms周期,所以需要设置为200HZ
2.fflush(stdout);
该函数作用
定义函数:int fflush(FILE * stream);
fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中,如果参数stream为NULL,fflush()会将所有打开的文件数据更新。
返回值:成功返回0,失败返回EOF,错误代码存于errno中
stdout:标准输出(stdout),用来清空标准输入输出缓冲区。
stdout是standard output 的缩写,即标准输出,一般是指显示器;标准输出缓冲区即是用来暂存将要显示的内容的缓冲区。
3.fgets(cmd,10,stdin);
stdin表示什么
- 原型:# include <stdio.h> char *fgets(char *s, int size, FILE *stream);
- s 代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名。
- size 代表的是读取字符串的长度。stream 表示从何种流中读取,可以是标准输入流 stdin,也可以是文件流,即从某个文件中读取。
- stdin是standard input的缩写,即标准输入,一般是指键盘;标准输入缓冲区即是用来暂存从键盘输入的内容的缓冲区。
4. softPwmWrite(SERVO,5+atoi(cmd)*10/90);//如果要转动45度脚,10*100us=1000us=1ms
为什么这里用5+atoi(cmd)*10/90
- 因为,5+45*10/90=10