舵机需要一个接口输入PWM波形才能进行工作
PWM波的频率不能太高,50hz,即周期=1/频率=1/50=0.02s,20ms左右数据
![](https://i-blog.csdnimg.cn/blog_migrate/0098e19abe5347640d418229fd7225bc.png)
通过上一篇定时器的操作可以得知,一次定时时间为0.5ms,通过定义一个变量来计数定时了多少个周期,进而改变转动的角度
代码如下:
1 #include <stdio.h>
2 #include <sys/time.h>
3 #include <stdlib.h>
4 #include <signal.h>
5 #include <wiringPi.h>
6
7 #define sg90 1
8
9 static int i = 0;
10 int jd = 0;
11 void signal_handler(int signum)
12 {
13 if(i < jd){
14 digitalWrite(sg90,HIGH);
15
16 }else{
17 digitalWrite(sg90,LOW);
18
19
20 }
21 i++;
22 if(i == 40){//一次是0.5ms,400次刚好就是一秒,实现一秒打印一次
23 i = 0;
24
25 }
26
27
28 }
29
30 int main ()
31 {
32 wiringPiSetup();//初始化wiringpi库,用于处理引脚
33
34 pinMode(sg90,OUTPUT);//把sg90的PWM引脚设置为输出模式
35
36
37 struct itimerval itv;
38 //设定程序跑到这里以后需要等待开启定时器的时间为1s
39 itv.it_value.tv_sec = 1;
40 itv.it_value.tv_usec = 0;
41 //设定需要减少的时间为500us
42 itv.it_interval.tv_sec = 0;
43 itv.it_interval.tv_usec = 500;
44
45 //设定递减的方式
46 if(setitimer(ITIMER_REAL,&itv,NULL) == -1)
47 {
48 perror("error");
49 exit(-1);
50 }
51
52 //信号处理
53 signal(SIGALRM,signal_handler);
54
55
56 while(1){
57 printf("input jd===========\n");
58 printf("1-0,2-45,3-90,4-135,5-180\n");
59 scanf("%d",&jd);
60
61 }
62
63
64 return 0;
65 }