ESP32: Как выводить разные сигналы на каждый канал ЦАП, если ЦАП находится в режиме непрерывного вывода сигнала (режим нC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 ESP32: Как выводить разные сигналы на каждый канал ЦАП, если ЦАП находится в режиме непрерывного вывода сигнала (режим н

Сообщение Anonymous »

Я хочу сгенерировать на выходах ЦАП ESP32 два сигнала: синус и косинус, таким образом сдвинутые на 90 градусов. Но у меня на обоих выходах ЦАП один и тот же сигнал.
Из документации Espressif я обнаружил, что Каналы ЦАП нельзя отдельно зарегистрировать в непрерывном режиме (ссылка в документацию)
Более того, я нашел в документации (dac cont config) такую ​​информацию для настройки ЦАП:

Код: Выделить всё

    cont_cfg = {
.chan_mask = DAC_CHANNEL_MASK_ALL,
.desc_num = 2,
.buf_size = 2048,
.freq_hz = frequency_convert_Hz,
.offset = 0,
.clk_src = DAC_DIGI_CLK_SRC_DEFAULT, // If the frequency is out of range, try 'DAC_DIGI_CLK_SRC_APLL'
.chan_mode = DAC_CHANNEL_MODE_ALTER,
};
/* Assume the data in buffer is 'A B C D E F'
* DAC_CHANNEL_MODE_SIMUL:
*      - channel 0: A B C D E F
*      - channel 1: A B C D E F
* DAC_CHANNEL_MODE_ALTER:
*      - channel 0: A C E
*      - channel 1: B D F
*/
Таким образом, если я правильно понял, для своей задачи мне приходится использовать режим ALTER .chan_mode = DAC_CHANNEL_MODE_ALTER для подачи разных сигналов в два ЦАП каналы (channel_mode).

Код: Выделить всё

    /* Assume the data in buffer is 'A B C D E F'
* DAC_CHANNEL_MODE_ALTER:
*      - channel 0: A C E
*      - channel 1: B D F
*/
И я написал функцию для генерации сигналов синуса и косинуса, где я использовал пересечение этих двух сигналов в одном буфере:

Код: Выделить всё

void generate_waves(void)
{
for (int i = 0; i < EXAMPLE_ARRAY_LEN; i++)
{
if (i % 2)
{
signal_wave[i] = (uint8_t)(amplitude / 2 * (1 + sin(2 * M_PI * i / EXAMPLE_ARRAY_LEN)));
}
else
{
signal_wave[i] = (uint8_t)(amplitude / 2 * (1 + cos(2 * M_PI * i / EXAMPLE_ARRAY_LEN)));
}
}
}
Однако нет эффекта. Сигналы одинаковы на обоих выходах ЦАП!
Мой пример кода
Файл main.cpp:

Код: Выделить всё

#include 

#include "DAC_Continuous_DMA.h"

void setup()
{
Serial.begin(921600);

dac_continuous_dma_config(1000);
}

void loop()
{
// Just for testing
Serial.printf("Free heap size: %d\n", esp_get_free_heap_size());
Serial.printf("%s(), core: %d: Running time [s]: %d\n", __func__, xPortGetCoreID(), millis());

vTaskDelay(pdMS_TO_TICKS(1000));
}
Файл DAC_Continous_DMA.h:

Код: Выделить всё

#pragma once
#ifndef DAC_Continuous_DMA_h
#define DAC_Continuous_DMA_h

#include "Arduino.h"
#include 
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "soc/dac_channel.h"
#include "driver/dac_continuous.h"

#include "soc/sens_reg.h"

#define EXAMPLE_ARRAY_LEN 512     // Length of wave array
#define EXAMPLE_DAC_AMPLITUDE 255 // Amplitude of DAC voltage.  If it's more than 256 will causes

#define CONST_2_PI 6.2832 // 2 * PI

_Static_assert(EXAMPLE_DAC_AMPLITUDE < 256, "The DAC accuracy is 8 bit-width, doesn't support the amplitude beyond 255");

dac_continuous_config_t cont_cfg;

uint8_t signal_wave[EXAMPLE_ARRAY_LEN]; // Used to store sine wave values
uint8_t amplitude = EXAMPLE_DAC_AMPLITUDE;

dac_continuous_handle_t cont_handle = NULL;

void generate_waves(void)
{
for (int i = 0; i < EXAMPLE_ARRAY_LEN; i++)
{
if (i % 2)
{
signal_wave[i] = (uint8_t)(amplitude / 2 * (1 + sin(2 * M_PI * i / EXAMPLE_ARRAY_LEN)));
}
else
{
signal_wave[i] = (uint8_t)(amplitude / 2 * (1 + cos(2 * M_PI * i / EXAMPLE_ARRAY_LEN)));
}
}
}

void dac_continuous_dma_config(uint32_t frequency_Hz = 1000)
{
generate_waves();

cont_cfg = {
.chan_mask = DAC_CHANNEL_MASK_ALL,
.desc_num = 2,
.buf_size = 2048,
.freq_hz = EXAMPLE_ARRAY_LEN * frequency_Hz / 2,
.offset = 0,
.clk_src = DAC_DIGI_CLK_SRC_DEFAULT, // If the frequency is out of range, try 'DAC_DIGI_CLK_SRC_APLL'
.chan_mode = DAC_CHANNEL_MODE_ALTER,
};
/* Assume the data in buffer is 'A B C D E F'
* DAC_CHANNEL_MODE_SIMUL:
*      - channel 0: A B C D E F
*      - channel 1: A B C D E F
* DAC_CHANNEL_MODE_ALTER:
*      - channel 0: A C E
*      - channel 1: B D F
*/

ESP_ERROR_CHECK(dac_continuous_new_channels(&cont_cfg, &cont_handle));
ESP_ERROR_CHECK(dac_continuous_enable(cont_handle));
ESP_ERROR_CHECK(dac_continuous_write_cyclically(cont_handle, (uint8_t *)signal_wave, EXAMPLE_ARRAY_LEN, NULL));

}

#endif // DAC_Continuous_DMA_h
Сводка проблемы/вопроса:

Как выводить разные сигналы на каждый канал ЦАП, где ЦАП находится в режиме непрерывного вывода сигнала (Непрерывный режим/режим DMA)?

Спасибо за ваши комментарии и помощь!


Подробнее здесь: https://stackoverflow.com/questions/792 ... is-in-cont
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»