nRF51822 的两路 PWM 极性
忙了一阵这个PWM,玩着玩着终于发现了些规律。Nordic 也挺会坑爹的。
nRF51822 是没有硬件 PWM 的,只能靠一系列难以理解的 PPI /GPIOTE/TIMER来实现,其实我想说,我醉了。
幸好SDK有这个的demo,不然真的很醉。这里说的是SDK9.0.0。
即便是有SDK,相信很多人都像我一样,看下去会觉得晕头转向的,不过知道几个函数的应用就可以了。
先记下怎么开始用一个PWM。这里我要用2路极性相反的PWM。
先来初始化两个个PWM实例,名字是PWM1、PWM2,用硬件Timer1/Timer2作为基础,千万要切记Timer1/Timer2没被占用,然后记得打开Timer1/Timer2的宏。
#define TIMER1_ENABLED 1
#define TIMER2_ENABLED 1
APP_PWM_INSTANCE(PWM1,);
APP_PWM_INSTANCE(PWM1,1);
然后初始化一个PWM。
void pwm_init(uint32_t freq)
{
static uint8_t flag=; uint32_t period_us = 1000000UL/freq; /* 2-channel PWM, 200Hz, output on DK LED pins. */
app_pwm_config_t pwm_cfg = APP_PWM_DEFAULT_CONFIG_1CH(period_us, BEEF_PIN_E1);
app_pwm_config_t pwm_cfg2 = APP_PWM_DEFAULT_CONFIG_1CH(period_us, BEEF_PIN_E2); // pwm_cfg2.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
/* Switch the polarity of the second channel. */
// pwm_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
#if 1
if(flag)
pwm_cfg2.pin_polarity[] = APP_PWM_POLARITY_ACTIVE_LOW;
else
pwm_cfg2.pin_polarity[] = APP_PWM_POLARITY_ACTIVE_HIGH;
#endif flag = !flag;
/* Initialize and enable PWM. */
ret_code_t err_code;
err_code = app_pwm_init(&PWM1,&pwm_cfg,pwm_ready_callback);
APP_ERROR_CHECK(err_code);
err_code = app_pwm_init(&PWM2,&pwm_cfg2,pwm_ready_callback);
APP_ERROR_CHECK(err_code); }
上面的代码你会注意到,我用了一个 flag 。这就是我想要说的重点。
这个函数是可以反复使用以修改 PWM的频率的,在再次使用时,先uninit它,如下:
void pwm_uninit(void)
{
app_pwm_uninit(&PWM1);
app_pwm_uninit(&PWM2);
}
我要说的重点是,第二次使用pwm_init()后然后enable_pwm,你就会发现这两路 的PWM的极性变成一样的了,所以我用一个flag,每次切换一下。解决了这个问题。
另外我发现修改占空比时,要等上一段时间才能修改完成,这点非常奇怪,懒得去追究原因了,所以才用了两个定时器来做这两路PWM。
void pwm_on(void)
{ app_pwm_enable(&PWM1);
app_pwm_enable(&PWM2); app_pwm_channel_duty_set(&PWM1, , );
app_pwm_channel_duty_set(&PWM2, , ); // ready_flag = false;
// while (app_pwm_channel_duty_set(&PWM1, 0, 50) == NRF_ERROR_BUSY);
// while(!ready_flag);
// APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM1, 1, 50));
}
就是这两个怪事。记下来。
nRF51822 的两路 PWM 极性的更多相关文章
- stm32电机控制之控制两路直流电机
		小车使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制,这里电机使用PWM驱动,速度控制框图如下: 由以上框图可知,STM32通过定时器模块输出PWM波来控制两个直流电机的转动 ... 
- stm32电机控制之控制两路直流电机!看完你会了吗
		手头上有一个差分驱动的小车,使用两个直流电机驱动,要实现小车的在给定速度下运动,完成直线行驶,转向,加速,刹车等复杂运动. 使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制, ... 
- STM32高级定时器TIM1产生两路互补的PWM波(带死区)
		测试环境:Keil 5.20.0.0 STM32F103RBT6 固件库版本:STM32F10x_StdPeriph_Lib_V3.5.0(2011) 本文使用TIM1的通道1,通道2,产生两路1kh ... 
