PWM这个东西我在32上用来电机调速过……通过改变高低电平占空比来实现一些功能。
keil的nrf51822目录下没有pwm.c..就在网上找了个pwm蜂鸣器的例程……看画风应该是官方的……吧……
例程的define为NRF51 SETUPA BOARD_PCA10028..修改一下,设置如下。
然后通过两个灯来实现一下两路pwm波……pin为20和21的LED_2和LED_3
先看main.c(非例程)
#include <stdbool.h>
#include <stdint.h>
#include "nrf_delay.h"
#include "nrf_gpio.h"
#include "boards.h"
#include "nrf_pwm.h"
/**
* @brief Function for application main entry.
*/
int main(void)
{
// Configure LED-pins as outputs
nrf_gpio_cfg_output(20);
nrf_gpio_cfg_output(21);
nrf_pwm_config_t pwm_config = PWM_DEFAULT_CONFIG;
pwm_config.mode = PWM_MODE_LED_255;
pwm_config.num_channels = 2;
pwm_config.gpio_num[0] = 21;
pwm_config.gpio_num[1] = 20;
nrf_pwm_init(&pwm_config);
nrf_pwm_set_value(0,20);
nrf_pwm_set_value(1,255);
}
第一步把要操作的灯的pin配置一下,设置成outputs
第二步用一个结构体来设置一下PWM的一些参数。
追踪一下PWM_DEFAULT_CONFIG,发现它在PWM.H里
#define PWM_DEFAULT_CONFIG {.num_channels = 2, \
.gpio_num = {8,9,10,11}, \
.ppi_channel = {0,1,2,3,4,5,6,7}, \
.gpiote_channel = {2,3,0,1}, \
.mode = PWM_MODE_LED_100};
然后配置mode为
PWM_MODE_LED_255,两个通道,两个通道的pin为21和20。把结构体地址传给初始化函数,初始化之后调用nrf_pwm_set_value()来设置一下占空比。
追踪一下那个mode
typedef enum
{
PWM_MODE_LED_100, // 0-100 resolution, 156Hz PWM frequency, 32kHz timer frequency (prescaler 9)
PWM_MODE_LED_255, // 8-bit resolution, 122Hz PWM frequency, 32kHz timer frequency (prescaler 9)
PWM_MODE_LED_1000, // 0-1000 resolution, 125Hz PWM frequency, 250kHz timer frequency (prescaler 6)