学习日志(十二)
基于Linux定时器的舵机开发
舵机基本介绍
常见的有0-90°、0-180°、0-360°
如下图的是:0-180°
怎么控制转角
向黄色信号线“灌入”PWM信号。
PWM波的频率不能太高,例如50hz,即周期=1/频率=1/50=0.02s,20ms左右数据:
不同的PWM波形对应不同的旋转角度,以20ms为周期,50hz为频率的PWM波
因此:定时器器需要定时20ms,关心的单位0.5ms, 20ms = 0.5ms * 40;
代码:
功能描述:SG90编程实现:键盘输入不同的值,让舵机转动,软件PWM实现
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 5
8 // 角度
9 int angle = 0;
10
11 void signal_handler(int signo)
12 {
13 static int cnt = 0;
14 cnt++;
15 if(cnt<=angle){
16 digitalWrite(SG90,HIGH);
17 }else if(cnt<=40){
18 digitalWrite(SG90,LOW);
19 }else{
20 cnt = 0;
21 }
22 }
23 int main()
24 {
25
26 struct itimerval tim;
27
28 angle = 1; //默认上电角度为0°
29 if(wiringPiSetup()==-1){ //初始化wiringPi库
30 perror("initwiringpi error\n");
31 }
32 pinMode(SG90,OUTPUT);//设置io口为输出模式
33 //it_interval:计时器的初始值,一般基于这个初始值来加或者来减,看控制函数的参数配置。
34 tim.it_interval.tv_sec = 0;
35 tim.it_interval.tv_usec = 500; //定时500微秒
36 //it_value:程序跑到这之后,多久启动定时器。
37 tim.it_value.tv_sec = 1;
38 tim.it_value.tv_usec = 0;//1秒后启动定时器
39 if(setitimer(ITIMER_REAL,&tim,NULL)==-1){ //设置定时器为递减模式
40 perror("timer error");
41 exit(-1);
42 }
43 signal(SIGALRM,signal_handler);
44 while(1){
45 puts("tips:input angle 1-0 2-45 3-90 4-135 5-180 ");
46 scanf("%d",&angle);
47 }
48 return 0;
49 }