GD32-舵机的原理

news2024/9/25 13:23:20

GD32-舵机的原理

舵机的现一脉宽与舵机转动角度

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

旋转编码器的原理

顺时针:A的下降沿时,B处于高电平;
逆时针:A的下降沿时,B处于低电平;

在这里插入图片描述

#ifndef _ENCODER_DRIVE_H
#define _ENCODER_DRIVE_H

#include "gd32f10x.h"
#include "systick.h"

#define ENCODER_L_PORT  GPIOA
#define ENCODER_L_PIN   GPIO_PIN_6

#define ENCODER_R_PORT  GPIOB
#define ENCODER_R_PIN   GPIO_PIN_14

#define ENCODER_D_PORT  GPIOA
#define ENCODER_D_PIN   GPIO_PIN_7


void encoder_init(void);    //初始化旋转编码器
void gpio_config(void);     //io口的配置
void exti_config(void);     //中断的配置

bit_status read_D(void);
bit_status read_L(void);
bit_status read_R(void);

uint8_t get_coder_num(void);
bool get_coder_d_flg(void);
#endif
#include "encoder_drive.h"

volatile uint8_t encoder_num = 0;
volatile bool encoder_d_flg = FALSE;     //标识旋转编码器被按下奇数次FALSE还是偶数次TRUE
volatile uint8_t encoder_direct_flg = 0; //可能的旋转方向标识

void encoder_init(void){    //初始化旋转编码器
	gpio_config();
	exti_config();
}

void gpio_config(void){     //io口的配置
	// 使能RCU时钟
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_GPIOB);
	
	// 初始化io口的工作模式
	gpio_init(ENCODER_L_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, ENCODER_L_PIN);
	gpio_init(ENCODER_R_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, ENCODER_R_PIN);
	gpio_init(ENCODER_D_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, ENCODER_D_PIN);
}

//中断的配置
void exti_config(void){
	rcu_periph_clock_enable(RCU_AF);
	
	// 使能PA6线(exti_6)上的中断,表示L
	nvic_irq_enable(EXTI5_9_IRQn, 2U, 2U);
	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_6);// 给它配置中断源(io口)
	exti_init(EXTI_6, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
	exti_interrupt_flag_clear(EXTI_6);
	
	// 使能PB14线上的中断, 表示R
	nvic_irq_enable(EXTI10_15_IRQn, 2U, 2U);
	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_14);// 给它配置中断源(io口)
	exti_init(EXTI_14, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
	exti_interrupt_flag_clear(EXTI_14);
	
}

void EXTI5_9_IRQHandler(void){
	if(exti_interrupt_flag_get(EXTI_6) == SET){ //是否为EXTI_6触发的中断
		if(read_R() == SET){  //左转
			encoder_direct_flg = 1;  // 可能左转
		}else if(read_R() ==RESET){ //右一次可能的右转
			if(encoder_direct_flg == 2){  // 确认右转
				encoder_num = encoder_num < 1 ? 1 : encoder_num;
				encoder_num--;
				encoder_direct_flg = 0;
			}
		}
	}
	
	exti_interrupt_flag_clear(EXTI_6);
}


void EXTI10_15_IRQHandler(void){
	if(exti_interrupt_flag_get(EXTI_14) == SET){ //是否为EXTI_14触发的中断,即R引脚触发
		if(read_L() == SET){  //可能右转,第一次
			encoder_direct_flg = 2;  //记录右转的可能性
		}else if(read_L() ==RESET){ // 可能是第二次左转
			if(encoder_direct_flg == 1){  // 第一次、第二次可能左转叠加,
				encoder_num++;  //保证encoder++之后的结果不能大于180
				encoder_num = encoder_num > 180 ? 180 : encoder_num;
				encoder_direct_flg = 0;
			}
		}
	}
	
	exti_interrupt_flag_clear(EXTI_14);
}


bit_status read_D(void){
	return gpio_input_bit_get(ENCODER_D_PORT, ENCODER_D_PIN);
}
bit_status read_L(void){
	return gpio_input_bit_get(ENCODER_L_PORT, ENCODER_L_PIN);
}

bit_status read_R(void){
	return gpio_input_bit_get(ENCODER_R_PORT, ENCODER_R_PIN);
}

uint8_t get_coder_num(void){
	return encoder_num;
}

