文章目录
一、Linux定时器
使用舵机就离不开定时器,因为舵机的使用是依靠定时器输出特定时间的高电平,在 Linux 里可以使用两个函数就可以实现像 PWM 一样输出舵机可以正常工作的波形,一个函数是 signal 信号处理函数,另一个如下文所述:
#include <sys/time.h>
int setitimer(int which,
const struct itimerval *new_value,
struct itimerval *old_value);
//成功返回0,失败返回1
第一个参数 which:指定了定时器的类型,即定时器递减时依据的时间标准,有以下选项:
- ITIMER_REAL:数值为 0,计时器的值实时递减,发送的信号是 SIGALRM
- ITIMER_VIRTUAL:数值为 1,进程执行时递减计时器的值,发送的信号是 SIGVTALRM
- ITIMER_PROG:数值为 2,进程和系统执行时递减计时器的值,发送的信号是 SIGPROF
第二个参数 new_value:指向一个 struct itimerval 结构体,用于设置新的定时器值:
struct itimerval
{
struct timeval it_interval; //间隔时间,用于周期性定时
struct timeval it_value; //第一次到期的时间
};
//结构体里的结构体:
struct timeval
{
__time_t tv_sec; //秒
__suseconds_t tv_usec; //微秒
};
第三个参数 old_value:用于获取之前设置的定时器值,如果不需要就填 NULL。
二、软件设计
了解完毕之后就可以实战了,将舵机的电源和地线都接到开发板上,舵机的信号线接到 Pin0 口,实验现象是输入数字,舵机就输出对应的角度:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <wiringPi.h>
#define SG90 0
int angle;
static int i = 0;
void timer_Handler()
{
if(i <= angle)
{
digitalWrite(SG90, HIGH);
}
else
{
digitalWrite(SG90, LOW);
}
if(i == 40)
{
i = 0;
}
i++;
}
int main(void)
{
struct itimerval time;
wiringPiSetup();
pinMode(SG90, OUTPUT);
time.it_interval.tv_sec = 0;
time.it_interval.tv_usec = 500; //500us = 0.5ms,每隔 0.5ms就进入一次timer_Handler函数
time.it_value.tv_sec = 1; //1s之后就开始,每 0.5ms就进入一次服务函数
time.it_value.tv_usec = 0;
setitimer(ITIMER_REAL, &time, NULL); //设置成功之后,就会周期性的发送信号
signal(SIGALRM, timer_Handler); //使用signal函数处理信号
while(1)
{
printf("Please int 1 to 5\n");
scanf("%d", &angle);
}
}
384

被折叠的 条评论
为什么被折叠?



