DAC в STM32, интересные наблюдения

Цель была просто в бесконечном цикле выводить данный с АЦП на ЦАП. Функция инициализации ЦАП должна быть такой (судя с документации):
void DAC_init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
// analog in
GPIOA->CRL &= ~GPIO_CRL_CNF4;
GPIOA->CRL &= ~GPIO_CRL_MODE4;
RCC->APB1ENR |= RCC_APB1ENR_DACEN; // вкл. тактирование ЦАП
//DAC->CR |= DAC_CR_BOFF1; // выкл выходной буфер.
DAC->CR |= DAC_CR_TSEL1; // ЦАП преобразования по команде программы
DAC->CR |= DAC_CR_TEN1; // включение запуска от события
DAC->CR |= DAC_CR_EN1; // вкл. ЦАП 1
}
Запуск ЦАП-преобразования:
DAC->DHR12R1 = a; // загрузка данных в ЦАП1
DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG1; // программное события запуска преобразования
Собственно строки
DAC->CR |= DAC_CR_TSEL1; // ЦАП преобразования по команде программы
DAC->CR |= DAC_CR_TEN1; // включение запуска от события
включают вывод данных по событию, здесь это установка бита DAC_SWTRIGR_SWTRIG1 в регистре DAC->SWTRIGR, можно обойтись без этого, тогда данные в выходной регистр загрузятся через 1 такт после внесения их в регист DAC->DHR12R1
После того как я узнал в чем все-таки была проблема и почему не работало, я решил немного поэкспериментировать.
Сначало это был режим работы выходного пина, как оказалось ЦАП'у пофиг в какой режим он настроен да и вообще подано ли на него тактирование. Как ни странно, но этот код работает::
void DAC_init(void)
{
//RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
//RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;
//GPIOA->CRL &= ~GPIO_CRL_CNF4;
//GPIOA->CRL |= GPIO_CRL_MODE4_0;
RCC->APB1ENR |= RCC_APB1ENR_DACEN; // вкл. тактирование ЦАП
//DAC->CR |= DAC_CR_BOFF1; // выкл выходной буфер.
DAC->CR |= DAC_CR_TSEL1; // ЦАП преобразования по команде программы
DAC->CR |= DAC_CR_TEN1; // включение запуска от события
DAC->CR |= DAC_CR_EN1; // вкл. ЦАП 1
}
Ну если вы совсем ленивый, то для работы ЦАП достаточно подать на него такты, включить и время от времени загружать данные в его регистр.
void DAC_init(void)
{
RCC->APB1ENR |= RCC_APB1ENR_DACEN; // вкл. тактирование ЦАП
DAC->CR |= DAC_CR_EN1; // вкл. ЦАП 1
}
Где-то в программе
DAC->DHR12R1 = a; // загрузка данных в ЦАП1
И еще, по умолчанию выходной буфер включен, с ним напряжение изменяется от 0.04 В до 2.94 при напряжении питания 3.24 В, без него от нуля до 2.94. Выключается записью установкой бита DAC_CR_BOFF1 в регистре DAC->CR, включается соответственно сбросом этого бита. (измерял китайским мультиметром)
Если будет желание вечером напишу нормальную статью про ЦАП с использованием таймеров и ПДП.
P.S. Так долго мучался с его запуском потому что забыл в главной функции вызвать DAC_init() :)
- +1
- 22 сентября 2011, 18:31
- hellraiser
Конечно пиши, особенно если хорошо! :)
не большая само реклама
ziblog.ru/2011/04/19/stm32-ndash-tsap-pdp/
не большая само реклама
ziblog.ru/2011/04/19/stm32-ndash-tsap-pdp/
Плюс однозначно. За что, что не поленились и разобрались, как это делается на уровне железа, а не тупо скопипастили пример с драйвером.
А там и разбираться не много, почему-то мне показалось что работать с регистрами проще и компактнее чем с библиотечными функциями.
- hellraiser
- 22 сентября 2011, 22:45
- ↑
- ↓
Комментарии (6)
RSS свернуть / развернуть