编码器就是鼠标滚轮器件,工作的时候用到了。原理看懂了很简单,参考:
https://blog.csdn.net/wang328452854/article/details/50579832
长话短说
物理现象:编码器内有2个监测点,相位相差90 ,滚轮拨动一格2个监测点分别检测到一个脉冲。
程序实现:开定时器检测脉冲,处理脉冲,然后输出拨动了几格,一般官方会做成接口调用一下 就行。
nordic 52832具体实现,可以参考SDK里的\examples\peripheral\qdec
1.添加nrf_drv_qdec.c
2.初始化
void mcu_init_qedc(void)
{ret_code_t err_code;nrf_drv_qdec_config_t config = NRF_DRV_QDEC_CONFIG;err_code = nrf_drv_qdec_init(&config, qedc_event_handler);APP_ERROR_CHECK(err_code);nrf_drv_qdec_enable();
}
config结构体详解
#define NRF_DRV_QDEC_CMBW_CONFIG \{ \.reportper = NRF_QDEC_REPORTPER_80, \//采集完80个样本后报告.sampleper = NRF_QDEC_SAMPLEPER_256us, \//每256us采集一个样本.psela = PIN_QDEC_A, \//监测点A.pselb = PIN_QDEC_B, \//监测点B.pselled = NULL, \.interrupt_priority = APP_IRQ_PRIORITY_LOW, \.dbfen = true, \//消抖.sample_inten = true \}
3.qedc_event_handler的编写
每到达样本值就进入中断,代表拨动了一次。
void qedc_event_handler(nrf_drv_qdec_event_t event)
{int val = 0;if (event.type == NRF_QDEC_EVENT_REPORTRDY){//到达报告值val++;}if (event.type == NRF_QDEC_EVENT_SAMPLERDY){//到达样本值}
}
4.实际遇到的问题和解决办法
以上是使用官方的接口,我们遇到了2个问题
1.占用资源大。解决办法: .reportper .sampleper 两个值设置大一些
2..dbfen使能后还是有抖动。解决办法:qedc_event_handler内把val++移到NRF_QDEC_EVENT_REPORTRDY内,SAMPLRDY不做处理。