PWM输入捕获模式用于捕获pwm周期及占空比。

仅可使用TCPWM作为外部资源。

MCAL 配置

Port配置

Icu配置

注意:当IcuDefaultStartEdge配置为ICU_RISING_EDGE时ActiveTime​​是高电平持续时间,反之则为低电平持续时间。

配置中断

对于有Os的系统是在Os中配置,本篇不介绍。

对于没有Os的系统,可使用Cypress官方提供的SDL库实现,以下是实现代码:

#define MCAL_PROJECT_CB_BUTTON_ICU_IRQ_NUMBER           277
#define MCAL_PROJECT_CB_BUTTON_ICU_IRQ_HANDLER          Icu_Isr_Vector_277_Cat2
//开中断
Cy_SysInt_SetSystemIrqVector((cy_en_intr_t)MCAL_PROJECT_CB_BUTTON_ICU_IRQ_NUMBER,        MCAL_PROJECT_CB_BUTTON_ICU_IRQ_HANDLER);
Cy_SysInt_InitIRQ( &(cy_stc_sysint_irq_t) { .sysIntSrc = (cy_en_intr_t)MCAL_PROJECT_CB_BUTTON_ICU_IRQ_NUMBER, .intIdx = CPUIntIdx3_IRQn, .isEnabled = true } );
NVIC_EnableIRQ(CPUIntIdx3_IRQn);

代码

初始化

Icu_StartSignalMeasurement(IcuConf_IcuChannel_Air_sensor_IN);

循环调用获取捕获结果:

Icu_DutyCycleType icu_Air_sensor_IN;
Icu_GetDutyCycleValues(IcuConf_IcuChannel_Air_sensor_IN, &icu_Air_sensor_IN);

这里使用Icu_GetDutyCycleValues​获取周期时间及高电平持续时间。

extern FUNC(void, ICU_CODE) Icu_GetDutyCycleValues
(
  VAR(Icu_ChannelType, AUTOMATIC)                    Channel,
  P2VAR(Icu_DutyCycleType, AUTOMATIC, ICU_APPL_DATA) DutyCycleValues
);

捕获结果存储在icu_Air_sensor_IN结构体中,包括ActiveTime和PeriodTime值,其中:

  • PeriodTime即需要的周期值计数值,通过定时器频率换算可得到周期时间。

  • ActiveTime则为高电平持续计数值。

据此可计算占空比:

duty = icu_Air_sensor_IN.ActiveTime*100/icu_Air_sensor_IN.PeriodTime;