华大单片机HC32L130/HC32L136PWM配置

标题可编程计数阵列PCA

PCA(可编程计数器阵列 Programmable Counter Array)支持最多 5 个 16 位的捕获/比较
模块。该定时/计数器可用作为一个通用的时钟计数/事件计数器的捕获/比较功能。PCA
的每个模块都可以进行独立编程,以提供输入捕捉,输出比较或脉冲宽度调制。另外
模块 4 有额外的看门狗定时器模式。

16 位重载 位重载 计数模式即PWM模式

计数器计数到与寄存器 CARR 的值相同时溢出后计数器的值变为 0,继续开始向上计
数,可用于 PCA 捕获模式,16 位 PWM 模式。
设置流程

  1. 设置 PCA_EPWM 的 EPMW 为 1
  2. 设置 PCA_CARR 设置计数周期值
  3. 设置 PCA_CMOD.CPS 选择计数时钟
  4. 根据需要设置 PCA_CMOD.CFIE 设置计数溢出中断使能
  5. 时钟 PCA_CCON.CR 启动 PCA 计数器

PCA计数阵列PWM代码

void PCA_PWM_Config(void)
{
stc_pca_config_t        stcConfig;
 stc_pca_capmodconfig_t  stcModConfig;
 stc_gpio_cfg_t         stcPCA0Port;
 uint16_t                u16ArrData = 120;  //PWM周期相关
 uint16_t                u16CmpData = 60;   //PWM占空比相关
 DDL_ZERO_STRUCT(stcConfig);
 DDL_ZERO_STRUCT(stcModConfig);
 DDL_ZERO_STRUCT(stcPCA0Port);
 //PCA、GPIO外设时钟开启
 Sysctrl_SetPeripheralGate(SysctrlPeripheralPca, TRUE);
 Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
 //GPIO CFG
 //PA06设置为PCA_CH0
 //Gpio_ClrAnalogMode(GpioPortA, GpioPin6);
 stcPCA0Port.enDrv  = GpioDrvH;
 stcPCA0Port.enDir  = GpioDirOut;
 Gpio_Init(PIN_PWM_Tune, &stcPCA0Port);
 Gpio_SetAfMode(PIN_PWM_Tune, GpioAf2);
 stcConfig.enCIDL = IdleGoOn;                   //休眠模式PCA工作 
 stcConfig.enWDTE = PCAWDTDisable;              //wdt功能关闭
 stcConfig.enCPS  = PCAPCLKDiv2;                //PCLK/2
 stcConfig.pfnPcaCb = PcaInt;                   //中断函数入口
 stcModConfig.enECOM     = ECOMEnable;          //比较器功能允许
 stcModConfig.enCAPP     = CAPPDisable;         //上升沿捕获禁止
 stcModConfig.enCAPN     = CAPNDisable;         //下降沿捕获禁止
 stcModConfig.enMAT      = MATEnable;           //允许匹配
 stcModConfig.enTOG      = TOGEnable;           //允许翻转
 stcModConfig.en8bitPWM  = PCA8bitPWMDisable;   //禁止8位PWM功能
 Pca_Enable16bitPWM();                          //增强PWM功能使能
 if (Ok != Pca_Init(&stcConfig))
 {
//   return Error;
 }
 if (Ok != Pca_CapModConfig(Module0, &stcModConfig))
 {
//   return Error;
 }
 Pca_CARRSet(u16ArrData);                      //周期重载值设置
 Pca_CmpData16Set(Module0, u16CmpData);        //(比较值)比较捕获寄存器设置
 Pca_Run();
}

以上是pwm的GPIO配置跟PWM模式配置

/*******************************************************************************
 * Function implementation - global ('extern') and local ('static')
 ******************************************************************************/
/*******************************************************************************
 * Pca中断服务程序
 ******************************************************************************/
 static volatile uint32_t u32PcaTestFlag = 0;
void PcaInt(void)
{
if (TRUE == Pca_GetCntIntFlag())
    {
        Pca_ClearCntIntFlag();
        u32PcaTestFlag |= 0x20;
    }
    if (TRUE == Pca_GetIntFlag(Module0))
    {
        Pca_ClearIntFlag(Module0);
        u32PcaTestFlag |= 0x01;
    }
    if (TRUE == Pca_GetIntFlag(Module1))
    {
        Pca_ClearIntFlag(Module1);
        u32PcaTestFlag |= 0x02;
    }
    if (TRUE == Pca_GetIntFlag(Module2))
    {
        Pca_ClearIntFlag(Module2);
        u32PcaTestFlag |= 0x04;
    }
    if (TRUE == Pca_GetIntFlag(Module3))
    {
        Pca_ClearIntFlag(Module3);
        u32PcaTestFlag |= 0x08;
    }
    if (TRUE == Pca_GetIntFlag(Module4))
    {
        Pca_ClearIntFlag(Module4);
        u32PcaTestFlag |= 0x10;
    }
}

以上是中断函数清理标志位。
主函数里面初始化PCA_PWM_Config();
然后根据Pca_CmpData16Set(Module0, u16CmpData);更改占空比,然后就可以输出你想要的PWM了,祝你好运!!!

你可能感兴趣的:(华大单片机)