0
点赞
收藏
分享

微信扫一扫

[单片机框架][bsp层][AT32F415][bsp_pwm] PWM配置和使用


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。

[单片机框架][bsp层][AT32F415][bsp_pwm] PWM配置和使用_AT32F415

/********************************************************************************
* @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


举报

相关推荐

0 条评论