21ic问答首页 - HC32L176JETA Pcnt模块
HC32L176JETA Pcnt模块
使用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;
}
}
下图是所使用的例程
}
/**
******************************************************************************
** \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
你可以把你的问题和需要实现的内容(包括参数)详细地写入deepseek,会给出不一样的答案
评论
2025-05-12
赞0
谢谢你的回复,但是我使用的库函数和AI生成的不同,配置参数也不同。
评论
2025-05-12
赞0
#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);
}
}
评论
2025-05-12
赞0
评论
2025-05-12
您需要登录后才可以回复 登录 | 注册