嵌入式技术论坛
直播中

梅利号

8年用户 1473经验值
擅长:可编程逻辑
私信 关注
[经验]

对NuMaker-M2354开发板的正交编码器QEI模块进行测试

1.测试环境
MDK V5.26.2.0
Nu-Link_Keil_Driver 3.07.7246r
ENV V1.2.0
Python V2.7.13
rt-thread-v4.0.4

2.测试任务
本次测试任务为新唐 NuMaker-M2354正交编码器QEI模块

3.资源介绍
翻阅新唐M2354数据手册


查看新唐开发板原理图及数据手册,PD10、PD11、PD12空闲,配置为QEI0_B、QEI0_A、QEI0_INDEX

4.代码
ENV工具开启QEI0

nu_qei.c

void QEI_Open(QEI_T* qei, uint32_t u32Mode, uint32_t u32Value)
{
/* Set QEI function configuration /
/
Set QEI counting mode /
/
Enable IDX, QEA and QEB input to QEI controller /
qei->CTL = (qei->CTL & (~QEI_CTL_MODE_Msk)) | ((u32Mode) | QEI_CTL_CHAEN_Msk | QEI_CTL_CHBEN_Msk | QEI_CTL_IDXEN_Msk);
/
Set QEI maximum count value in in compare-counting mode /
qei->CNTMAX = u32Value;
}
void QEI_Start(QEI_T
qei)
{
/* Enable QEI controller function */
qei->CTL |= QEI_CTL_QEIEN_Msk;
}

main.c

#include "nu_qei.h"
int main(int argc, char *argv)
{
#if defined(RT_USING_PIN)
int counter = 100;
/
set LEDR pin mode to output */
rt_pin_mode(LEDR, PIN_MODE_OUTPUT);
/PD10 PD11 PD12 配置为QEI0/
SYS->GPD_MFPH &= ~(SYS_GPD_MFPH_PD10MFP_Msk | SYS_GPD_MFPH_PD11MFP_Msk | SYS_GPD_MFPH_PD12MFP_Msk);
SYS->GPD_MFPH |= (SYS_GPD_MFPH_PD10MFP_QEI0_B | SYS_GPD_MFPH_PD11MFP_QEI0_A | SYS_GPD_MFPH_PD12MFP_QEI0_INDEX);
/打开QEI0/
QEI_Open(QEI0,QEI_CTL_X4_FREE_COUNTING_MODE,10000);
QEI_Start(QEI0);
while (counter--)
{
rt_pin_write(LEDR, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LEDR, PIN_LOW);
rt_thread_mdelay(500);
}

5.结果
由于手边没有电机等可用于QEI测量的设备,只能手动模拟给PD10、PD11脉冲信号,通过仿真看了QEI_CNT寄存器,确实能够实现计数

6.心得
新唐的技术手册讲得很清楚,寄存器的位也有清晰的介绍,RT-Thread调用驱动也比较简单,我们只需要根据实际需要选择编码器计数模式,是否开启中断等,有问题对照技术手册查看寄存器基本都能解决。遗憾的是没有能够找到设备去验证,实际应用的时候可能还是会出现问题,有机会找一个电机接上,应该会有不错的体验。

原作者:lianghai

更多回帖

发帖
×
20
完善资料,
赚取积分