【Orangepi Zero2 全志H616】驱动舵机控制 、Linux定时器(signal、setitimer)

一、SG90舵机开发
舵机基本介绍
二、Linux定时器

  • signal 函数
  • setitimer 函数原型
  • signal、setitimer函数API调用

三、舵机 软件PWM实现

一、SG90舵机开发

舵机基本介绍

如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制用处:
垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等
常见的有0-90°、0-180°、0-360°
在这里插入图片描述
怎么控制转角
向黄色信号线“灌入”PWM信号。
PWM波的频率不能太高,50hz,即周期=1/频率=1/50=0.02s,20ms左右数据:
不同的PWM波形对应不同的旋转角度,以20ms为周期,50hz为频率的PWM波
在这里插入图片描述

二、Linux定时器

signal 函数

signal 函数是一个用于设置信号处理函数的C标准库函数,可用于捕获和处理信号。信号是在UNIX和类UNIX操作系统中用于通知进程发生了特定事件的一种异步通知机制。signal 函数的原型如下:

#include <signal.h>

void (*signal(int signum, void (*handler)(int)))(int);

参数说明:

  • signum:要捕获和处理的信号的编号,它是一个整数,如 SIGINT(中断信号)、SIGTERM(终止信号)等。
  • handler:一个函数指针,指向你自己编写的信号处理函数,用于处理接收到的信号。

signal 函数允许你为指定的信号注册一个自定义的处理函数,该处理函数会在程序接收到相应的信号时被调用。处理函数的原型如下:

void handler_function(int signum);

示例用法:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

// 自定义信号处理函数
void sigint_handler(int signum) {
    printf("Received SIGINT (Ctrl+C) signal. Exiting...\n");
    exit(0);
}

int main() {
    // 注册自定义信号处理函数,用于捕获SIGINT信号(Ctrl+C)
    signal(SIGINT, sigint_handler);

    printf("Press Ctrl+C to trigger the custom signal handler.\n");

    while (1) {
        // 无限循环等待信号
    }

    return 0;
}

在上述示例中,signal 函数用于注册一个自定义的信号处理函数 sigint_handler,用于捕获 SIGINT 信号(通常由Ctrl+C触发)。当用户按下Ctrl+C时,程序会执行自定义处理函数,然后退出。这使你能够在程序中捕获和处理特定的信号,以采取适当的行动。不同的信号有不同的用途,可以用于控制程序的行为。

setitimer 函数原型

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

setitimer 是一个UNIX系统上的系统调用函数,用于设置和管理定时器。它通常用于定期触发信号或执行某些操作。setitimer 函数的原型如下:

#include <sys/time.h>

int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

参数说明:

  • which:指定要设置的定时器类型,可以是 ITIMER_REALITIMER_VIRTUALITIMER_PROF 中的一个。
    • ITIMER_REAL:以实际时间计时,通常用于实现定时器功能。
    • ITIMER_VIRTUAL:以进程的虚拟时间(CPU时间)计时。
    • ITIMER_PROF:以进程的虚拟时间和系统时间(CPU和墙钟时间)计时。
  • new_value:一个 struct itimerval 结构,用于指定新的定时器值。
  • old_value:一个 struct itimerval 结构,用于存储旧的定时器值(可选参数)。

struct itimerval 结构定义如下:

struct itimerval {
    struct timeval it_interval;  // 定时器重复的间隔时间
    struct timeval it_value;     // 定时器的初始值
};

setitimer 允许你设置定时器的初始值和重复间隔。一旦定时器启动,它将在到期时触发一个信号,通常是 SIGALRM 信号。你可以捕获这个信号并执行相应的操作。

示例用法:

#include <stdio.h>
#include <signal.h>
#include <sys/time.h>

void timer_handler(int signum) {
    // 定时器到期时触发的处理函数
    printf("Timer expired! (Signum: %d)\n", signum);
}

int main() {
    struct itimerval timer;
    timer.it_value.tv_sec = 1;  // 初始定时器值为1秒
    timer.it_value.tv_usec = 0;
    timer.it_interval.tv_sec = 2;  // 重复间隔为2秒
    timer.it_interval.tv_usec = 0;

    // 设置定时器并关联处理函数
    signal(SIGALRM, timer_handler);
    setitimer(ITIMER_REAL, &timer, NULL);

    // 让程序保持运行
    while (1) {
    }

    return 0;
}

上述示例设置了一个每隔1秒触发一次的定时器,并在定时器到期时触发 SIGALRM 信号,执行 timer_handler 处理函数。你可以根据需要修改定时器的初始值和重复间隔以实现不同的定时任务。

