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

发布者:bonbono最新更新时间:2022-09-06 来源: csdn关键字:nrf51822  nrf51422  PWM配置 手机看文章 扫描二维码
随时随地手机看文章

NRF51系列的PWM是由TIM+PPI+GPIO组成的,下面依次介绍:


Programmable Peripheral Interconnect (PPI)

The Programmable Peripheral Interconnect (PPI) enables peripherals to interact autonomously with each other using tasks and events independent of the CPU. The PPI allows precise synchronization between peripherals when real-time application constraints exist and eliminates the need for CPU activity to implement behavior which can be predefined using PPI.


可编程外设互连(PPI)使外设能够使用独立于CPU的任务和事件相互自主交互。 当存在实时应用限制时,PPI允许外设之间的精确同步,并消除了CPU活动实现行为的需要,这些行为可以使用PPI预定义。


The PPI system has in addition to the fully programmable peripheral interconnections, a set of channels where the event (EEP) and task (TEP) endpoints are set in hardware. These fixed channels can be individually enabled, disabled, or added to PPI channel groups in the same way as ordinary PPI channels. See the nRF51 Series Reference Manual for more information.


除了完全可编程的外设互连外,PPI系统还有一组通道,事件(EEP)和任务(TEP)端点在硬件中设置。 这些固定通道可以像普通PPI通道一样单独启用、禁用或添加到PPI通道组。


Timer/counters (TIMER)

The timer/counter runs on the high-frequency clock source (HFCLK) and includes a 4 bit (1/2X) prescaler that can divide the HFCLK.


The TIMER will start requesting the 1 MHz mode of the HFCLK for values of the prescaler that gives fTIMER less or equal to 1 MHz. If the timer module is the only one requesting the HFCLK, the system will automatically switch to using the 1 MHz mode resulting in a decrease in the current consumption. See the parameters I1v2XO16,1M, I1v2XO32,1M, I1v2RC16,1M in Table 32 on page 48 and ITIMER0/1/2,1M in Table 52 on page 62.


The task/event and interrupt features make it possible to use the PPI system for timing and counting tasks between any system peripheral including any GPIO of the device. The PPI system also enables the TIMER task/event features to generate periodic output and PWM signals to any GPIO. The number of input/outputs used at the same time is limited by the number of GPIOTE channels.


定时器/计数器运行在高频时钟源(HFCLK)上,包括一个4位(1/2X)预分器,可以分割HFCLK。


TIMER将开始请求HFCLK的1 MHz模式,以获取使fTIMER小于或等于1 MHz的预分频器的值。 如果定时器模块是唯一一个请求HFCLK的模块,系统将自动切换到使用1 MHz模式,导致当前消耗减少。 参见第48页表32中的I1v2XO16,1M, I1v2XO32,1M, I1v2RC16,1M和第62页表52中的ITIMER0/1/2,1M参数。


任务/事件和中断特性使PPI系统能够在任何系统外设(包括设备的任何GPIO)之间对任务进行计时和计数。 PPI系统还使TIMER任务/事件功能产生周期性输出和PWM信号到任何GPIO。 同时使用的输入/输出数量受GPIOTE通道数量的限制。

image.png

TIMER0不推荐当PWM使用,因为ble协议栈中使用了。

[nrf52] low_power_pwm pwm_library pwm_driver 三者区别


/********************************************************************************

* @file    bsp_pwm.c

* @author  jianqiang.xue

* @version V1.0.0

* @date    2021-08-10

* @brief   参考:https://blog.csdn.net/zhi_Alanwu/article/details/102972721

********************************************************************************/


/* Includes ------------------------------------------------------------------*/

#include

#include


#include "RTE_Components.h"

#include CMSIS_device_header

#include "app_pwm.h"

#include "bsp_gpio.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

// Create the instance "PWM1" using TIMER1.

APP_PWM_INSTANCE(PWM1, 1);

/* 2-channel PWM*/

static app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_2CH(BS_TIM1_PRESCALER, BS_TIM1_CH1_PIN, BS_TIM1_CH2_PIN);

#endif


#if BS_TIM2_EN

// Create the instance "PWM2" using TIMER2.

APP_PWM_INSTANCE(PWM2, 2);

/* 2-channel PWM*/

static app_pwm_config_t pwm2_cfg = APP_PWM_DEFAULT_CONFIG_2CH(BS_TIM2_PRESCALER, BS_TIM2_CH1_PIN, BS_TIM2_CH2_PIN);

#endif


/* Public Function Prototypes -----------------------------------------------*/

