全志R128应用开发案例—中断方式驱动旋转编码器

中断方式驱动旋转编码器
旋转编码器是一种位置传感器,可将旋钮的角位置(旋转)转换为用于确定旋钮旋转方向的输出信号。
由于其坚固性和良好的数字控制;它们被用于许多应用中,包括机器人技术,cnc机器和打印机。
旋转编码器有两种类型-绝对式和增量式。绝对编码器为我们提供旋钮的精确位置(以度为单位),而增量编码器报告轴已移动了多少增量。
编码器内部是一个槽形磁盘,该磁盘连接到公共接地引脚c以及两个接触针a和b。旋转旋钮时,a和b根据旋转旋钮的方向以特定顺序与公共接地引脚c接触。
当它们接触公共接地时,它们会产生信号。当一个引脚先于另一引脚接触时,这些信号就会彼此错开90°。这称为 正交编码 。
顺时针旋转旋钮时,首先连接a引脚,然后连接b引脚。逆时针旋转旋钮时,首先连接b引脚,然后连接a引脚。
通过跟踪每个引脚何时与地面连接或与地面断开,我们可以使用这些信号变化来确定旋钮的旋转方向。您可以通过在a更改状态时观察b的状态来做到这一点。
我们搭建电路,如下:
载入方案我们使用的开发板是 r128-devkit,需要开发 c906 核心的应用程序,所以载入方案选择r128s2_module_c906
$ source envsetup.sh $ lunch_rtos 1
勾选 gpio 驱动mrtos_menuconfig 找到下列驱动
drivers options --- > soc related device drivers --- > gpio devices --- > [*] enable gpio driver [*] enbale gpio hal apis test command
编写程序打开你喜欢的编辑器,修改文件:lichee/rtos/projects/r128s2/module_c906/src/main.c
引入头文件#include
使用 gpio 配置引脚配置 gpio 的上下拉状态使用 hal_gpio_set_pull(gpio_pin_t pin, gpio_pull_status_t pull); 来设置。这里我们设置 pa25 引脚为默认上拉状态。
hal_gpio_set_pull(gpioa(25), gpio_pull_up);配置 gpio 输入输出模式使用 hal_gpio_set_direction(gpio_pin_t pin, gpio_direction_t direction); 来设置 gpio 的输入输出模式,这里配置为输入模式。
hal_gpio_set_direction(gpioa(25), gpio_direction_input);配置 gpio 的 mux 功能gpio 通常有多种功能,需要配置 mux 选择需要的功能,使用 hal_gpio_pinmux_set_function(gpio_pin_t pin, gpio_muxsel_t function_index); 来设置 gpio 的复用功能,这里配置为gpio 输入模式(gpio_muxsel_in)
hal_gpio_pinmux_set_function(gpioa(25), gpio_muxsel_in);获取 gpio 的电平使用 int hal_gpio_get_data(gpio_pin_t pin, gpio_data_t *data); 来获取 gpio 的电平
gpio_data_t gpio_data;hal_gpio_get_data(gpioa(25), &gpio_data);申请配置中断使用 hal_gpio_to_irq 方法来申请中断号。hal_gpio_irq_request 绑定中断服务,hal_gpio_irq_enable 启用中断。这里配置一个
// 存放中断号uint32_t irq_clk;// 申请中断号ret = hal_gpio_to_irq(enc_clk, &irq_clk);if (ret < 0){ printf(gpio to irq error, irq num:%d error num: %dn, irq_clk, ret);}// 绑定中断处理函数ret = hal_gpio_irq_request(irq_clk, gpio_irq_encode, irq_type_edge_both, null);if (ret < 0){ printf(request irq error, irq num:%d error num: %dn, irq_clk, ret);}// 启用中断ret = hal_gpio_irq_enable(irq_clk);if (ret clk, a25 - > dt. a29 - > sw hal_gpio_set_pull(enc_clk, gpio_pull_down_disabled); hal_gpio_set_direction(enc_clk, gpio_direction_input); hal_gpio_pinmux_set_function(enc_clk, gpio_muxsel_in); // 获取初始编码器 clk 状态 gpio_data_t clk_data; hal_gpio_get_data(enc_clk, &clk_data); encode_lask_clk = clk_data; hal_gpio_set_pull(enc_dt, gpio_pull_down_disabled); hal_gpio_set_direction(enc_dt, gpio_direction_input); hal_gpio_pinmux_set_function(enc_dt, gpio_muxsel_in); // 存放 clk,dt 中断号 uint32_t irq_clk, irq_dt; // 申请 enc_clk 为中断引脚,跳变触发 ret = hal_gpio_to_irq(enc_clk, &irq_clk); if (ret < 0){ printf(gpio to irq error, irq num:%d error num: %dn, irq_clk, ret); } // 绑定中断处理函数 ret = hal_gpio_irq_request(irq_clk, gpio_irq_encode, irq_type_edge_both, null); if (ret < 0){ printf(request irq error, irq num:%d error num: %dn, irq_clk, ret); } // 启用中断 ret = hal_gpio_irq_enable(irq_clk); if (ret < 0){ printf(request irq error, error num: %dn, ret); } // 申请 enc_dt 为中断引脚,跳变触发 ret = hal_gpio_to_irq(enc_dt, &irq_dt); if (ret < 0){ printf(gpio to irq error, irq num:%d error num: %dn, irq_dt, ret); } // 绑定中断处理函数 ret = hal_gpio_irq_request(irq_dt, gpio_irq_encode, irq_type_edge_both, null); if (ret < 0){ printf(request irq error, irq num:%d error num: %dn, irq_dt, ret); } // 启用中断 ret = hal_gpio_irq_enable(irq_dt); if (ret < 0){ printf(request irq error, error num: %dn, ret); } vtaskdelete(null);}结果旋转旋转编码器即可看到计数变化

RFID技术面临着哪一些挑战
iPhone8物超所值,仅售8888元!历代最贵不是没理由
python中的set类型
一批出口匈牙利中国产灯串被欧盟召回 原因或是绝缘部分缺少合适的电阻
CES2012:三星LG电视争更薄更听话
全志R128应用开发案例—中断方式驱动旋转编码器
特斯拉、Uber等建立游说组织,推动电动汽车销售
解析2017年三大运营商在智慧家庭的进展和成果
一种新的静电发生器电路模型
智能制造怎样去推动机器人的发展
英创信息技术WinCE主板CAN接口数据接收性能测试介绍
神奇Li-Fi市场坐拥千亿美元“前景” 如今它有何最新成果?
千方科技宣布新的AI子公司博观智能正式落处济南
供应罗德与施瓦茨DVSG数字视频信号源
图文详解17种电容的分类
工业互联网创新发展助推制造业数字化转型
SDC是如何炼成的?create_generated_clock花式定义方法
智能路由器大战一触即发,生态环境尚需完善
智嵌物联4G DTU/RTU系列产品接入阿里云演示
中国EDA战略研讨会暨华大九天成立大会召开