打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

posted on 2022-08-13 11:00  xuejianqiang  阅读(73)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033