diff --git a/labs/14_dac/README.md b/labs/14_dac/README.md index e577336..f816e3b 100644 --- a/labs/14_dac/README.md +++ b/labs/14_dac/README.md @@ -1 +1,36 @@ ## Задание 14 "dac" + +### Общие слова + +В данной работе демонстрируется пример работы с ЦАП: выводится постоянное значение около 0.188V (преобразование вызывается каждую секунду с одним и тем же значением). С небольшими изменениями его можно использовать как простой генератор сигнала с произвольной частотой. + +### Настройка ЦАП + +Для вывода аналогового сигнала, необходимо настроить вывод PA4 на работу в аналоговом режиме: + +```c + LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); + LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_4, LL_GPIO_MODE_ANALOG); +``` + +Конфигурация ЦАП: + +```c + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_DAC1); + LL_DAC_EnableTrigger(DAC1, LL_DAC_CHANNEL_1); // включаем преобразование по триггеру + LL_DAC_SetTriggerSource(DAC1, LL_DAC_CHANNEL_1, LL_DAC_TRIG_EXT_TIM2_TRGO); // источник триггера - TIM2 + LL_DAC_SetOutputBuffer(DAC1, LL_DAC_CHANNEL_1, // дополнительный выходной буфер + LL_DAC_OUTPUT_BUFFER_ENABLE); // для большего выходного тока + LL_DAC_ConvertData12RightAligned(DAC1, LL_DAC_CHANNEL_1, 0xFF); // 0xFF - значение, которое выводим + LL_DAC_Enable(DAC1, LL_DAC_CHANNEL_1); +``` + +Само использование модуля находится в строчке `LL_DAC_ConvertData12RightAligned(DAC1, LL_DAC_CHANNEL_1, 0xFF);`. Изменяя значение на другое, на выходе получится пропорциональное напряжение (U_out = 3.0V * val / 4096). Стоит учесть, что вывод этого значения происходит по таймеру раз в секунду (источник триггера для вывода - прерывание от TIM2). Если выключить преобразование по триггеру в модуле ЦАП, преобразование будет происходить сразу после изменения значения в регистре ЦАП. Можно, например, в обработчике прерывания от таймера менять значение в ЦАП, и оно будет сразу запускать преобразование, таким образом можно сделать генератор сигнала. + +### Обязательное задание + +Сделайте генератор треугольного сигнала. Для этого будет необходимо регулярно выставлять в ЦАП необходимое значение. Сделайте это с выключенным триггером: выставляйте значение в обработчике прерывания от таймера, чтобы преобразование запускалось само собой. Возьмите частоту дискретизации (частоту, с которой обновляются значения в ЦАП) в 100..1000 раз выше частоты сигнала, чтобы выходной сигнал был как можно ближе к треугольному. + +### Дополнительное задание + +В качестве дополнительного задания можно сделать генератор сигнала разной формы. Возможные реализации: выводить по таймеру нужные значения либо заготовить значения заранее и заносить их в модуль ЦАП при помощи DMA. diff --git a/labs/14_dac/main.c b/labs/14_dac/main.c index 9763ae9..cb5b45e 100644 --- a/labs/14_dac/main.c +++ b/labs/14_dac/main.c @@ -104,7 +104,7 @@ void dac_config(void) LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_DAC1); LL_DAC_EnableTrigger(DAC1, LL_DAC_CHANNEL_1); LL_DAC_SetTriggerSource(DAC1, LL_DAC_CHANNEL_1, LL_DAC_TRIG_EXT_TIM2_TRGO); - LL_DAC_SetOutputBuffer(DAC1, LL_DAC_CHANNEL_1,\ + LL_DAC_SetOutputBuffer(DAC1, LL_DAC_CHANNEL_1, LL_DAC_OUTPUT_BUFFER_ENABLE); LL_DAC_ConvertData12RightAligned(DAC1, LL_DAC_CHANNEL_1, 0xFF); LL_DAC_Enable(DAC1, LL_DAC_CHANNEL_1);