/**

 * @brief  PWN功能初始化,使用定时器和ppi来模拟PWM功能

 * @note   NULL

 * @retval None

 */

void bsp_pwm_init(void)

{

    if (g_pwm_init)

    {

        return;

    }


#if BS_TIM1_EN

    pwm1_cfg.pin_polarity[0] = (app_pwm_polarity_t)BS_TIM1_LEVEL_LOGIC;

    pwm1_cfg.pin_polarity[1] = (app_pwm_polarity_t)BS_TIM1_LEVEL_LOGIC;

    /* Initialize and enable PWM. */

    APP_ERROR_CHECK(app_pwm_init(&PWM1, &pwm1_cfg, NULL));

    app_pwm_enable(&PWM1);

    g_pwm_init = true;

#endif


#if BS_TIM2_EN

    pwm2_cfg.pin_polarity[0] = (app_pwm_polarity_t)BS_TIM2_LEVEL_LOGIC;

    pwm2_cfg.pin_polarity[1] = (app_pwm_polarity_t)BS_TIM2_LEVEL_LOGIC;

    /* Initialize and enable PWM. */

    APP_ERROR_CHECK(app_pwm_init(&PWM2, &pwm2_cfg, NULL));

    app_pwm_enable(&PWM2);

    g_pwm_init = true;

#endif

}


/**

 * @brief  PWN功能关闭

 * @note   NULL

 * @retval None

 */

void bsp_pwm_deinit(void)

{

    if (!g_pwm_init)

    {

        return;

    }

#if BS_TIM1_EN

    app_pwm_disable(&PWM1);

    app_pwm_uninit(&PWM1);

    g_pwm_init = false;

#endif

#if BS_TIM2_EN

    app_pwm_disable(&PWM2);

    app_pwm_uninit(&PWM2);

    g_pwm_init = false;

#endif

}


/**

 * @brief  设置PWM占空比

 * @note   NULL

 * @param  pwmx: PWM组号

 * @param  val: 0-100 PWM值

 * @retval None

 */

void bsp_pwm_set_pulse(bsp_pwm_t pwmx, uint16_t val)

