• NXP实战笔记(七):S32K3xx基于RTD-SDK在S32DS上配置ICU输入捕获


    目录

    1、概述

    2、输入捕获SDK配置

    2.1、SAIC中断方式

    2.2、IPWM或者IPM


    1、概述

            输入捕获,可以抓取高电平时间、低电平时间、占空比、周期、边沿检测与回调函数、边沿计数(ABZ解码)、时间戳、唤醒中断。

            记录一下根据Emios模块实现上述部分功能。

            适用于输入捕获功能的Emios有以下三种模式。

    SAIC:信号实时输入捕获

            从上图可以看出,SAIC仅仅关联了A寄存器,假设上升沿边沿检测,只能在上升沿时候抓取一个A的值,那么使用轮询的方式实现不了任何功能,在SDK包里面,通过中断或者DMA实现记录上次的值与本次的值,进行周期或者占空比的测量。

    只有在中断或者DMA的时候才会置位此标志位

    2、输入捕获SDK配置

    2.1、SAIC中断方式

            目的:捕获通道eMios0_23 引脚PTC13 边沿检测 “eMios0_23使用内部计数器方式,所以Emios_Icu模块无需再配置”

            Emios_Icu配置如下

    1、通道功能配置

    2、通道属性配置

            在使用中断的情况下,SAIC、IPWM、IPM都好使,功能属于全支持了。但是假设使用轮询,IPM仅仅测量周期,IPWM仅仅测量占空比,SAIC用于边沿计数,其他功能FAE说支持就要中断了。周期与占空比同时测量出来是不支持的了。

    中断配置,在ICU的中断里面配置之后无需再次在中断容器里面实现配置了。

    测试代码

    初始化

    1. /* Initialize Emios0 */
    2.     Emios_Mcl_Ip_Init(0U, &Emios_Mcl_Ip_0_Config_BOARD_INITPERIPHERALS);
    3. Emios_Icu_Ip_Init(0U, &eMios_Icu_Ip_0_Config_PB);
    4.   Emios_Icu_Ip_EnableEdgeDetection(0,23);
    5. /*中断初始化*/
    6.     IntCtrl_Ip_SetPriority(EMIOS0_0_IRQn,2);
    7.     IntCtrl_Ip_InstallHandler(EMIOS0_0_IRQn, &eMios0_23_EncoderC_Pulse, NULL_PTR);
    8.     IntCtrl_Ip_EnableIrq(EMIOS0_0_IRQn);
    9.     Emios_Icu_Ip_EnableInterrupt(0, 23);
    10. /*中断执行*/
    11. volatile uint32 eMios0_23_EncoderC_Pulsex = 0;
    12. static void eMios0_23_EncoderC_Pulse(void)
    13. {
    14. Emios_Icu_Ip_IrqHandler(0, 23);
    15. eMios0_23_EncoderC_Pulsex++;
    16. }

    测试结果,上升沿进中断,那么记录上升沿个数,发现可以完全对的上

    2.2、IPWM或者IPM

    目的:PTD10连接Emios1_10进行周期或脉冲宽度测量,轮询方式

    IPWM:输入脉冲宽度测量,可以是高电平也可以是低电平

            从上述两图中可以看出,IPWM与IPM均可以获取A与B的值,通过相减的方式实现了周期或者脉冲宽度测量。

    Emios_Icu配置,作为Count bus使用

    ICU配置如下

    代码实现

    1. /* Initialize Emios1 */
    2. Emios_Mcl_Ip_Init(1U, &Emios_Mcl_Ip_1_Config_BOARD_INITPERIPHERALS);
    3. Emios_Icu_Ip_StartSignalMeasurement(1,10);
    4. /*执行代码*/
    5. uint16 eMios1_10_EncoderA_Preiod(void)
    6. {
    7.     uint16 EncoderA_UCA         = IP_EMIOS_1->CH.UC[10].A;
    8.     uint16 EncoderA_UCB         = IP_EMIOS_1->CH.UC[10].B;
    9.     uint16 EncoderA_UCAReyurn   = 0;
    10.     if(EncoderA_UCA >= EncoderA_UCB)
    11.     {
    12.         EncoderA_UCAReyurn = (EncoderA_UCA - EncoderA_UCB);
    13.     }
    14.     else
    15.     {
    16.         EncoderA_UCAReyurn = (EncoderA_UCA - EncoderA_UCB + 0xFFFF);
    17.     }
    18.     EncoderA_UCAReyurn = (uint16)(50000/EncoderA_UCAReyurn) + 1;
    19.     return EncoderA_UCAReyurn;
    20. }

    测试结果

    IPWM的实现方式是一样的。

  • 相关阅读:
    Kubernetes之舞:微服务的交响乐团
    上海亚商投顾:三大指数小幅下跌 两市成交金额创年内新低
    一文带你实现从PDF到Word文件的相互转换
    移动办公管理系统低代码解决方案
    20+ 波卡生态项目齐聚 TOKEN2049,参会指南请收好
    【计网 DNS】计算机网络 DNS协议详解:中科大郑烇老师笔记 (六)
    【方案】TSINGSEE青犀防溺水AI算法在水域智能监管与风险预警场景中的应用
    Kubernetes(k8s) Web-UI界面(一):部署和访问仪表板(Dashboard)
    【计算机网络】第一章 概述
    计算机网络-计算机网络体系结构-网络层
  • 原文地址:https://blog.csdn.net/weixin_43580890/article/details/136138842