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

Сегодня пытался запустить ЦАП на stm32f100, мучался около часа, испытал много параметров, наконец он заработал и я провел несколько экспериментов с его инициализацией.

Цель была просто в бесконечном цикле выводить данный с АЦП на ЦАП. Функция инициализации ЦАП должна быть такой (судя с документации):
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() :)

Комментарии (6)

RSS свернуть / развернуть
Пишите конечно!
0
Конечно пиши, особенно если хорошо! :)
не большая само реклама
ziblog.ru/2011/04/19/stm32-ndash-tsap-pdp/
0
  • avatar
  • ZiB
  • 22 сентября 2011, 19:39
Видел, заглядываю время от времени в ваш бложек)
0
да пусть висит.
0
Плюс однозначно. За что, что не поленились и разобрались, как это делается на уровне железа, а не тупо скопипастили пример с драйвером.
0
  • avatar
  • _YS_
  • 22 сентября 2011, 22:12
А там и разбираться не много, почему-то мне показалось что работать с регистрами проще и компактнее чем с библиотечными функциями.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.