Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions labs/14_dac/README.md
Original file line number Diff line number Diff line change
@@ -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.
2 changes: 1 addition & 1 deletion labs/14_dac/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down