{

#if BS_TIM1_EN || BS_TIM2_EN

    if (!g_pwm_init)

    {

        return;

    }

#endif

    if (pwmx == BSP_PWM_0)

    {

#if BS_TIM1_EN && BS_PWM0_EN

        app_pwm_channel_duty_set(&PWM1, 0, val);

#endif

    }

    else if (pwmx == BSP_PWM_1)

    {

#if BS_TIM1_EN && BS_PWM1_EN

        app_pwm_channel_duty_set(&PWM1, 1, val);

#endif

    }

    else if (pwmx == BSP_PWM_2)

    {

#if BS_TIM2_EN && BS_PWM2_EN

        app_pwm_channel_duty_set(&PWM2, 0, val);

#endif

    }

    else if (pwmx == BSP_PWM_3)

    {

#if BS_TIM2_EN && BS_PWM3_EN

        app_pwm_channel_duty_set(&PWM2, 1, 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


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

关键字:nrf51822  nrf51422  PWM配置 引用地址:[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_pwm] PWM配置和使用

上一篇:[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_led] LED配置和使用
下一篇:[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_adc] ADC配置和使用

推荐阅读最新更新时间:2024-11-12 01:24

STM32CubeIDE下配置STM32F103输出带死区的互补PWM
STM32F103的TIM1和TIM8是高级定时器,可以产生嵌入死区时间的互补PWM波,使用STM32CubeIDE完成相关配置,可以直接生成代码,输出带死区的PWM波。 根据项目需要,单片机需输出频率为36kHz,占空比50%,死区时间500ns的互补PWM波,下面使用STM32CubeIDE完成相关配置。 1、选择时钟源,这里选择外部石英晶体作为HSE时钟源 2、配置系统时钟为72MHz,高级定时器TIM1和TIM8时钟由APB2提供,这里APB2等于系统时钟72MHz 3、这里使用TIM1来产生互补PWM波,TIM1复用功能如下表所示: 我们使用单片机的PA7和PA8引脚作为PWM互补输出的两个通道,在S
[单片机]
STM32CubeIDE下<font color='red'>配置</font>STM32F103输出带死区的互补<font color='red'>PWM</font>波
STM8L151系列单片机PWM配置时注意事项
使用STM8开发环境:IAR for STM8 用TIM1_CH3输出PWM波,输出引脚是PD5 使用的单片机STM8L151 对于STM8L,默认时钟源是关闭的,需要先打开才能配置寄存器 void Time1_Init(void) { CLK_PeripheralClockConfig(CLK_Peripheral_TIM1,ENABLE);//开启TIM1时钟 TIM1_DeInit(); TIM1_TimeBaseInit(1599,TIM1_CounterMode_Up,2000,0); //分频1600,向上计数,TIM1_ARR=20000,重复计数器为0 TIM1_OC3Init(TIM1_OCM
[单片机]
STM32 TIM1 F1 四通道完全重映射PWM 配置
void TIM1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph
[单片机]
[bsp][nrf52832][nrf52840][nrf52810][nrf52820][bsp_gpio] GPIO配置和使用
GPIO — General purpose input/output 通用输入/输出(GPIO)组织为一个端口多达32个I/ o(依赖于包),允许通过一个端口访问和控制多达32个引脚。 每个GPIO可以单独访问 GPIO具有以下用户可配置的特性: 最大支持32 GPIO 8 GPIO与模拟通道,用于SAADC, COMP或LPCOMP输入 可配置的输出驱动器强度 内部上拉和下拉电阻 从所有引脚的高或低电平触发器唤醒 在任何引脚上的状态改变触发中断 所有引脚都可以被PPI任务/事件系统使用 可以通过PPI和GPIOTE通道控制一个或多个GPIO输出 所有引脚可以单独映射到接口块布局灵活性 在SENSE信号上捕获的GPIO状态变
[单片机]
[<font color='red'>bsp</font><font color='red'>层</font>][nrf52832][nrf52840][nrf52810][nrf52820][<font color='red'>bsp</font>_gpio] GPIO<font color='red'>配置</font>和使用
STM8S系列单片机TIM1的PWM配置与TIM2的区别
为什么STM8的PWM用TIM1不能输出,TIM2可以,下面针对TIM1的PWM输出做了下列程序代码的编写。 STM8S系列单片机 PC1管脚来控制PWM的输出,即TIM1_CH1通道 PC2管脚来控制PWM的输出,即TIM1_CH2通道 PC3管脚来控制PWM的输出,即TIM1_CH3通道 //PWM初始化 void Driver_PWMON(u8 ch,u8 Num) { //开TIM1时钟 CLK- PCKENR1 |= CLK_PCKENR1_TIM1; //设置PWM频率,Fpwm=Fmaster/TIM2_ARR //这里Fpwm = 2000000/100 = 20K
[单片机]
MSP-EXP430F5529LP开发板005-PWM库函数+时钟配置
从32转到MSP430最让我头大的就是它的时钟配置了,参考了一些网上的资料,看了几天终于大概了解了一点。 上面这6点是关键,在后面的时钟初始化时要参考。 本次实验目的是要实现P2.0口输出10kHz的PWM,这也是应用中电机控制的常用工作频率。要输出准确的频率,了解清楚各个时钟是非常必要的。 首先明确思路,430中有三个时钟:辅助时钟ACLK,频率较低,软件选作各个外围模块的时钟信号,一般用于低速外设;系统主时钟MCLK,频率较高,主要用于CPU和系统,类似于主频;子系统时钟SMCLK,主要用于高速外设模块。这里我们利用TIMER_A产生PWM,选择SMCLK作为模块的时钟源,因此SMCLK的设置就是关键。 Lau
[单片机]
MSP-EXP430F5529LP开发板005-<font color='red'>PWM</font>库函数+时钟<font color='red'>配置</font>
STM32F4PWM配置(一)
PWM配置 1.定义结构体 1.定义GPIO结构体 GPIO_InitTypeDef GPIO_InitStructure; 2.定义定时器结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 3.定时器输出比较结构体 TIM_OCInitTypeDef TIM_OCInitStructure; 2.开启时钟总线 1.定时器时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_定时器,ENABLE); 2.GPIO时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOX, ENABLE);
[单片机]
MCU快速编程框架
很多朋友在单片机编程时都会遇到单片机编程框架问题,以下是一个MCU快速编程框架示例代码。在这个基础框架上,可以很方便的添加模块,通过测试可以在Kiel, AVRGCC, MPLABC18, PICC18, PICC16, ElanC, HoltekC下直接编译。是一个非常实用的小插件。 H\app_GUI.h .\app_IR.h .\app_LedColor.h .\app_Motor.h .\app_Music.h .\app_RF.h .\drv_Adc.h .\drv_Buzzer.h .\drv_CPUIO.h .\drv_DS1302.h .\drv_DS18B20.h .\drv_Eeprom.
[单片机]
<font color='red'>MCU</font>快速编程<font color='red'>框架</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved