Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
Numaker-IoT-M487
【Numaker-IoT-M487】QEI相关功能评测
发布于 2022-04-26 11:27:35 浏览:687
订阅该版
一、M487 QEI简介 6.14.1 概述 M480 有两组 QEI 控制器。正交编码接口 (QEI) 解读转速和动作传感器的信息。它可以用在任何使用正 交编码器作为反馈的应用里。 6.14.2 特性 6.14.2.1 正交编码接口 (QEI) 特性 多达 2 个 QEI 控制器,QEI0 及 QEI1 2 个 QEI 相位输入,QEA 及 QEB;1 个索引输入 1 个 32 位的上/下正交编码脉冲计数器 (QEI_CNT) 1 个 32 位的软件锁存正交编码脉冲计数器保存寄存器 (QEI_CNTHOLD) 1 个 32 位的正交编码脉冲计数器索引锁存寄存器 (QEI_CNTLATCH) 1 个 32 位的正交编码脉冲计数器比较寄存器 (QEI_CNTCMP),并提供最大计数预设值寄存 器 (QEI_CNTMAX) 1 个 QEI 控制寄存器 (QEI_CTL) 和 1 个 QEI 状态寄存器 (QEI_STATUS) 4 种正交编码脉冲计数器操作模式 – 支持 x4 自由计数模式 – 支持 x2 自由计数模式 – 支持 x4 比较计数模式 – 支持 x2 比较计数模式 编码脉冲宽度测量模式 不做消噪时,QEA/QEB/IDX 的输入频率必须低于 PCLK/4 有做消噪时,QEA/QEB/IDX 的输入频率必须低于噪声滤波器的 Clk/8 二、软件测试环境 KEIL MDK v5.26 Env RT-Thread 开发辅助工具。 终端联机工具Tera Term V4.99 RT-Thread 标准版系统及bsp包 三、硬件环境 NuMaker-IoT-M487 开发板更多详细信息请参考 [Nuvoton Direct](https://direct.nuvoton.com/en/numaker-iot-m487)。 [开发板原理图](https://www.nuvoton.com/resource-download.jsp?tp_GUID=HL0320180905131830) 四、开始建立测试环境 1.在官网下载Env RT-Thread 开发辅助工具包,包含了终端联机工具Tera Term; 2.根据[NuMaker-IoT-M487 上手指南](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/quick-start/numaker-iot-m487/quick-start) 下载更新RT-Thread 标准版系统及bsp包 3.在ENV环境下,输入cd rt-thread>> cd bsp/nuvoton/numaker-iot-m487>>menuconfig打开系统配置界面,Hardware Drivers Config>>On-Chip Peripheral Drivers >>Enable quadrature Encoder Interface(QEI)>>QEI0; 如图:![10.png](https://oss-club.rt-thread.org/uploads/20220426/825fd3a23a1322675e02dbb89b81aeb1.png)>>![11.png](https://oss-club.rt-thread.org/uploads/20220426/c5a13809533990b55f03da99813b23e8.png) 最后输入scons --target=mdk5 进行编译; 打开KEIL编译通过后下载到板上;通过终端联机工具Tera Term 输入list_device查询 如图![17.png](https://oss-club.rt-thread.org/uploads/20220426/96c8cc944cc27f7df3eda0e24b488c3e.png.webp) 出现qei0接口对象, 说明项目配置成功; 4.找出M487 QEI0 对应的IO QEI0_A = PA4, QEI0_B = PA3,如图 ![12.png](https://oss-club.rt-thread.org/uploads/20220426/ffd1e84287a0dc50261658f5a14b88dc.png) 在nutool_pincfg.c 中的nutool_pincfg_init 和nutool_pincfg_deinit中分别加入: nutool_pincfg_init_qei0(), nutool_pincfg_deinit_qei0(); ``` void nutool_pincfg_init_qei0(void) { /* Set PA multi-function pins for QEI0_A, QEI0_B, QEI0_INDEX */ SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk); SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA4MFP_QEI0_A | SYS_GPA_MFPL_PA3MFP_QEI0_B | SYS_GPA_MFPL_PA5MFP_QEI0_INDEX); } void nutool_pincfg_deinit_qei0(void) { SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk); } ``` 如图:![13.png](https://oss-club.rt-thread.org/uploads/20220426/4cfd1a850805473991fdbbcf5fad4033.png.webp) ![14.png](https://oss-club.rt-thread.org/uploads/20220426/6b1baaba796a5e9b377b97f2627ce319.png) 5.找出NuMaker-IoT-M487 对应的测试端子; ![15.png](https://oss-club.rt-thread.org/uploads/20220426/5e6c6e228c316a15cfbb985ed96f511b.png) ![16.png](https://oss-club.rt-thread.org/uploads/20220426/23e46928aedeb67da80e2c1393d912ab.png.webp) 然后将杜邦线连接:![微信图片_20220426095002.jpg](https://oss-club.rt-thread.org/uploads/20220426/09dcdbc17b4012d1ebd550a76a22de26.jpg.webp) 6.开始代码测试 用keil 打开 rt-thread\bsp\nuvoton\numaker-iot-m487 目录下project项目;在 applications 下新增 QEI_test.c; ``` #include "rtthread.h" #include "rtdevice.h" #include "NuMicro.h" #include
#define A0 NU_GET_PININDEX(NU_PA, 0) #define B0 NU_GET_PININDEX(NU_PA, 1) struct nu_qei { struct rt_pulse_encoder_device dev; char *name; QEI_T *qei_base; rt_uint32_t max_cntval; rt_uint32_t cmp_val; IRQn_Type IRQn; rt_uint8_t qei_type; rt_uint8_t qei_flag; }; typedef struct nu_qei *nu_qei_t; void qei_thread_entry(void *arc) { rt_int32_t s32_Count = 0; rt_uint8_t u8_GetEncoderType = 0; rt_device_t qei_ops=rt_device_find("qei0"); if(qei_ops == RT_NULL) { rt_kprintf("not find device qei0 \r\n"); return ; } rt_kprintf("find device qei0\r\n"); ((nu_qei_t)qei_ops)->cmp_val = 4096; ((nu_qei_t)qei_ops)->max_cntval = 4096; rt_device_open(qei_ops, PULSE_ENCODER_CMD_ENABLE); //设置比较模式 rt_device_control(qei_ops,PULSE_ENCODER_CMD_GET_TYPE, &u8_GetEncoderType); //取编码类型 switch( u8_GetEncoderType ) { case UNKNOWN_PULSE_ENCODER_TYPE: /* Unknown pulse_encoder type */ rt_kprintf("PULSE_ENCODER_TYPE: UNKNOWN_PULSE_ENCODER_TYPE! \r\n" ); case SINGLE_PHASE_PULSE_ENCODER: /* single phase pulse_encoder */ rt_kprintf("PULSE_ENCODER_TYPE: SINGLE_PHASE_PULSE_ENCODER! \r\n" ); case AB_PHASE_PULSE_ENCODER: /* two phase pulse_encoder */ rt_kprintf("PULSE_ENCODER_TYPE: two phase pulse_encoder! \r\n" ); } rt_device_control(qei_ops,PULSE_ENCODER_CMD_CLEAR_COUNT,RT_NULL); //计数器清零 rt_device_read( qei_ops, RT_NULL, &s32_Count, 1); rt_kprintf("Count: %d \r\n",s32_Count ); while(1) { rt_pin_write(A0, PIN_HIGH); rt_thread_delay(2); rt_pin_write(B0, PIN_HIGH); rt_thread_delay(2); rt_pin_write(A0, PIN_LOW); rt_thread_delay(2); rt_pin_write(B0, PIN_LOW); rt_thread_delay(2); } } int run_qei(void) { rt_pin_mode(A0, PIN_MODE_OUTPUT); rt_pin_mode(B0, PIN_MODE_OUTPUT); rt_thread_t tid = RT_NULL; tid = rt_thread_create("qei_test_thd", qei_thread_entry, RT_NULL, 2048, 12, 10); if (tid != RT_NULL) { rt_thread_startup(tid); } else { return RT_ERROR; } return RT_EOK; } //INIT_APP_EXPORT(run_qei); MSH_CMD_EXPORT(run_qei , qei test ); ``` 编译通过后下载到板上; 打开 终端联机工具Tera Term 输入run_qei; 如图:![18.png](https://oss-club.rt-thread.org/uploads/20220426/f677a2cefc63d83b552f1a983cdd895f.png.webp) 实现了AB相位脉冲编码器4096个脉冲比较中断测试; 五、测评总结 1、qei 模块 作为 "Miscellaneous Device" 个人感觉“ I/O 设备管理层实现了对设备驱动程序的封装”还需要扩展,一些参数的灵活配置仍然留给底层; 2、RT-Thread I/O 设备模型 思路还是不错的;可以提高应用代码的可移植性;
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
颜旭涛
这家伙很懒,什么也没写!
文章
2
回答
0
被采纳
0
关注TA
发私信
相关文章
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部