88 lines
3.3 KiB
C
88 lines
3.3 KiB
C
/*
|
||
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
||
*
|
||
* SPDX-License-Identifier: CC0-1.0
|
||
*/
|
||
|
||
#include <math.h>
|
||
#include "freertos/FreeRTOS.h"
|
||
#include "freertos/task.h"
|
||
#include "driver/dac_continuous.h"
|
||
#include "esp_check.h"
|
||
#include "dac_continuous_example.h"
|
||
|
||
#define EXAMPLE_WAVE_FREQ_HZ 2000 // 默认波形频率2000Hz,不能太低
|
||
#define EXAMPLE_CONVERT_FREQ_HZ (EXAMPLE_ARRAY_LEN * EXAMPLE_WAVE_FREQ_HZ) // DAC转换波形数组中每个数据的频率
|
||
|
||
extern uint8_t sin_wav[EXAMPLE_ARRAY_LEN]; // 用于存储正弦波值
|
||
extern uint8_t tri_wav[EXAMPLE_ARRAY_LEN]; // 用于存储三角波值
|
||
extern uint8_t saw_wav[EXAMPLE_ARRAY_LEN]; // 用于存储锯齿波值
|
||
extern uint8_t squ_wav[EXAMPLE_ARRAY_LEN]; // 用于存储方波值
|
||
|
||
static const char *TAG = "dac continuous(DMA)";
|
||
static const char wav_name[DAC_WAVE_MAX][15] = {"sine", "triangle", "sawtooth", "square"};
|
||
|
||
static void dac_dma_write_task(void *args)
|
||
{
|
||
dac_continuous_handle_t handle = (dac_continuous_handle_t)args;
|
||
dac_example_wave_type_t wav_sel = DAC_SINE_WAVE; // 从正弦波开始
|
||
|
||
size_t buf_len = EXAMPLE_ARRAY_LEN;
|
||
|
||
while (1) {
|
||
/* 缓冲区中的波形将循环转换 */
|
||
switch (wav_sel) {
|
||
case DAC_SINE_WAVE:
|
||
ESP_ERROR_CHECK(dac_continuous_write_cyclically(handle, (uint8_t *)sin_wav, buf_len, NULL));
|
||
break;
|
||
case DAC_TRIANGLE_WAVE:
|
||
ESP_ERROR_CHECK(dac_continuous_write_cyclically(handle, (uint8_t *)tri_wav, buf_len, NULL));
|
||
break;
|
||
case DAC_SAWTOOTH_WAVE:
|
||
ESP_ERROR_CHECK(dac_continuous_write_cyclically(handle, (uint8_t *)saw_wav, buf_len, NULL));
|
||
break;
|
||
case DAC_SQUARE_WAVE:
|
||
ESP_ERROR_CHECK(dac_continuous_write_cyclically(handle, (uint8_t *)squ_wav, buf_len, NULL));
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
/* 每CONFIG_EXAMPLE_WAVE_PERIOD_SEC秒切换波形 */
|
||
vTaskDelay(pdMS_TO_TICKS(CONFIG_EXAMPLE_WAVE_PERIOD_SEC * 1000));
|
||
wav_sel++;
|
||
wav_sel %= DAC_WAVE_MAX;
|
||
ESP_LOGI(TAG, "%s wave start", wav_name[wav_sel]);
|
||
}
|
||
}
|
||
|
||
void example_dac_continuous_by_dma(void)
|
||
{
|
||
dac_continuous_handle_t cont_handle;
|
||
dac_continuous_config_t cont_cfg = {
|
||
.chan_mask = DAC_CHANNEL_MASK_ALL,
|
||
.desc_num = 8,
|
||
.buf_size = 2048,
|
||
.freq_hz = EXAMPLE_CONVERT_FREQ_HZ,
|
||
.offset = 0,
|
||
.clk_src = DAC_DIGI_CLK_SRC_DEFAULT, // 如果频率超出范围,尝试'DAC_DIGI_CLK_SRC_APLL'
|
||
/* 假设缓冲区中的数据是'A B C D E F'
|
||
* DAC_CHANNEL_MODE_SIMUL:
|
||
* - 通道0: A B C D E F
|
||
* - 通道1: A B C D E F
|
||
* DAC_CHANNEL_MODE_ALTER:
|
||
* - 通道0: A C E
|
||
* - 通道1: B D F
|
||
*/
|
||
.chan_mode = DAC_CHANNEL_MODE_SIMUL,
|
||
};
|
||
/* 分配连续通道 */
|
||
ESP_ERROR_CHECK(dac_continuous_new_channels(&cont_cfg, &cont_handle));
|
||
/* 启用组中的通道 */
|
||
ESP_ERROR_CHECK(dac_continuous_enable(cont_handle));
|
||
|
||
example_log_info(EXAMPLE_CONVERT_FREQ_HZ, EXAMPLE_WAVE_FREQ_HZ);
|
||
|
||
/* 开始转换波形 */
|
||
xTaskCreate(dac_dma_write_task, "dac_dma_write_task", 4096, cont_handle, 5, NULL);
|
||
}
|