打印
[技术问答]

HC32F005 PCA 不同的通道分别实现脉宽采集和PWM输出的问题

[复制链接]
1255|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
loony85|  楼主 | 2022-3-17 11:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);  
}

使用特权

评论回复
沙发
martinhu| | 2022-3-17 14:15 | 只看该作者
PCA虽然有5个通道,但是只有1个计数器CNT,时钟也只能选一种了
楼主可以尝试一下ADT高级定时器

使用特权

评论回复
板凳
liaotian001| | 2022-3-17 14:29 | 只看该作者
HC32F005 就开放一个PCA,没有PCA0,PCA1

使用特权

评论回复
地板
loony85|  楼主 | 2022-3-17 16:33 | 只看该作者
martinhu 发表于 2022-3-17 14:15
PCA虽然有5个通道,但是只有1个计数器CNT,时钟也只能选一种了
楼主可以尝试一下ADT高级定时器 ...

谢谢

使用特权

评论回复
5
loony85|  楼主 | 2022-3-17 16:33 | 只看该作者
liaotian001 发表于 2022-3-17 14:29
HC32F005 就开放一个PCA,没有PCA0,PCA1

我表述的问题,实际指的2个通道。谢谢

使用特权

评论回复
6
tpgf| | 2022-4-3 16:21 | 只看该作者
不正常的表现是什么呢

使用特权

评论回复
7
aoyi| | 2022-4-3 16:27 | 只看该作者
它只有一个计数器

使用特权

评论回复
8
nawu| | 2022-4-3 16:36 | 只看该作者
只能实现一个

使用特权

评论回复
9
zljiu| | 2022-4-3 16:44 | 只看该作者
楼主使用的很丰富啊

使用特权

评论回复
10
tfqi| | 2022-4-3 16:52 | 只看该作者
估计产生干扰了呢

使用特权

评论回复
11
gwsan| | 2022-4-3 17:00 | 只看该作者
引脚都是不相同的 吧

使用特权

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

本版积分规则

3

主题

20

帖子

1

粉丝