• CMT2380F32模块开发10-高级定时器例程


    Advanced Timer 是一个包含三个定时器 Timer4/5/6。Timer4/5/6 功能相同的高性能计数器,可用于计数产生不同形式的时钟波形,1 个定时器可以产生互补的一对 PWM 或者独立的 2 路 PWM 输出,可以捕获外界输入进行脉冲宽度或周期测量。

    波形有锯齿波、三角波。
    基本功能有递加、递减计数方向,软件同步,硬件同步,缓存功能,正交编码计数,通用 PWM 输出,保护机制,AOS 关联动作。
    中断类型有计数比较匹配中断,计数周期匹配中断,死区时间错误中断。

    这个软件高级软件定时器功能十分强大,pwm波形就能产生非常复杂的,还能产生互补波形,甚至是相位差波形。文档写的很详细,而且例程也很详细,如果你是从头跟到这里,每个例程都有自己读过的话应该很容易的明白这些功能。
    这里我就挑几个比较常用的例子讲解一下,剩下的可以自行阅读,没有太大障碍。

    CaptureInput例程

    本样例主要展示ADT捕获输入功能。连接P23(IA0)与P15(IB0)。串口输出捕获值与计数值非常接近。PIN为P35. 波特率为9600, 8N1。

    1. stcAdtBaseCntCfg.enCntMode = AdtSawtoothMode;
    2. stcAdtBaseCntCfg.enCntDir = AdtCntUp;
    3. stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0Div1024;
    4. Adt_Init(enAdt, &stcAdtBaseCntCfg); // ADT载波、计数模式、时钟配置
    5. u16Period = 0xC000;
    6. Adt_SetPeriod(enAdt, u16Period); //周期设置
    7. enAdtCompareA = AdtCompareA;
    8. u16CompareA = 0x6000;
    9. Adt_SetCompareValue(enAdt, enAdtCompareA, u16CompareA); //通用比较基准值寄存器A设置
    10. stcAdtTIM4ACfg.enCap = AdtCHxCompareOutput;
    11. stcAdtTIM4ACfg.bOutEn = TRUE;
    12. stcAdtTIM4ACfg.enPerc = AdtCHxPeriodLow;
    13. stcAdtTIM4ACfg.enCmpc = AdtCHxCompareHigh;
    14. stcAdtTIM4ACfg.enStaStp = AdtCHxStateSelSS;
    15. stcAdtTIM4ACfg.enStaOut = AdtCHxPortOutLow;
    16. Adt_CHxXPortConfig(enAdt, AdtCHxA, &stcAdtTIM4ACfg); //端口CHA配置,比较输出功能
    17. stcAdtTIM4BCfg.enCap = AdtCHxCompareInput;
    18. Adt_CHxXPortConfig(enAdt, AdtCHxB, &stcAdtTIM4BCfg); //端口CHB配置,捕获输入功能
    19. Adt_ConfigHwCaptureB(enAdt, AdtHwTrigTimxBRise); //硬件捕获B条件配置
    20. Adt_ConfigIrq(enAdt, AdtCMBIrq, TRUE, Adt4CaptureBCalllback); //捕获中断B配置
    21. Adt_StartCount(enAdt);

    通道A输出定时器,通道B捕获。

    Irq例程

    本样例主要展示ADT中断功能。连接P33与P32(TrigB)。查看串口输出:在计数到0x1000、0x3000、0x5000、0x7000时产生比较输出A、B、C、D中断;端口TrigB上升沿和下降沿可产生捕获A、B中断;计数上溢出或下溢出时可产生上溢出或下溢出中断;死区时间错误时可产生死区时间错误中断;串口PIN为P35. 波特率为9600, 8N1。

    这个例程就不贴代码了,因为代码注释很详细,就是各种中断的测试代码。

    PhaseCount例程

    本样例主要展示ADT正交编码位置计数功能,根据AIN和BIN的相位关系进行计数。
    根据设定的不同,可以实现1倍计数、2倍计数、4倍计数。

    连接P14与P34(IA1),连接P15与P33(IB1)。读取串口输出计数值,并与AN220中图13-17位置模式时相位差计数动作设定(1倍)、图13-18置模式时相位差计数动作设定(2倍)、图13-19位置模式时相位差计数动作设定(4倍)中计数值比较。

    1. stcAdtTIM5ACfg.bFltEn = TRUE;
    2. stcAdtTIM5ACfg.enFltClk = AdtFltClkPclk0Div64;
    3. Adt_CHxXPortConfig(AdTIM5, AdtCHxA, &stcAdtTIM5ACfg); //端口CHA默认输入,滤波使能
    4. stcAdtTIM5BCfg.bFltEn = TRUE;
    5. stcAdtTIM5BCfg.enFltClk = AdtFltClkPclk0Div64;
    6. Adt_CHxXPortConfig(AdTIM5, AdtCHxB, &stcAdtTIM5BCfg); //端口CHB默认输入,滤波使能
    7. Gpio_SetIO(1, 4, FALSE);
    8. Gpio_SetIO(1, 5, TRUE);
    9. delay1ms(1000);
    10. #ifdef DEBUG_PRINT
    11. printf("*************************************\n");
    12. printf("ADT phase count 1x\n");
    13. #endif
    14. Adt_ClearHwCntUp(AdTIM5);
    15. Adt_ClearHwCntDwn(AdTIM5);
    16. Adt_ConfigHwCntUp(AdTIM5,
    17. AdtHwCntTimxBHighTimxARise); //硬件递加计数条件:CHxB端口为高电平时,CHxA端口上采样到上升沿
    18. Adt_ConfigHwCntDwn(AdTIM5,
    19. AdtHwCntTimxBLowTimxARise); //硬件递减计数条件:CHxB端口为低电平时,CHxA端口上采样到上升沿
    20. Adt_SetCount(AdTIM5, 3);
    21. Adt_StartCount(AdTIM5);
    22. genClkIn();
    23. Adt_StopCount(AdTIM5);
    24. Adt_ClearCount(AdTIM5);
    25. #ifdef DEBUG_PRINT
    26. printf("\n");
    27. #endif
    28. Gpio_SetIO(1, 4, FALSE);
    29. Gpio_SetIO(1, 5, TRUE);
    30. delay1ms(1000);
    31. #ifdef DEBUG_PRINT
    32. printf("*************************************\n");
    33. printf("ADT phase count 2x\n");
    34. #endif
    35. Adt_ClearHwCntUp(AdTIM5);
    36. Adt_ClearHwCntDwn(AdTIM5);
    37. Adt_ConfigHwCntUp(AdTIM5,
    38. AdtHwCntTimxBHighTimxARise); //硬件递加计数条件:CHxB端口为高电平时,CHxA端口上采样到上升沿
    39. Adt_ConfigHwCntUp(AdTIM5,
    40. AdtHwCntTimxBLowTimxAFall); //硬件递加计数条件:CHxB端口为低电平时,CHxA端口上采样到下降沿
    41. Adt_ConfigHwCntDwn(AdTIM5,
    42. AdtHwCntTimxAHighTimxBRise); //硬件递减计数条件:CHxA端口为高电平时,CHxB端口上采样到上升沿
    43. Adt_ConfigHwCntDwn(AdTIM5,
    44. AdtHwCntTimxALowTimxBFall); //硬件递减计数条件:CHxA端口为低电平时,CHxB端口上采样到下降沿
    45. Adt_SetCount(AdTIM5, 3);
    46. Adt_StartCount(AdTIM5);
    47. genClkIn();
    48. Adt_StopCount(AdTIM5);
    49. Adt_ClearCount(AdTIM5);
    50. #ifdef DEBUG_PRINT
    51. printf("\n");
    52. #endif
    53. Gpio_SetIO(1, 4, FALSE);
    54. Gpio_SetIO(1, 5, TRUE);
    55. delay1ms(1000);
    56. #ifdef DEBUG_PRINT
    57. printf("*************************************\n");
    58. printf("ADT phase count 4x\n");
    59. #endif
    60. Adt_ClearHwCntUp(AdTIM5);
    61. Adt_ClearHwCntDwn(AdTIM5);
    62. Adt_ConfigHwCntUp(AdTIM5,
    63. AdtHwCntTimxBHighTimxARise); //硬件递加计数条件:CHxB端口为高电平时,CHxA端口上采样到上升沿
    64. Adt_ConfigHwCntUp(AdTIM5,
    65. AdtHwCntTimxBLowTimxAFall); //硬件递加计数条件:CHxB端口为低电平时,CHxA端口上采样到下降沿
    66. Adt_ConfigHwCntUp(AdTIM5,
    67. AdtHwCntTimxAHighTimxBFall); //硬件递加计数条件:CHxA端口为高电平时,CHxB端口上采样到下降沿
    68. Adt_ConfigHwCntUp(AdTIM5,
    69. AdtHwCntTimxALowTimxBRise); //硬件递加计数条件:CHxA端口为低电平时,CHxB端口上采样到上升沿
    70. Adt_ConfigHwCntDwn(AdTIM5,
    71. AdtHwCntTimxAHighTimxBRise); //硬件递减计数条件:CHxA端口为高电平时,CHxB端口上采样到上升沿
    72. Adt_ConfigHwCntDwn(AdTIM5,
    73. AdtHwCntTimxALowTimxBFall); //硬件递减计数条件:CHxA端口为低电平时,CHxB端口上采样到下降沿
    74. Adt_ConfigHwCntDwn(AdTIM5,
    75. AdtHwCntTimxBHighTimxAFall); //硬件递减计数条件:CHxB端口为高电平时,CHxA端口上采样到下降沿
    76. Adt_ConfigHwCntDwn(AdTIM5,
    77. AdtHwCntTimxBLowTimxARise); //硬件递减计数条件:CHxB端口为低电平时,CHxA端口上采样到上升沿
    78. Adt_SetCount(AdTIM5, 3);
    79. Adt_StartCount(AdTIM5);
    80. genClkIn();
    81. Adt_StopCount(AdTIM5);
    82. Adt_ClearCount(AdTIM5);

    PwmHwComp例子

    本样例主要展示ADT硬件设定GCMBR互补PWM输出,在三角波A模式下,
    用于TIMxB端口波形输出的通用比较基准值寄存器(GCMBR)的值由通用比较基准值
    寄存器(GCMAR)和死区时间基准值寄存器(DTUAR、DTDAR)的值运算决定。

    1. stcAdtBaseCntCfg.enCntMode = AdtTriangleModeA;
    2. stcAdtBaseCntCfg.enCntDir = AdtCntUp;
    3. stcAdtBaseCntCfg.enCntClkDiv = AdtClkPClk0Div8;
    4. Adt_Init(enAdt, &stcAdtBaseCntCfg); // ADT载波、计数模式、时钟配置
    5. u16Period = 0xEEEE;
    6. Adt_SetPeriod(enAdt, u16Period); // ADT载波、计数模式、时钟配置
    7. enAdtCompare = AdtCompareA;
    8. u16Compare = 0x9999;
    9. Adt_SetCompareValue(enAdt, enAdtCompare, u16Compare); //通用比较基准值寄存器A设置
    10. enAdtCompare = AdtCompareB;
    11. u16Compare = 0;
    12. Adt_SetCompareValue(enAdt, enAdtCompare, u16Compare); //通用比较基准值寄存器B设置
    13. enAdtCompare = AdtCompareC;
    14. u16Compare = 0x8888;
    15. Adt_SetCompareValue(enAdt, enAdtCompare, u16Compare); //通用比较基准值寄存器C设置
    16. Adt_EnableValueBuf(enAdt, AdtCHxA, TRUE);
    17. // Adt_EnableValueBuf(enAdt, AdtCHxB, TRUE);
    18. stcAdtTIM4ACfg.enCap = AdtCHxCompareOutput;
    19. stcAdtTIM4ACfg.bOutEn = TRUE;
    20. stcAdtTIM4ACfg.enPerc = AdtCHxPeriodKeep;
    21. stcAdtTIM4ACfg.enCmpc = AdtCHxCompareInv;
    22. stcAdtTIM4ACfg.enStaStp = AdtCHxStateSelSS;
    23. stcAdtTIM4ACfg.enStaOut = AdtCHxPortOutLow;
    24. stcAdtTIM4ACfg.enStpOut = AdtCHxPortOutLow;
    25. Adt_CHxXPortConfig(enAdt, AdtCHxA, &stcAdtTIM4ACfg); //端口CHA配置
    26. stcAdtTIM4BCfg.enCap = AdtCHxCompareOutput;
    27. stcAdtTIM4BCfg.bOutEn = TRUE;
    28. stcAdtTIM4BCfg.enPerc = AdtCHxPeriodKeep;
    29. stcAdtTIM4BCfg.enCmpc = AdtCHxCompareInv;
    30. stcAdtTIM4BCfg.enStaStp = AdtCHxStateSelSS;
    31. stcAdtTIM4BCfg.enStaOut = AdtCHxPortOutHigh;
    32. stcAdtTIM4BCfg.enStpOut = AdtCHxPortOutHigh;
    33. Adt_CHxXPortConfig(enAdt, AdtCHxB, &stcAdtTIM4BCfg); //端口CHB配置
    34. Adt_SetDTUA(enAdt, 0x6666);
    35. Adt_SetDTDA(enAdt, 0x6666);
    36. Adt_ConfigDT(enAdt, TRUE, TRUE);
    37. Adt_ConfigIrq(enAdt, AdtUDFIrq, TRUE, Adt4UnderFullCalllback); //下溢中断配置
    38. Adt_StartCount(enAdt);

     这个pwm波形很有意思,有示波器的可以看一下。

    总之,这个定时器功能非常强大,可以做很多事情。建议把所有功能都了解一下,即使不用也要知道能做什么。

  • 相关阅读:
    配置接口策略路由
    解决APP抓包问题【网络安全】
    vue、vuex状态管理
    django框架ModelForm组件用法详解
    SpringCloud全系列知识(2)—— Nacos配置和集群
    ArcGIS栅格数据矢量化(获取投影一致的shp边界)
    JVM学习第一天
    Unity 之 Invoke 与InvokeRepeting 函数控制定时调用
    【通用设计方法】之接收异常保护
    部分背包问题【贪心算法】
  • 原文地址:https://blog.csdn.net/andylauren/article/details/126241166