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
|