问答

汇集网友智慧,解决技术难题

21ic问答首页 - HC32L176JETA Pcnt模块

单片机 国产芯片 嵌入式 技术交流 模块 L17

HC32L176JETA Pcnt模块

卡卡mh2025-05-12
使用PCNT模块给霍尔传感器脉冲计数时,采用官方例程单脉冲计数可用,双通道非交脉冲计数模式时,g_u32CircleCount=Pcnt_GetCnt();使用该函数观测计数值无变化。
下图是所使用的例程
}
/**
******************************************************************************
** \brief  初始化外部GPIO引脚
**
** \return
******************************************************************************/
static void App_GpioInit(void)
{
    stc_gpio_cfg_t GpioInitStruct;
    DDL_ZERO_STRUCT(GpioInitStruct);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
   
    GpioInitStruct.enDrv = GpioDrvH;
    GpioInitStruct.enDir = GpioDirIn;
    Gpio_Init(GpioPortB,GpioPin5,&GpioInitStruct);
    Gpio_SetAfMode(GpioPortB,GpioPin5,GpioAf6);              //PB05作为PCNT_S0
    Gpio_Init(GpioPortB,GpioPin7,&GpioInitStruct);
    Gpio_SetAfMode(GpioPortB,GpioPin7,GpioAf7);              //PB07作为PCNT_S1
   
    // GpioInitStruct.enDir = GpioDirOut;
    // Gpio_Init(STK_LED_PORT, STK_LED_PIN, &GpioInitStruct);   //PD14配置成输出,控制板上蓝色LED
    // Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN, TRUE);   
}

/**
******************************************************************************
** \brief  配置PCNT
**
** \return
******************************************************************************/
static void App_PcntInit(void)
{
    stc_pcnt_initstruct_t PcntInitStruct;
    DDL_ZERO_STRUCT(PcntInitStruct);

    Sysctrl_SetPeripheralGate(SysctrlPeripheralPcnt, TRUE);
   
    PcntInitStruct.Pcnt_S0Sel = PcntS0PNoinvert;  //S0输入极性不取反
    PcntInitStruct.Pcnt_S1Sel = PcntS1PNoinvert;  //S1输入极性不取反
    PcntInitStruct.Pcnt_Clk   = PcntCLKPclk;      //采样时钟
    PcntInitStruct.Pcnt_Mode  = PcntSpecialMode;   //双通道正交脉冲计数模式
    PcntInitStruct.Pcnt_FltEn = TRUE;          //滤波使能
    PcntInitStruct.Pcnt_DebTop = 5;            //滤波计数器阈值
    PcntInitStruct.Pcnt_ClkDiv = 5;            //滤波时钟分频系数
    PcntInitStruct.Pcnt_TocrEn = TRUE;         //超时控制使能
    PcntInitStruct.Pcnt_TocrTh = 2000;           //超时阈值
    PcntInitStruct.Pcnt_Dir    = PcntDirUp;   //增模式
    Pcnt_Init(&PcntInitStruct);

    Pcnt_SetB2C(100);                                    //计数溢出值100
    Pcnt_ClrItStatus(PcntOV);                           //清除PCNT溢出中断
    Pcnt_ItCfg(PcntOV, TRUE);                        //使能溢出中断
    EnableNvic(PCNT_IRQn, IrqLevel3, TRUE);              //使能中断向量
   
}

void Pcnt_IRQHandler(void)
{
    if(Pcnt_GetItStatus(PcntOV) == TRUE)
    {
        Pcnt_ClrItStatus(PcntOV);
        g_u32CircleCount4=1;
            
    }
}



回答 +关注 0
530人浏览 4人回答问题 分享 举报
4 个回答
  • 卡卡mh 发表于 2025-5-12 13:37
    谢谢你的回复,但是我使用的库函数和AI生成的不同,配置参数也不同。

    你可以把你的问题和需要实现的内容(包括参数)详细地写入deepseek,会给出不一样的答案
  • dffzh 发表于 2025-5-12 13:11
    AI生成的,不知道有木有用?供你参考
    #include "hc32l176.h"
    #include "gpio.h"

    谢谢你的回复,但是我使用的库函数和AI生成的不同,配置参数也不同。
  • AI生成的,不知道有木有用?供你参考
    #include "hc32l176.h"
    #include "gpio.h"
    #include "pcnt.h"

    /* PCNT模塊初始化函數 */
    void PCNT_DualChannel_Init(void)
    {
        stc_pcnt_init_t stcPcntInit;

        /* 配置PCNT單元1和單元2為雙通道非交模式 */

        /* 1. 配置PCNT時鐘 */
        PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_PCNT, Enable);

        /* 2. 初始化PCNT結構體參數 */
        PCNT_StructInit(&stcPcntInit);

        /* 3. 配置PCNT單元1 */
        stcPcntInit.u16Mode = PCNT_MODE_DUAL_PHASE_NON_QUAD; // 雙通道非交模式
        stcPcntInit.u16PositiveInput = PCNT_INPUT_P00;       // 正輸入通道(P00)
        stcPcntInit.u16NegativeInput = PCNT_INPUT_P01;       // 負輸入通道(P01)
        stcPcntInit.u16CountEdge = PCNT_COUNT_EDGE_RISING;   // 上升沿計數
        stcPcntInit.u16CountMode = PCNT_COUNT_MODE_SAWTOOTH; // 鋸齒波模式(0-0xFFFF)
        stcPcntInit.u16Filter = PCNT_FILTER_DISABLE;         // 濾波器禁用
        PCNT_Init(PCNT_UNIT1, &stcPcntInit);

        /* 4. 配置PCNT單元2 (如果需要第二個獨立的計數器) */
        // stcPcntInit.u16PositiveInput = PCNT_INPUT_P02;     // 正輸入通道(P02)
        // stcPcntInit.u16NegativeInput = PCNT_INPUT_P03;     // 負輸入通道(P03)
        // PCNT_Init(PCNT_UNIT2, &stcPcntInit);

        /* 5. 使能PCNT單元1 */
        PCNT_Cmd(PCNT_UNIT1, Enable);

        /* 6. 配置GPIO為PCNT功能 */
        GPIO_SetFunc(P00, GPIO_FUNC_7_PCNT1_P);  // P00作為PCNT1正輸入
        GPIO_SetFunc(P01, GPIO_FUNC_7_PCNT1_N);  // P01作為PCNT1負輸入
    }

    /* 獲取PCNT計數值函數 */
    uint16_t PCNT_GetCountValue(void)
    {
        return PCNT_GetCountValue(PCNT_UNIT1);
    }

    /* 重置PCNT計數器函數 */
    void PCNT_ResetCounter(void)
    {
        PCNT_SetCountValue(PCNT_UNIT1, 0);
    }

    /* 主函數示例 */
    int main(void)
    {
        uint16_t u16CountValue = 0;

        /* 硬件初始化 */
        BSP_CLK_Init();
        BSP_GPIO_Init();
        PCNT_DualChannel_Init();

        /* 主循環 */
        while(1)
        {
            /* 讀取計數值 */
            u16CountValue = PCNT_GetCountValue();

            /* 根據需要處理計數值 */
            // ...

            /* 定時重置計數器 (可選) */
            // PCNT_ResetCounter();

            /* 延時 */
            DDL_DelayMS(100);
        }
    }

  • 有大佬用过非正交计数模式吗,可不可以发我一份程序。3135730977@qq.com

您需要登录后才可以回复 登录 | 注册