Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add description for DAC lab #15

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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