- 基于STM32F767两路互补SPWM波(HAL库)
		SPWM波指的是占空比呈正弦规律变化的PWM波,生成方式是在定时器中断中调整PWM波的占空比. 对于互补的两路SPWM波,一路为低电平 ‘0’ 时,另一路为高电平 ‘1’,即两路是互补的. 对于STM ... 
- 定时器同步+触发三ADC采样+输出6路PWM波
		为了熟悉定时器定时器和ADC 用STM32F407DIS做了一个简单的工程: 通过高级定时器TIM1溢出更新时间作为触发输出信号(TRGO),触发TIM8开始计数: 同时TIM1的通道1.2.3以及分 ... 
- FPGA图像处理 两路sensor的色调不一致
		怎么调?可以让两路sensor的色调一致. 
- STM32F207 两路ADC连续转换及GPIO模拟I2C给MT9V024初始化参数
		1.为了更好的方便调试,串口必须要有的,主要打印一些信息,当前时钟.转换后的电压值和I2C读出的数据. 2.通过GPIO 模拟I2C对镁光的MT9V024进行参数初始化.之前用我以前公司SP0A19芯 ... 
- 16路PWM输出的pca9685模块
		今天要介绍的就是该模块,该模块是16路pwm模块,使用I2C总线可以控制16路舵机(led). 接线OE空着就可以,其他VCC是芯片供电+5,SCL时钟线,SDA信号线,GND地线. 芯片介绍可以看: ... 
- 125-FMC125-两路125Msps AD,两路160Msps DA FMC子卡模块
		FMC125-两路125Msps AD,两路160Msps DA FMC子卡模块 1.板卡概述 该板卡可实现2路14bit 250Msps AD 和2路16bit 160MspsDA功能,FMC连接 ... 
随机推荐
- Java调用Http/Https接口(5)--HttpAsyncClient调用Http/Https接口
			HttpAsyncClient是HttpClient的异步版本,提供异步调用的api.文中所使用到的软件版本:Java 1.8.0_191.HttpClient 4.1.4. 1.服务端 参见Java ... 
- JAVA基础之HttpServletResponse响应
			用户在客户端输入网址(虚拟路径)时,开始发送一个HTTP请求(请求行.请求头.请求体)至服务器.服务器内的Tomcat引擎会解析请求的地址,去找XML文件,然后根据虚拟路径找Servlet的真实路径, ... 
- 基于MUI框架+HTML5PLUS  开发 iOS和Android 应用程序(APP)
			目录 事前准备 创建项目 利用MUI写一个简单的页面 关于文件打包 事前准备 # 软件 HBuilder X Web开发IDE 下载地址:https://www.dcloud.io/hbuilderx ... 
- jmeter学习笔记(二十二)——监听器插件之jp@gc系列
			一.jp@gc - Actiive Threads Over Time 不同时间活动用户数量展示 下面是一个阶梯加压测试的图标 二.jp@gc - Transactions per Second ... 
- 推荐一个去除图片人物背景的工具Removebg
			可以在线使用,url:https://www.remove.bg/users/sign_in 用邮箱免注册一个免费账号: 注册的邮箱会收到一封激活账号的邮件: 点击Activate account后激 ... 
- 图说jdk1.8新特性(5)--- 编译器新特性
			/** * Returns the name of the parameter. If the parameter's name is * {@linkplain #isNamePresent() p ... 
- 【书评:Oracle查询优化改写】第五至十三章
			[书评:Oracle查询优化改写]第五至十三章 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ... 
- Oracle数据库插入过程中特殊符号
			-- 问题描述:(插入数据中有特殊符号)数据插入后乱码. -- 背景:客户提供部分Excel表格数据要求导入数据库.由于考虑到数据量不大所以粗略在Excel中进行了sql处理(在数据前后添加sql及对 ... 
- 关于Spring IOC (DI-依赖注入)你需要知道的一切
			<Spring入门经典>这本书无论对于初学者或者有经验的工程师还是很值一看的,最近花了点时间回顾了Spring的内容,在此顺带记录一下,本篇主要与spring IOC相关 ,这篇博文适合初 ... 
- Django项目中使用qq第三方登录。
			使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY 1,建路由 # qq登录 path('loginQq/',qq.loginQq,name=' ... 
