使用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;
}
}
|