打印

HC32L176JETA Pcnt模块

[复制链接]
161|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
卡卡mh|  楼主 | 2025-5-12 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用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;
            
    }
}



使用特权

评论回复
沙发
卡卡mh|  楼主 | 2025-5-12 11:14 | 只看该作者
有大佬用过非正交计数模式吗,可不可以发我一份程序。3135730977@qq.com

使用特权

评论回复
板凳
dffzh| | 2025-5-12 13:11 | 只看该作者
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);
    }
}

使用特权

评论回复
地板
卡卡mh|  楼主 | 2025-5-12 13:37 | 只看该作者
dffzh 发表于 2025-5-12 13:11
AI生成的,不知道有木有用?供你参考
#include "hc32l176.h"
#include "gpio.h"

谢谢你的回复,但是我使用的库函数和AI生成的不同,配置参数也不同。

使用特权

评论回复
5
dffzh| | 2025-5-12 13:54 | 只看该作者
卡卡mh 发表于 2025-5-12 13:37
谢谢你的回复,但是我使用的库函数和AI生成的不同,配置参数也不同。

你可以把你的问题和需要实现的内容(包括参数)详细地写入deepseek,会给出不一样的答案

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