本帖最后由 loony85 于 2022-3-17 16:32 编辑
使用PCA遇到了一个奇怪的问题,看手册上说PCA的每组模块都可以独立的工作捕获模式、比较模式。
所以设计了一个方案,使用PCA_CH0的捕获模式实现脉冲计数,使用PCA_CH1的比较模式,实现PWM脉宽调制输出。
实际调试发现2个问题。
1,PCA0的时钟源使用Timer1的溢出频率,PCA1使用PCLK/32。此时发现这两个 模块哪个后配置,PCA的实际工作频率就是哪个的。
2,捕获模式设置的下降沿触发,当进入中断函数时,PWM输出就不正常了,没有中断的时候PWM输出正常。
不知道哪里出问题了,还是不能这么配置。请高人指点!
代码如下:
/*******************************************************************************
* BT定时功能测试 (重载模式)
******************************************************************************/
static void App_BtTimerInit(void)
{
stc_bt_cfg_t stcCfg;
en_result_t enResult = Error;
uint16_t u16ArrData = 10; //时钟频率1Mhz 定时器1周期10us 100Khz
//打开BT外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralBt, TRUE);
stcCfg.enGateP = BtPositive;
stcCfg.enGate = BtGateDisable;
stcCfg.enPRS = BtPCLKDiv8; //pclk/8 1Mhz
stcCfg.enTog = BtTogDisable;
stcCfg.enCT = BtTimer;
stcCfg.enMD = BtMode2;
//Bt初始化
if (Ok != Bt_Init(TIM1, &stcCfg))
{
enResult = Error;
}
//设置重载值和计数值,启动计数
Bt_ARRSet(TIM1, 65535 - u16ArrData);
Bt_Cnt16Set(TIM1, u16ArrData);
Bt_Run(TIM1);
}
/**
******************************************************************************
** \brief PCA中断入口函数
**
** @param 无
** \retval 无
**
******************************************************************************/
void Pca_IRQHandler(void)
{
static uint8_t start = 0;
if(Pca_GetItStatus(PcaCcf0) != FALSE)
{
pca_count0 = Pca_GetCcap(PcaModule0);
Pca_ClrItStatus(PcaCcf0);
if(pca_count0 > 0)
{
frequence = (float)PCA_CLK / pca_count0;
Pca_SetCcap(PcaModule1,0);
}
}
}
/**
******************************************************************************
** \brief 配置PCA
**
** \return 无
******************************************************************************/
static void App_PcaInit(void)
{
stc_pcacfg_t PcaInitStruct;
//使能PCA外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralPca, TRUE);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
//PCA输入捕获配置
PcaInitStruct.pca_clksrc = PcaTim1ovf; //PCA时钟源 100kHZ
PcaInitStruct.pca_cidl = FALSE;
PcaInitStruct.pca_ecom = PcaEcomDisable; //禁止比较器功能
PcaInitStruct.pca_capp = PcaCappDisable; //使能上升沿捕获
PcaInitStruct.pca_capn = PcaCapnEnable; //禁止下降沿捕获
PcaInitStruct.pca_mat = PcaMatDisable; //禁止匹配功能
PcaInitStruct.pca_tog = PcaTogDisable; //禁止翻转控制功能
PcaInitStruct.pca_pwm = PcaPwm8bitDisable; //使能PWM控制输出
PcaInitStruct.pca_ccap = 0xFFFF;
Pca_M0Init(&PcaInitStruct); //P23->PCA_CH0
Pca_ClrItStatus(PcaCcf0);
Pca_ClrItStatus(PcaCf);
EnableNvic(PCA_IRQn, IrqLevel2, TRUE);
Pca_ConfModulexIt(PcaModule0, TRUE);
Pca_ConfPcaIt(TRUE);
//PCA PWM模块配置
PcaInitStruct.pca_clksrc = PcaPclkdiv32; //PCL/32 250Khz
PcaInitStruct.pca_cidl = FALSE;
PcaInitStruct.pca_ecom = PcaEcomEnable; //允许比较器功能
PcaInitStruct.pca_capp = PcaCappDisable; //禁止上升沿捕获
PcaInitStruct.pca_capn = PcaCapnDisable; //禁止下降沿捕获
PcaInitStruct.pca_mat = PcaMatDisable; //禁止匹配功能
PcaInitStruct.pca_tog = PcaTogDisable; //禁止翻转控制功能
PcaInitStruct.pca_pwm = PcaPwm8bitEnable; //使能PWM控制输出
PcaInitStruct.pca_ccapl = 100;
PcaInitStruct.pca_ccaph = 100;
Pca_M1Init(&PcaInitStruct); //P24 <--> PCA_CH1
///< PCA 运行
Pca_StartPca(TRUE);
}
///< PCA 通道端口初始化
static void App_PcaPortInit(void)
{
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //端口外设时钟使能
stcGpioCfg.enDir = GpioDirIn;
//P23 设置为捕获输入 PCA_CH0
Gpio_Init(GpioPort2, GpioPin3, &stcGpioCfg);
Gpio_SetAfMode(GpioPort2,GpioPin3,GpioAf4);
//P24 设置为PWM输出 PCA_CH1
stcGpioCfg.enDrv = GpioDrvH;
stcGpioCfg.enDir = GpioDirOut;
//PWM信号输出引脚配置
Gpio_Init(GpioPort2, GpioPin4, &stcGpioCfg);
Gpio_SetAfMode(GpioPort2, GpioPin4, GpioAf4);
}
|