在电机控制中,实时获取电机转子位置是非常重要的。通过监测电机轴或机械设备运动的位置可以计算电机转速。当电机转动时,编码盘传感器(encoder)会发出类似于正交pwm波的高低电平信号,对此信号进行解码,可以得到电机转动角度及方向。
dsc系列mcu的quad timer(tmr)外设可以对正交编码信号解码,有些客户使用lpc55xx系列也需要解码,本文用plu模块对encoder的信号解码,用计数器计数解码信号,进而得到转子位置及速度。
1. 标准推拉输出
dsp系列mcu的quad timer(tmr)外设可以对正交编码信号进行解码,如下:
在进行解码时,其实是两个信号发生电平翻转时进行计数,那么可以理解为对这两个信号做异或运算,对结果信号上升沿和下降沿进行计数,就可实现解码功能。利用可编程逻辑单元plu对正交编码信号做异或运算,利用ctimer计数器对输出信号进行计数,同样可以达到quad timer(tmr)解码效果。
2. 配置plu与ctimer
plu(programmable logic unit),即可编程逻辑单元,可创建小型组合与时序逻辑电路。lpc804与lpc55xx的plu在使用上是完全相同的,包含了6个输入、8个输出、26个5输入查找表(lut)、4个触发器(state flip-flops),详细介绍如下: https://www.nxpic.org.cn/module/forum/thread-622667-1-1.html 用pio_19与pio_20产生类似于正交编码信号,将两路信号输入plu模块的in3与in4,进行异或运算,再输出到out5,将out5信号输入到ctimer计数器进行计数,如下:
以lpc55s69-evk开发板为例,具体的引脚使用如下:
配置plu与ctimer引脚,如下:
打开plu与ctimer时钟,如下:
添加plu外设,如下:
配置ctimer外设,在main.c文件中添加ctimer初始化,上升沿与下降沿都可触发计数器。假如电机转一圈触发4096次计数器,电机在旋转60°时要控制电机变相,当计数器值为4096/6 = 682时,触发一次ctimer中断,在中断处理函数中控制电机,如下:
uint32_t motor_flag = 0;const ctimer_config_t ctimer0_config = { .mode = kctimer_increaseonbothedge, .input = kctimer_capture_0, .prescale = 0};const ctimer_match_config_t ctimer0_match_0_config = { .matchvalue = 681, .enablecounterreset = true, .enablecounterstop = false, .outcontrol = kctimer_output_noaction, .outpininitstate = false, .enableinterrupt = true};/*single callback functions definition */ctimer_callback_t ctimer0_callback[] ={ctimer0_match0_callback};static void ctimer0_init(void) { /* ctimer0 peripheral initialization */ ctimer_init(ctimer0, &ctimer0_config); /* interrupt vector ctimer0_irqn priority settings in thenvic. */ nvic_setpriority(ctimer0_irqn, 0); /* match channel 0 of ctimer0 peripheral initialization*/ ctimer_setupmatch(ctimer0, kctimer_match_0, &ctimer0_match_0_config); ctimer_registercallback(ctimer0,ctimer0_callback, kctimer_singlecallback); ctimer_starttimer(ctimer0);}void ctimer0_match0_callback(uint32_t flags){ motor_flag++;}
下载plu configure tool,下载链接如下:
https://www.nxp.com/mcu-plu-config-tool 打开plu配置工具,选择原理图设计,做一个异或运算,如下:
点击菜单栏file->export->plu source file将其导出为c文件,将c文件的内容复制到main函数中,如下:
plu->lut[4].inp_mux[0] = 0x00000003; /* in3 (in3) */ plu->lut[4].inp_mux[1] = 0x00000004; /* in4 (in4) */ plu->lut[4].inp_mux[2] = 0x0000003f; /* default */ plu->lut[4].inp_mux[3] = 0x0000003f; /* default */ plu->lut[4].inp_mux[4] = 0x0000003f; /* default */ plu->lut_truth[4] = 0x66666666; /* xor01 (xor01) std 2input xor */ plu->output_mux[5] = 0x00000004; /* lut4 (xor01) ->out5 */
利用gpio产生正交编码信号,ctimer进行计数,当计数到682时会触发中断进入回调函数,计数器值(tc)会自动清零,重新计数,如下:
while(1) { gpio_porttoggle(gpio,0, 1u << 19); systick_delayticks(5u); gpio_porttoggle(gpio,0, 1u
3. 测试结果 逻辑分析仪测试结果如下:
调试时,计数器的值如下所示:
示例代码:lpc55s69_project_motor_counter.zip
尹志尧:中国造芯之路毁在人才上
压缩式压电传感器_压缩式压电传感器是什么
如何将Kafka使用到我们的后端设计中
网约车新政之后,你可以通过蓝牙智能钥匙来实现汽车共享
螺丝光学影像筛选机之机器视觉检测设备详情解析
利用电机控制中PLU模块与CTIMER计数器解码电机
买菜APP开发方案
一张图总结Google C++编程规范
英国小镇Hulk正在尝试推出自己的数字货币
三星将推8英寸平板电脑 剑指苹果iPad mini
面板厂争相发布屏下指纹成果 谁将笑傲2018?
iphone8什么时候上市?iphone8最新消息:iphone 8即将发布,ios11测试版泄密!苹果8确定将有无线充电这项新功能!
用于快充钠离子电池的多电子反应阴极
大功率光纤激光内孔熔覆装备开发及应用
神威太湖之光只能靠跑分“作秀”?其实有大作用
食品中亚硝酸盐检测仪的功能
电工常用电动机控制电路图集
电动车电池现存几忧患揭秘
如何选购音箱
小米手环3评测 依然保持着极高的性价比