nRF52 PWM 使用
SDK15.2
1. nRF52 PWM 模块
2. 使能PWM模块
在sdk_config.h
文件使能PWM Module
#define NRFX_PWM_ENABLED 1
#define PWM_ENABLED 1
#define PWM0_ENABLED 1
#define NRFX_PWM0_ENABLED 0
总共支持4个PWM,分别是 PWM0, PWM1, PWM2, PWM3.
3. 实例化PWM
static nrf_drv_pwm_t m_pwm0 = NRF_DRV_PWM_INSTANCE(0);
4. 初始化PWM
nrf_drv_pwm_config_t const config0 ={.output_pins ={3 | NRF_DRV_PWM_PIN_INVERTED, // channel 0NRF_DRV_PWM_PIN_NOT_USED, // channel 1NRF_DRV_PWM_PIN_NOT_USED, // channel 2NRF_DRV_PWM_PIN_NOT_USED, // channel 3},.irq_priority = APP_IRQ_PRIORITY_LOWEST,.base_clock = NRF_PWM_CLK_500kHz,.count_mode = NRF_PWM_MODE_UP,.top_value = 800,.load_mode = NRF_PWM_LOAD_COMMON,.step_mode = NRF_PWM_STEP_AUTO};APP_ERROR_CHECK(nrf_drv_pwm_init(&m_pwm0, &config0, pwm_handler));
配置信息包好输出引脚,中断优先级,基础频率,计数模式,计数最大阈值,加载序列模式和step模式。
4.1 输出引脚设置
- 使用
NRF_DRV_PWM_PIN_INVERTED
可以设置空闲引脚的电平为高电平。不使用时空闲引脚的电平为低电平。 - 不使用引脚,需要设置为
NRF_DRV_PWM_PIN_NOT_USED
。
4.2 加载模式设置
PWM模块可以播放存在RAM中的Multiple duty cycle array(sequences)
。也就是存一系列占空比值compare
到RAM中,通过Decoder
可以把这些值自动写入到寄存器。
NRF_PWM_LOAD_COMMON
4通道共用一个配置,通常使用这种模式即可。NRF_PWM_LOAD_GROUPED
1,2通道使用第一个值;3,4通道使用第二个值。依次类推。NRF_PWM_LOAD_INDIVIDUAL
完全独立,1通道对应第一个值,4通道对应第四个值。NRF_PWM_LOAD_WAVE_FORM
1,2,3独立,第四个值写入top value
4.3 基础频率和顶值设置
基础频率和顶值设置可以决定PWM的频率。
4.4 回调函数
typedef enum
{NRFX_PWM_EVT_FINISHED, ///< Sequence playback finished.NRFX_PWM_EVT_END_SEQ0, /**< End of sequence 0 reached. Its data can besafely modified now. */NRFX_PWM_EVT_END_SEQ1, /**< End of sequence 1 reached. Its data can besafely modified now. */NRFX_PWM_EVT_STOPPED, ///< The PWM peripheral has been stopped.
} nrfx_pwm_evt_type_t;void brnc_drv_motor_pwm_handler(nrf_drv_pwm_evt_type_t event_type) {if (event_type == NRF_DRV_PWM_EVT_FINISHED) {}
}
5. 播放
5.1 播放参数设置
static nrf_pwm_values_common_t seq_values[] =
{0, 200, 400, 600, 800
};
nrf_pwm_sequence_t const seq =
{.values.p_common = seq_values,.length = NRF_PWM_VALUES_LENGTH(seq_values),.repeats = 0,.end_delay = 0
};
5.2 播放
nrf_drv_pwm_simple_playback(&m_pwm0, &seq, 3, NRF_DRV_PWM_FLAG_LOOP);
nrf_drv_pwm_simple_playback(&m_pwm0, &seq, 3, NRFX_PWM_FLAG_STOP);
/*** @brief Function for starting a single sequence playback.** To take advantage of the looping mechanism in the PWM peripheral, both* sequences must be used (single sequence can be played back only once by* the peripheral). Therefore, the provided sequence is internally set and* played back as both sequence 0 and sequence 1. Consequently, if end of* sequence notifications are required, events for both sequences should be* used (that means that both the @ref NRFX_PWM_FLAG_SIGNAL_END_SEQ0 flag* and the @ref NRFX_PWM_FLAG_SIGNAL_END_SEQ1 flag should be specified and* the @ref NRFX_PWM_EVT_END_SEQ0 event and the @ref NRFX_PWM_EVT_END_SEQ1* event should be handled in the same way).** Use the @ref NRFX_PWM_FLAG_START_VIA_TASK flag if you want the playback* to be only prepared by this function, and you want to start it later by* triggering a task (using PPI for instance). The function will then return* the address of the task to be triggered.** @note The array containing the duty cycle values for the specified sequence* must be in RAM and cannot be allocated on stack.* For detailed information, see @ref nrf_pwm_sequence_t.** @param[in] p_instance Pointer to the driver instance structure.* @param[in] p_sequence Sequence to be played back.* @param[in] playback_count Number of playbacks to be performed (must not be 0).* @param[in] flags Additional options. Pass any combination of* @ref nrfx_pwm_flag_t "playback flags", or 0* for default settings.** @return Address of the task to be triggered to start the playback if the @ref* NRFX_PWM_FLAG_START_VIA_TASK flag was used, 0 otherwise.*/
uint32_t nrfx_pwm_simple_playback(nrfx_pwm_t const * const p_instance,nrf_pwm_sequence_t const * p_sequence,uint16_t playback_count,uint32_t flags);
6. 停止与卸载
6.1 停止
bool nrfx_pwm_stop(nrfx_pwm_t const * const p_instance,bool wait_until_stopped);
6.2 卸载
void nrfx_pwm_uninit(nrfx_pwm_t const * const p_instance);
nRF52 PWM 使用相关推荐
- NRF52832 PWM
1.在sdk_config.h中加入宏 // <e> PWM_ENABLED - nrf_drv_pwm - PWM peripheral driver - legacy layer // ...
- RTT设备与驱动之PWM
这里将PWM当成一个设备:PWM简介 上图是一个简单的 PWM 原理示意图,假定定时器工作模式为向上计数,当计数值小于阈值时,则输出一种电平状态,比如高电平,当计数值大于阈值时则输出相反的电平状态,比 ...
- 51单片机 小车 L298N pwm调速 串口控制 按键控制
难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1--前进 按键2--后退 按键3--加速 按键4--减速 (板子上只有四个按键) 串口控制 '1'--前进 ...
- 【转载】 stm32之PWM
发现这位博主的博客被大量的转发,我也转载一篇,谁叫人家写的好呢. 原文地址:http://blog.sina.com.cn/s/blog_49cb42490100s6uh.html 脉冲宽度调制(PW ...
- 开关电源三种控制模式:PWM/PFM/PSM
1. PWM/PFM/PSM 三种控制模式的定义 通常来说﹐开关电源(DC-DC)有三种最常见的调制方式分别为: 脉冲宽度调制(PWM) 脉冲频率调制(PFM) 脉冲跨周期调制(PSM) 在功率集成电 ...
- 使用 RPI.GPIO 模块的脉宽调制(PWM)功能
脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法.在树莓派上,可以通过对GPIO的编程来实现PWM. 创建一个 PWM 实例: p = GPIO. ...
- 树莓派c语言输出pwm波,树莓派硬件PWM输出程序
一:实验现象 对于树莓派硬件PWM只有1号引脚(wiringPi),单独测试该引脚时,可以输出不同占空比控制led灯成呼吸灯的效果 二:程序步骤 1,初始化wiringPi的库函数; 2,设置对应的P ...
- linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证
兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证日本KOBISHI蜂鸣器.jjb器 .蜂鸣器BZ-35VR DC24V.济南千斗工业出售,货期短.价格低.保证 这里只对必须用1/2duty的 ...
- 全程pwm调光_dc调光的手机有哪些
dc调光的手机有哪些?目前已经发布的黑鲨游戏手机2.黑鲨游戏手机Helo均为全程DC调光,魅族16系列手机,OPPO的Reno,一加7等手机已经是支持DC调光. dc调光的手机有哪些 1.据悉,目前已 ...
最新文章
- 院士谈如何做好研究生:要逼着自己去想问题,最大的浪费是聪明人不思考
- 网站静态化处理—动静分离策略(3)
- 大话设计模式之装饰模式
- 分享一点python 编码设置的知识
- springmvc二十:数据绑定
- PyTorch 实现 VAE 变分自编码器 含代码
- c语言:将一个二维数组行和列的元素互换,存到另一个二维数组中。
- U盘安装Ubuntu三步走
- UG NX12.0安装教程
- leetcode 343. Integer Break | 343. 整数拆分(Java)
- mysql免安装5.7.17_mysql免安装5.7.17数据库配置
- 过滤特征_LR训练优化-稀疏特征过滤
- Swift 中的Closures(闭包)详解
- 纯新手DSP编程--5.15--CCS简述
- 希望是一个全新的开始
- 给华南x99打鸡血BIOS教程
- xheditor html5,Flask项目集成富文本编辑器XHEditor
- 【图像压缩】替换输入改善压缩+实现可变比特率
- 读书笔记 - 《上帝的跳蚤》
- 给传智播客的一份感谢信
热门文章
- 21. 查询表sc——查询平均成绩大于等于90分的学生学号和平均成绩
- shell script if嵌套for循环脚本
- 如何使用Arduino开发板读/写SD卡模块的数据
- arduino esp32 读福申甲醛传感器
- 什么是系统时钟?什么是时钟系统?时钟系统有什么作用?
- c语言将一个字符输出三遍,C语言字符相关部分内容小结
- 以javaweb项目为例,用户在搜索网页域名的过程到网页响应到底经过了什么?
- Linux网络编程8——线程池模型
- python培训班深圳-深圳python人工智能培训班
- java 默认打印机_JavaScript代码 设置默认打印机!