9.1.3.6 PWM输入模式
该模式是输入捕获模式的一个特例,除下列区别外,操作与输入捕获模式相同:
- 两个ICx信号被映射至同一个TIx输入。
- 这2个ICx信号为边沿有效,但是极性相反。
- 其中一个TIxFP信号被作为触发输入信号,而从模式控制器被配置成复位模式。
例 如 , 你 需 要 测 量 输 入 到 TI1上 的 PWM信 号 的 长 度 ( TMRx_CC1寄 存 器 ) 和 占 空 比(TMRx_CC2寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值)。
-
选择TMRx_CC1的有效输入:置TMRx_CCM1寄存器的C1SEL=01(选择TI1)。
-
选择TI1FP1的有效极性 (用来捕获数据到TMRx_CC1中和清除计数器) : 置C1P=0
(上升沿有效)。 -
选择TMRx_CC2的有效输入:置TMRx_CCM1寄存器的C2SEL=10(选择TI1)。
-
选择TI1FP2的有效极性(捕获数据到TMRx_CC2):置C2P=1(下降沿有效)。
-
选择有效的触发输入信号: 置TMRx_SMC寄存器中的TRGSEL=101 (选择TI1FP1)
-
配置从模式控制器为复位模式:置TMRx_SMC中的SMSEL=100。
-
使能捕获:置TMRx_CCE寄存器中C1EN=1且C2EN=1。
/********************************************************************************
* @file bsp_pwm.c
* @author jianqiang.xue
* @version V1.0.0
* @date 2022-02-15
* @brief NULL
********************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "RTE_Components.h"
#include CMSIS_device_header
#include "bsp_gpio.h"
#include "bsp_tim.h"
#include "bsp_pwm.h"
/* Private Includes ----------------------------------------------------------*/
#include "business_gpio.h"
#include "business_function.h"
/* Private Variables ---------------------------------------------------------*/
static bool g_pwm_init = false;
#if BS_TIM1_EN
extern TMR_TimerBaseInitType tim1_handle_t;
extern TMR_OCInitType tim1_oc_init_handle_t;
#endif
/* Public function prototypes -----------------------------------------------*/
/**
* @brief PWN功能初始化,使用定时器来模拟PWM功能
*/
void bsp_pwm_init(void)
{
if (g_pwm_init)
{
return;
}
#if BS_TIM1_EN
bsp_tim_pwm_init();
g_pwm_init = true;
#endif
}
/**
* @brief PWN功能关闭
*/
void bsp_pwm_deinit(void)
{
if (!g_pwm_init)
{
return;
}
#if BS_TIM1_EN
bsp_tim_pwm_deinit();
g_pwm_init = false;
#endif
}
/**
* @brief 设置PWM占空比
* @param pwmx: PWM组号
* @param val: 0-100 PWM值
*/
void bsp_pwm_set_pulse(bsp_pwm_t pwmx, uint16_t val)
{
if (!g_pwm_init)
{
return;
}
if (pwmx == BSP_PWM_0)
{
#if BS_TIM1_EN && BS_PWM0_EN
TMR_SetCompare1(TMR1, val);
#endif
}
else if (pwmx == BSP_PWM_1)
{
#if BS_TIM1_EN && BS_PWM1_EN
TMR_SetCompare2(TMR1, val);
#endif
}
else if (pwmx == BSP_PWM_2)
{
#if BS_TIM1_EN && BS_PWM2_EN
TMR_SetCompare3(TMR1, val);
#endif
}
else if (pwmx == BSP_PWM_3)
{
#if BS_TIM1_EN && BS_PWM3_EN
TMR_SetCompare4(TMR1, val);
#endif
}
}
/********************************************************************************
* @file bsp_pwm.h
* @author jianqiang.xue
* @version V1.0.0
* @date 2021-04-18
* @brief NULL
********************************************************************************/
#ifndef __BSP_PWM_H
#define __BSP_PWM_H
/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
/* Public enum ---------------------------------------------------------------*/
typedef enum
{
BSP_PWM_0 = 0,
BSP_PWM_1,
BSP_PWM_2,
BSP_PWM_3,
BSP_PWM_4,
BSP_PWM_5,
BSP_PWM_6,
BSP_PWM_7,
BSP_PWM_8,
BSP_PWM_9,
BSP_PWM_10,
BSP_PWM_11
} bsp_pwm_t;
/* Public Function Prototypes ------------------------------------------------*/
void bsp_pwm_init(void);
void bsp_pwm_deinit(void);
void bsp_pwm_set_pulse(bsp_pwm_t pwmx, uint16_t val);
#endif