signal、setitimer函数API调用

/*该代码实现的功能是: 1s后开启定时器,然后每隔1s向终端打印hello。*/ 
#include <stdio.h> 
#include <sys/time.h> 
#include <stdlib.h> 
#include <signal.h> 
 
static int i; 
 
void signal_handler(int signum) 
{ 
    i++; 
    if (i == 2000){ 
    	printf("hello\n"); 
    	i = 0; 
    } 
}
 
int main() 
{ 
    struct itimerval itv; 
 
    //设定定时时间 
    itv.it_interval.tv_sec = 0; 
    itv.it_interval.tv_usec = 500;
    //设定开始生效,启动定时器的时间
    itv.it_value.tv_sec = 1;
    itv.it_value.tv_usec = 0;
    
    //设定定时方式 
    if (setitimer(ITIMER_REAL, &itv, NULL) == -1){ 
    	perror("error"); 
    	exit(-1); 
    }
 
    //信号处理 
    signal(SIGALRM, signal_handler); 
 
    while(1); 
 
    return 0; 
}

在这里插入图片描述
这种方法需要注意的是,一个进程只能创建一个定时器

三、舵机 软件PWM实现

SG90编程实现:键盘输入不同的值,让舵机转动,软件PWM实现

#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>
#include <wiringPi.h>
 
#define SG90Pin 5
 
int angle;
static int i = 0;
 
void signal_handler(int signum)
{
    if(i <= angle){
        digitalWrite(SG90Pin, HIGH);
    }else{
        digitalWrite(SG90Pin, LOW);
    }
 
    if (i == 40){
        i = 0;
    }
    i++;
}
 
int main()
{
    struct itimerval itv;
    angle = 0;
    
    wiringPiSetup();
    pinMode(SG90Pin, OUTPUT);
 
    //设定定时时间0.5ms
    itv.it_interval.tv_sec = 0;
    itv.it_interval.tv_usec = 500;
    //设定开始生效,启动定时器的时间
    itv.it_value.tv_sec = 1;
    itv.it_value.tv_usec = 0;
 
    //设定定时方式
    if (setitimer(ITIMER_REAL, &itv, NULL) == -1){
    	perror("error");
    	exit(-1);
    }
 
    //信号处理
    signal(SIGALRM, signal_handler);
 
    while (1){
        printf("input angle: 1-0 2-45 3-90 4-135 5-180.\n");
        scanf("%d", &angle);
    }
 
    return 0;
}

在这里插入图片描述

转圈圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123272.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫(数据获取——双R)

静态资源加载 静态资源给了请求头和url即可 动态资源加载 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 } url "https://www.xinpianchang.com/api/xpc/comments/article…

flink的带状态的RichFlatMapFunction函数使用

背景 使用RichFlatMapFunction可以带状态来决定如何对数据流进行转换&#xff0c;而且这种用法非常常见&#xff0c;根据之前遇到过的某个key的状态来决定再次遇到同样的key时要如何进行数据转换&#xff0c;本文就来简单举个例子说明下RichFlatMapFunction的使用方法 RichFl…

智慧工地综合管理平台-项目整体需求规格说明书

引言 定位与目标 智慧工地是一种现代化的管理方式,目标是通过应用现代科技手段,对施工现场的设备、人员、物资等信息全面掌控,减少工地事故的发生,提高施工质量和安全性,同时也能够降低成本,提高效益,实现建筑施工的数字化、智能化和可持续发展,为城市建设和社会发展…

【STM32 PWM输出+串口调整PWM周期和占空比】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、PWM是什么&#xff1f;1. PWM 图解二、认识STM32的PWM功能1.哪些定时器有PWM输出功能1.1 高级定时器&#xff0c;7路PWM输出&#xff0c;3组是互补输出&…

0基础两小时建网站

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;0基础2小时搭建个人网站 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;宁静是一片强大而治愈的神奇海洋&#xff01; 目录 前言 第一步 环境…

第12章 PyTorch图像分割代码框架-2

模型模块 本书的第5-9章重点介绍了各种2D和3D的语义分割和实例分割网络模型&#xff0c;所以在模型模块中&#xff0c;我们需要做的事情就是将要实验的分割网络写在该目录下。有时候我们可能想尝试不同的分割网络结构&#xff0c;所以在该目录下可以存在多个想要实验的网络模型…

11 # 手写 reduce 方法

