• SG90舵机的pwm信号-使用linux定时器实现控制


    舵机工作原理

    在这里插入图片描述

    舵机的控制信号为PWM信号(PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,周期为20ms)
    在这里插入图片描述

    如何得到这周周期信号呢?这里就可以使用linux定时器

    实现定时器,通过itimerval结构体和setitimer函数产生信号,系统随之使用signal信号处理函数来处理产生的定时信号,从而实现定时器。

    setitimer函数为设置定时器(闹钟),可以实现周期定时。(settimer工作机制是,先对it_value倒计时,当it_value为零时触发信号,然后把it_value从零重置为it_interval,继续对it_value倒计时,一直这样循环下去)

    函数原型为 int setitimer(int which,const struct itimerval *new_value,struct itimerval *old_value);

    参数

    which 指定定时方式
    ITIMER_REAL //以系统真实的时间来计算,发送的信号是SIGALRM。
    ITIMER_VIRTUAL //以该进程在用户态下花费的时间来计算,它发送出SIGVTALRM信号
    ITIMER_PROF /以该进程在用户态下和内核态下所费的时间来计算,发送的信号是SIGPROF

    new_value为传入参数:
    表示定时的时长

    old_value为传出参数:
    通常用不上,设置为NULL。。

    struct itimerval
      {
        /* Value to put into `it_value' when the timer expires.  */
        struct timeval it_interval;
        /* Time to the next timer expiration.  */
        struct timeval it_value;
      };
    
    struct timeval
    {
      __time_t tv_sec;		/* Seconds.  */
      __suseconds_t tv_usec;	/* Microseconds.  */
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    it_interval:代表定时器重新启动后赋给it_value的值。
    it_value:计时器安装后首先启动的初始值。

    PS:假如it_value为0是不会触发信号的,所以要能触发信号,it_value得大于0;如果it_interval为零,只会延时,不会定时(也就是说只会触发一次信号)。

    //该函数实现,程序运行3秒后,每隔一秒打印一个hello
    include<stdio.h>
    #include
    #include
    #include
    static int i;
    void signalHandler(int signum)
    {
            i++;
            if(i==2000){
                    printf("hello\n");
                    i=0;
            }
    
    
    }
    
    int main()
    {
            i=0;
            //setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
            struct itimerval itv;
            
            //首次把it_value的初值倒计时到零之后,
            //之后每次都会把it_value重置为it_interval
            itv.it_interval.tv_sec=0;
            itv.it_interval.tv_usec=500;//设置为500us
            
            //it_value初值的设置,提供程序第一次运行时的倒计时
            itv.it_value.tv_sec=3;//一开始设置为3s
            itv.it_value.tv_usec=0;
            if(setitimer(ITIMER_REAL, &itv, NULL)==-1){
    
                    perror("error");
                    exit(-1);
            }
            signal(SIGALRM,signalHandler);
    
    
            while(1);
    
            return 0;
    
    }
                                
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    生成式人工智能在先进无人机网络中的应用
    vscode 保存文件时自动格式化
    QT基础之一文介绍文本编辑与排版包含字体相关设置、段落对齐与排序方式
    使用binlog备份恢复myqsl数据
    虚析构+纯虚函数+抽象类+友元
    解决SpringCloud的Gateway网关无法访问服务的静态资源
    SE园区综合实验(未补齐版)
    如何在线webp转JPG/PNG图片格式
    CleanMyPC中文版切换教程(专注于电脑缓存文件清理的工具)
    1800_vim的宏录制功能尝试
  • 原文地址:https://blog.csdn.net/cyh20001027/article/details/125716580