bool get_coder_d_flg(void){
	if(read_D() == RESET){//如果coder_d口输入是0
		delay_1ms(10);//等待10ms
		if(read_D() == RESET){//再次查看coder_d口输入是不是0
			while(read_D() == RESET);//如果还是0,等待0结束
			encoder_d_flg = encoder_d_flg ? FALSE : TRUE;//然后给encoder_d_flg取反
		} //否则,encoder_d_flg值不变
	}//否则 encoder_d_flg值不变
	
	return encoder_d_flg;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab图像处理运算方法-非线性点运算

常见的非线性灰度变换为对数变换和幂次变换。 对数变换 对数变换的一般表达式为&#xff1a; tclog(1s) 其中c为尺度比例常数&#xff0c;s为输入图像灰度值&#xff0c;t为变换后的输出图像灰度值。在如下图所示的对数曲线上&#xff0c;函数…

node-red - 读写操作redis

node-red - 读写操作redis 一、前期准备二、node-red安装redis节点三、node-red操作使用redis节点3.1 redis-out节点 - 存储数据到redis3.2 redis-in节点 - 查询redis数据 附录附录1&#xff1a;redis -out节点示例代码附录2&#xff1a;redis -in节点示例代码 一、前期准备 安…

ensp-IPsec vpn配置

ensp-IPsec vpn配置 &#x1f4ce;IPsec VPN配置.docx&#x1f4ce;IPSec.zip

Windows和Linux卸载anaconda的完整解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

drag handle是什么意思?

Drag handle" 是一个术语&#xff0c;通常用于描述在用户界面&#xff08;如软件应用程序、网页等&#xff09;中用于拖拽或调整元素的小型图标、区域或手柄。它是一种交互式设计元素&#xff0c;用户可以通过拖拽它来改变界面上的元素的位置、大小或其他属性。 “Drag h…

数字孪生技术在3大行业的重点应用

数字孪生技术是利用模拟仿真技术将实体对象数字化的技术。它基于虚拟现实、人工智能和云计算等技术&#xff0c;能够创建与真实物体相同的数字模型&#xff0c;并通过实时监测和分析手段&#xff0c;提供关于该物体的全面数据&#xff0c;从而优化产品开发和生产过程。数字孪生…

熊猫:完整的初学者指南

pandas&#xff1a;完整的初学者指南 一、说明 在你的Python开发人员或数据科学之旅中&#xff0c;你可能已经多次遇到“熊猫”这个词&#xff0c;但仍然需要弄清楚它的作用。以及数据和熊猫之间的关系。所以让我向你解释一下。 根据最新估计&#xff0c;每天创建 328.77 亿 TB…

二分查找逻辑

目录 二分查找 查找逻辑 题目练习 题目描述 代码示例 总结 二分查找 二分查找是我们经常使用的一种算法&#xff0c;他的逻辑是 在升序或者降序且无重复元素的数组中&#xff0c;比较目标值和数组中间值的方法&#xff0c;每次缩小一半的搜索范围&#xff0c;相比遍历可…

Unity Alembic闪烁问题

最近在做项目时&#xff0c;发现Clo3D导出的服装abc动画&#xff0c;导入到Unity中后(已提前导入Alembic插件)&#xff0c;运行时屏幕会闪烁(变黑)。 经过几轮测试&#xff0c;发现是切线的问题。解决办法很简单。将abc文件上的Tangents属性值改为None即可。

一篇关于CPU的硬核知识分享

不管你玩硬件还是做软件&#xff0c;你的世界都少不了计算机最核心的 —— CPU。 01CPU是什么&#xff1f; CPU与计算机的关系就相当于大脑和人的关系&#xff0c;它是一种小型的计算机芯片&#xff0c;通常嵌入在电脑的主板上。 CPU的构建是通过在单个计算机芯片上放置数十亿…

app.js和页面.js 实现全局传参

实现全局传参的几个步骤&#xff1a;1. 在页面.js文件中 输入 const appgetApp() 2.便可以在页面中引用app.js中的globalData中的数据。 注意点&#xff1a;app.js中是使用的是this.globalData (调用自身的数据&#xff09; 页面.js中使用的是app.globalData&#xff08;引用ap…

Web 应用框架 Express 构建 RESTful API

Express框架 Express 是 Node.js 平台上最常用的 Web 应用框架之一&#xff0c;它简洁、灵活且易于使用。Express 提供了一组强大的功能和工具&#xff0c;可以帮助开发者快速构建 Web 应用程序和 RESTful API。 以下是 Express 框架的一些主要特点和功能&#xff1a; 轻量级…

c++11 标准模板(STL)(std::basic_istringstream)(五)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…

国家管网:围绕招标全链路,聚焦提升招标管理数智化水平

“要深化供应链管理系统应用&#xff0c;推动全面应用电子招标平台开展工程建设项目招标&#xff0c;实现招标工作过程透明、效率提升和监管有力。” ——国家管网董事长 张伟 作为能源领域新的“国家队”&#xff0c;国家管网立足新变局应对新挑战&#xff0c;着力提升产业链…

vite按需引入elementPlus ,并自定义主题色

1. 首选无论是按需引入还是全引入都需要先安装elementPlus npm i element-plus 2. 按需引入elementPlus&#xff0c;可参照官网 a. 安装unplugin-vue-components 和 unplugin-auto-import npm install -D unplugin-vue-components unplugin-auto-import b. 配置vite.config.…

VScode使用SSH连接linux

1、官网下载和安装软件 https://code.visualstudio.com/Download 2、安装插件 单击左侧扩展选项&#xff0c;搜索插件安装 总共需要安装的插件如下所示 3、配置连接服务器的账号 安装完后会在左侧生成了远程连接的图标&#xff0c;单击此图标&#xff0c;然后选择设置图标…

PHP自己的框架验证码Captcha使用(完善篇八)

1、实现效果生成验证验证码 2、验证码类CaptchaBase.php <?php class CaptchaBase {private $width;private $height;private $length;public function __construct($width, $height, $length){$this->width $width;$this->height $height;$this->length $le…

基于Java+SpringBoot+Vue前后端分离社区智慧养老监护管理平台设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

亚洲辛辣菜肴搭档什么葡萄酒最好?

我们都有那种甜美、活泼、超级容易相处的朋友&#xff0c;他们是你想在一起度过美好时光的人。在葡萄酒的世界里&#xff0c;莫斯卡托就是这样的朋友。莫斯卡托是一个甜味品种&#xff0c;在过去的几年里葡萄酒在世界范围内越来越受欢迎。由于酒精含量低&#xff0c;轻微起泡&a…

202325读书笔记|《花间集评注》——金盏不辞须满酌,海棠花下思朦胧,醉香风。满身香雾簇朝霞。世间屏障,彩笔画娇娆。

202325读书笔记|《花间集评注》——金盏不辞须满酌&#xff0c;海棠花下思朦胧&#xff0c;醉香风。满身香雾簇朝霞。世间屏障&#xff0c;彩笔画娇娆。 花间集评注卷一花间集评注卷二花间集评注卷三花间集评注卷四花间集评注卷五花间集评注卷六花间集评注卷七花间集评注卷八花…