reduce 使用 reduce() 方法对数组中的每个元素按序执行一个提供的 reducer 函数&#xff0c;每一次运行 reducer 会将先前元素的计算结果作为参数传入&#xff0c;最后将其结果汇总为单个返回值。 第一次执行回调函数时&#xff0c;不存在“上一次的计算结果”。如果需要回调…

运行obotframework-ride控制台报错module ‘urllib‘ has no attribute ‘Request‘

背景&#xff1a;Python3.8robotframework-ride1.7.3.1&#xff0c;运行报错module urllib has no attribute Request 原因&#xff1a; 解决&#xff1a;升级robotframework-ride到2.0以上。或者降级python到3.7。

基于SSM的演唱会购票系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是…

大数据学习之一文学会Spark【Spark知识点总结】

文章目录 什么是SparkSpark的特点Spark vs HadoopSparkHadoopSpark集群安装部署Spark集群安装部署StandaloneON YARN Spark的工作原理什么是RDDRDD的特点Spark架构相关进程Spark架构原理 Spark实战&#xff1a;单词统计Scala代码开发java代码开发任务提交 Transformation与Acti…

自动控制原理--面试问答题

以下文中的&#xff0c;例如 s_1 为 s下角标1。面试加油&#xff01; 控制系统的三要素&#xff1a;稳准快。稳&#xff0c;系统最后不能震荡、发散&#xff0c;一定要收敛于某一个值&#xff1b;快&#xff0c;能够迅速达到系统的预设值&#xff1b;准&#xff0c;最后稳态值…

清凉油市场现状及未来发展趋势

清凉油市场一直以其庞大的规模和快速增长的势头受到人们的关注。无论是消费者对健康生活方式的追求&#xff0c;还是中国作为全球最大市场的地位&#xff0c;都为清凉油市场的持续发展注入了强大的动力。随着人们对健康意识的提升和对保健产品需求的增加&#xff0c;清凉油市场…

算法?认识一下啦

一、什么是算法&#xff1f; 算法 &#xff0c;是对特定问题求解方法和步骤的一种描述。它是有限指令的有限序列&#xff0c;其中每个指令表示一个或多个操作。 算法和程序的关系 算法​是解决问题的一种方法或一个过程&#xff0c;考虑如何将输入转换成输出&#xff0c;一个…

功能更新|Leangoo领歌免费敏捷工具支持SAFe大规模敏捷框架

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 
 Leangoo可以支持敏捷研发管理全流程&#xff0c;包括小型团队敏捷开发&#xff0c;规模化敏捷SAFe&#xf…

SpringBoot测试类启动web环境-下篇

一、响应状态 1.MockMvcResultMatchers 说明&#xff1a;模拟结果匹配。 package com.forever;import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoC…

软件测试|MySQL LIKE:深入了解模糊查询

简介 在数据库查询中&#xff0c;模糊查询是一种强大的技术&#xff0c;可以用来搜索与指定模式匹配的数据。MySQL数据库提供了一个灵活而强大的LIKE操作符&#xff0c;使得模糊查询变得简单和高效。本文将详细介绍MySQL中的LIKE操作符以及它的用法&#xff0c;并通过示例演示…

软件测试/测试开发丨接口测试Mock实战练习学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27857 一、Rewrite 1.1、Rewrite 原理 1.2、Rewrite 实战 Tools → Rewrite 勾选 Enable Rewrite 点击下方 Add 按钮新建一个重写的规则 在右侧编辑重…

JVM之jinfo虚拟机配置信息工具

jinfo虚拟机配置信息工具 1、jinfo jinfo&#xff08;Configuration Info for Java&#xff09;的作用是实时地查看和调整虚拟机的各项参数。 使用jps -v 可以查看虚拟机启动时显示指定的参数列表&#xff0c;但是如果想知道未被显示指定的参数的系统默认值&#xff0c;除 …

blender动画制作全流程软件

blender官网下载地址 Download — blender.org blender菜单中英文对照表 blender常用快捷键&#xff1a; ~切换视图 z切换着色模式 shiftA新建物体 tab进入编辑模式 在编辑模式下: 1编辑点 2编辑线 3编辑面 shfit空格弹出所有快捷键 游标一般配合标注使用 常用:G移动物体…

1214. 波动数列

题目&#xff1a; 1214. 波动数列 - AcWing题库 思路&#xff1a;dp dp划分递归 转自&#xff1a; AcWing 1214. 波动数列&#xff08;有公式详细推导&#xff09; - AcWing 代码&#xff1a; #include <iostream> #include <cstring> #include <algori…