nRF52832 有三個PWM模組,每個模組有4各channels,所以總共有12各channels可以使用,每支GPIO都可以設定為PWM。以下圖是PWM模組的方塊圖。
Wave Counter有兩種模式,分別為PWM up counter與PWM up and down counter。主要是產生duty-cycle pulses,如下兩圖示。
Decoder with EasyDMA,分成四種模式Common、Grouped、Single、WaveForm,如下圖示。
以下是SDK的PWM範例程式
static void demo5(void) { NRF_LOG_INFO("Demo 5"); /* * This demo, similarly to demo1, plays back a sequence with different * values for individual channels. Unlike demo 1, however, it does not use * an event handler. Therefore, the PWM peripheral does not use interrupts * and the CPU can stay in sleep mode. * The LEDs (1-4) blink separately. They are turned on for 125 ms each, * in counterclockwise order (looking at the board). */ nrf_drv_pwm_config_t const config0 = { .output_pins = { BSP_LED_0 | NRF_DRV_PWM_PIN_INVERTED, // channel 0 BSP_LED_2 | NRF_DRV_PWM_PIN_INVERTED, // channel 1 BSP_LED_3 | NRF_DRV_PWM_PIN_INVERTED, // channel 2 BSP_LED_1 | NRF_DRV_PWM_PIN_INVERTED // channel 3 }, .irq_priority = APP_IRQ_PRIORITY_LOWEST, .base_clock = NRF_PWM_CLK_125kHz, .count_mode = NRF_PWM_MODE_UP, .top_value = 15625, .load_mode = NRF_PWM_LOAD_INDIVIDUAL, .step_mode = NRF_PWM_STEP_AUTO }; APP_ERROR_CHECK(nrf_drv_pwm_init(&m_pwm0, &config0, NULL)); m_used |= USED_PWM(0); // This array cannot be allocated on stack (hence "static") and it must // be in RAM (hence no "const", though its content is not changed). static nrf_pwm_values_individual_t /*const*/ seq_values[] = { { 0x8000, 0, 0, 0 }, { 0, 0x8000, 0, 0 }, { 0, 0, 0x8000, 0 }, { 0, 0, 0, 0x8000 } }; nrf_pwm_sequence_t const seq = { .values.p_individual = seq_values, .length = NRF_PWM_VALUES_LENGTH(seq_values), .repeats = 0, .end_delay = 0 }; (void)nrf_drv_pwm_simple_playback(&m_pwm0, &seq, 1, NRF_DRV_PWM_FLAG_LOOP); }
PWM範例程式參數設定介紹
.output_pins 設定4組PWM channel的輸出PIN。
.base_clock設定基頻,NRF_PWM_CLK_16MHz、NRF_PWM_CLK_8MHz、NRF_PWM_CLK_4MHz、NRF_PWM_CLK_2MHz、NRF_PWM_CLK_1MHz、NRF_PWM_CLK_500kHz、NRF_PWM_CLK_250kHz、NRF_PWM_CLK_125kHz。可設定這8種頻率。
.count_mode設定Wave Counter模式,NRF_PWM_MODE_UP、NRF_PWM_MODE_UP_AND_DOWN。
沒有留言:
張貼留言