标题可编程计数阵列PCA
PCA(可编程计数器阵列 Programmable Counter Array)支持最多 5 个 16 位的捕获/比较
模块。该定时/计数器可用作为一个通用的时钟计数/事件计数器的捕获/比较功能。PCA
的每个模块都可以进行独立编程,以提供输入捕捉,输出比较或脉冲宽度调制。另外
模块 4 有额外的看门狗定时器模式。
16 位重载 位重载 计数模式即PWM模式
计数器计数到与寄存器 CARR 的值相同时溢出后计数器的值变为 0,继续开始向上计
数,可用于 PCA 捕获模式,16 位 PWM 模式。
设置流程
- 设置 PCA_EPWM 的 EPMW 为 1
- 设置 PCA_CARR 设置计数周期值
- 设置 PCA_CMOD.CPS 选择计数时钟
- 根据需要设置 PCA_CMOD.CFIE 设置计数溢出中断使能
- 时钟 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了,祝你好运!!!