查看: 1562|回复: 4

[原创] LPC804与55xx: 利用可编程逻辑单元PLU与CTIMER计数器解码电机...

[复制链接]

该用户从未签到

7

主题

15

帖子

0

注册会员

Rank: 2

积分
189
最后登录
2022-3-9
发表于 2021-7-14 14:27:19 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2021-7-14 16:44 编辑

      在电机控制中,实时获取电机转子位置是非常重要的。通过监测电机轴或机械设备运动的位置可以计算电机转速。当电机转动时,编码盘传感器(Encoder)会发出类似于正交PWM波的高低电平信号,对此信号进行解码,可以得到电机转动角度及方向。DSC系列MCU的Quad Timer(TMR)外设可以对正交编码信号解码,有些客户使用LPC55XX系列也需要解码,本文用PLU模块对Encoder的信号解码,用计数器计数解码信号,进而得到转子位置及速度。
1.    正交编码信号解码方案
      DSP系列MCU的Quad Timer(TMR)外设可以对正交编码信号进行解码,如下:
1.JPG

      在进行解码时,其实是两个信号发生电平翻转时进行计数,那么可以理解为对这两个信号做异或运算,对结果信号上升沿和下降沿进行计数,就可实现解码功能。利用可编程逻辑单元PLU对正交编码信号做异或运算,利用CTIMER计数器对输出信号进行计数,同样可以达到Quad Timer(TMR)解码效果。
2.    配置PLU与CTIMER
      PLU(Programmable Logic Unit),即可编程逻辑单元,可创建小型组合与时序逻辑电路。LPC804与LPC55XX的PLU在使用上是完全相同的,包含了6个输入、8个输出、26个5输入查找表(LUT)、4个触发器(state Flip-Flops),详细介绍如下:
      用PIO_19与PIO_20产生类似于正交编码信号,将两路信号输入PLU模块的IN3与IN4,进行异或运算,再输出到OUT5,将OUT5信号输入到CTIMER计数器进行计数,如下:
2.JPG

      以LPC55S69-EVK开发板为例,具体的引脚使用如下:
3.JPG

      配置PLU与CTIMER引脚,如下:
4.JPG

      打开PLU与CTIMER时钟,如下:
5.JPG

      添加PLU外设,如下:
6.JPG

      配置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,下载链接如下:
      打开PLU配置工具,选择原理图设计,做一个异或运算,如下:
7.JPG

点击菜单栏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 << 20);
     SysTick_DelayTicks(5U);
        motor_counter = CTIMER0->TC;    }

3.  测试结果
      逻辑分析仪测试结果如下:
8.JPG

      调试时,计数器的值如下所示:
9.JPG

示例代码: LPC55S69_Project_motor_counter.zip (660.27 KB, 下载次数: 14)
回复

使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2021-7-14 15:37:27 | 显示全部楼层
    PLU单元 好神奇呀
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-12-30 08:07
  • 签到天数: 87 天

    [LV.6]常住居民II

    0

    主题

    242

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    1097
    最后登录
    2022-12-30
    发表于 2021-7-15 08:39:03 | 显示全部楼层
    头一次见,还有PLU(Programmable Logic Unit)这种好玩的东西。以前都是用CPLD/FPGA的。赞一个!
    生命不息,奋斗不止!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
    发表于 2021-7-15 09:59:24 | 显示全部楼层
    不错,谢谢分享~
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-5-20 10:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    0

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    130
    最后登录
    2021-9-4
    发表于 2021-7-15 16:02:04 | 显示全部楼层
    delei 发表于 2021-7-15 08:39
    头一次见,还有PLU(Programmable Logic Unit)这种好玩的东西。以前都是用CPLD/FPGA的。赞一个! ...

    在mcu上加上一些比较小的可编程逻辑单元,可以做简单的组合/时序逻辑电路
    干活啦
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 19:08 , Processed in 0.116367 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表