Всех приветствую! И сегодня речь снова пойдет об использовании STM32CubeMx, на очереди модуль цифро-аналогового преобразователя, он же ЦАП, он же DAC.
В общем, открываем STM32CubeMx и создаем новый проект. Я буду использовать для тестирования плату с микроконтроллером STM32F103VE. Соответственно, его я и выбрал при создании проекта. Теперь давайте разберемся с периферией - пусть будет задействован модуль DAC и выход DAC_OUT2 (PA5). Так и настраиваем:
Вывод PA5 CubeMx автоматически настроил на работу в нужном режиме:
В принципе, больше ничего пока менять не будем, генерируем проект и видим, что CubeMx добавил в main.c функцию инициализации модуля DAC, что, собственно, от него и требовалось:
static void MX_DAC_Init(void) { /* USER CODE BEGIN DAC_Init 0 */ /* USER CODE END DAC_Init 0 */ DAC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN DAC_Init 1 */ /* USER CODE END DAC_Init 1 */ /** DAC Initialization */ hdac.Instance = DAC; if (HAL_DAC_Init(&hdac) != HAL_OK) { Error_Handler(); } /** DAC channel OUT2 config */ sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN DAC_Init 2 */ /* USER CODE END DAC_Init 2 */ }
В STM32 DAC 12-ти битный, поэтому мы можем преобразовать в аналоговый сигнал любое цифровое значение от 0 до 4095. Для примера выведем на PA5 уровень напряжения, равный 1.65 В. Поскольку 3.3 Вольтам соответствует цифровой код 4095, то для 1.65 В - нужное значение в 2 раза меньше, то есть примерно 2048. Это и осуществляем в функции main()
после инициализации периферии:
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DAC_Init(); /* USER CODE BEGIN 2 */ uint16_t currentDACData = 2048; // Включаем ЦАП, нужный канал HAL_DAC_Start(&hdac, DAC_CHANNEL_2); HAL_DAC_SetValue(&hdac, DAC_CHANNEL_2, DAC_ALIGN_12B_R, currentDACData); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
Как видите, все сводится к вызову функции HAL_DAC_SetValue()
, да и только. Параметры тут все понятные - структура, которая соответствует нашему модулю DAC, номер канала, выравнивание данных (по левому краю, либо по правому) и последний аргумент - сами данные. Измерив сигнал на PA5, обнаружим там напряжение, равное 1.65 В, как и было задумано.
Статья получилась небольшая, но базовый пример работает успешно, так что на этом и заканчиваем 👍