使用 C 语言中的 nRF52 系列 PWM 驱动器实现 6 秒周期的 PWM 波

问题描述 投票:0回答:1

我正在开发一个使用 nRF52 系列 MCU 的项目,我的目标是使用 nRF52 SDK v.15.3.0 生成总周期约为 6 秒的正弦 PWM 波。

我已经使用 250kHz 的基本时钟频率和 4167 的最高值初始化了 PWM,并且我使用数组 data[360] 来保存表示正弦波一个周期的缩放和归一化占空比值。

例如: 4167/250000 = 0.016668 * 360(数组中的项目数)大约为 6 秒。

然而,这是我未能设定逻辑的地方。当我在逻辑分析中检查波动效果时,大约需要1.2秒,我不明白为什么。

我希望得到一些帮助。预先感谢您。

部分代码:

uint16_t data[360];
uint16_t duty_cycle;

nrf_pwm_clk_t base_clock;

const nrf_drv_pwm_t m_pwm0 = NRF_DRV_PWM_INSTANCE(0);

nrf_pwm_values_wave_form_t seq_values_wave_form = {
    .channel_0 = 0,
    .counter_top = 4095,
};

nrf_pwm_values_t seq_pwm_values;
nrf_pwm_sequence_t seq_wave_form;

void pwm_init_config()
{
    uint8_t prescaler_setting = 0;

    switch (prescaler_setting)
    {
    case 0:
        base_clock = NRF_PWM_CLK_250kHz;
        break; // 32MHz / 128
    }

    nrf_drv_pwm_config_t const config0 =
        {
            .output_pins =
                {
                    LED_1,
                    NRF_DRV_PWM_PIN_NOT_USED,
                    NRF_DRV_PWM_PIN_NOT_USED,
                    NRF_DRV_PWM_PIN_NOT_USED,
                },
            .irq_priority = APP_IRQ_PRIORITY_LOWEST,
            .base_clock = base_clock,             // Frequency
            .count_mode = NRF_PWM_MODE_UP,        // operating mode of the pulse generator counter
            .top_value = 4167,                    // count, Period = top_value / Hz
            .load_mode = NRF_PWM_LOAD_INDIVIDUAL, // mode of loading sequence data from RAM
            .step_mode = NRF_PWM_STEP_AUTO};      // mode of advancing the active sequence
    APP_ERROR_CHECK(nrf_drv_pwm_init(&m_pwm0, &config0, NULL));
}

// Initiliaze the sequence structure with values for the waveform
void initialize_basic_data()
{
    int size = sizeof(data) / sizeof(data[0]);

    for (int i = 0; i < size; i++)
    {
        double radian = i * (M_PI / 180); // Convert degree to radian as sin function in C uses radian
        double sin_value = sin(radian);   // get sin value which will be in range [-1, 1]
        // Normalize and scale sin_value to 15-bit integer value, using only 11 upper bits for amplitude
        uint16_t scaled_value = (uint16_t)((sin_value + 1) * 0x03FF); // 0x03FF = 1023, the maximum 10-bit value
        data[i] = scaled_value << 4;                                  // left shift by 4 to use the upper 11 bits
    }

    seq_wave_form.values.p_wave_form = data;
    seq_wave_form.length = NRF_PWM_VALUES_LENGTH(data);
    seq_wave_form.repeats = 0;
    seq_wave_form.end_delay = 0;
}

void wave_effect()
{
    initialize_basic_data(); // Inicializa os valores de data com a onda senoidal
    nrf_drv_pwm_simple_playback(&m_pwm0, &seq_wave_form, 1, NRF_DRV_PWM_FLAG_LOOP);
}
c pwm nrf52
1个回答
0
投票

问题是 uint16_t 数据[360]

这需要定义为

nrf_pwm_values_individual_t data[360];
。 如果没有定义正确的结构,PWM 驱动程序将意外运行。

© www.soinside.com 2019 - 2024. All rights reserved.