Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запуск DAC в Atmel SAM3S
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AleksandrAA
В SAM3S выход ЦАП "DAC0" осуществляется на вывод PB13, контролируемый контроллером PIO B.
Для работы ЦАПа необходимо сконфигурировать этот вывод для работы с соответсвующей периферией.
Но в рук-ве на SAM3S оговаривается, что каждый вывод м.б. сконфигурирован для работы с тремя перифериями: А, В и С
("Each line can be assigned to one of three peripheral functions: A, B or C."),
В таблице периферий периферия DAC0 обозвана как Extra Function,
и нигде не оговаривается, что это значит.
В SAM3S выбор соответствующей периферии осуществляется регистрами PIO ABCDSR1 и ABCDSR2,
причем в их описании указаны уже 4 периферии: A, B, C и D.
Я предположил, что Extra Function это и есть D
и сконфигурировал вывод PB13 следующим кодом:
Код
AT91C_BASE_PIOB->PIO_PPUDR = AT91C_PIO_PB13;
AT91C_BASE_PIOB->PIO_SP1   = AT91C_PIO_PB13 | AT91C_BASE_PIOB->PIO_SP1;  // setting PIO::ABCDSR1
AT91C_BASE_PIOB->PIO_SP2   = AT91C_PIO_PB13 | AT91C_BASE_PIOB->PIO_SP2;  // setting PIO::ABCDSR2
AT91C_BASE_PIOB->PIO_PDR   = AT91C_PIO_PB13;
(соответствующие макросы были определены в ioat91sam3s4.h;
я работаю в IAR for ARM 7.40.1)

Далее я попытался запустить ЦАП следующим кодом:
Код
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_DAC0);
AT91C_BASE_DAC0->DAC_CR = AT91C_DAC_SWRST;                // reset
AT91C_BASE_DAC0->DAC_MR = AT91C_DAC_REFRESH & (1 << 8);  // Refresh Period = 1024*REFRESH/DACC Clock
AT91C_BASE_DAC0->DAC_MR = AT91C_DAC_STARTUP & (1 << 24); // 8*Tdac_clk
AT91C_BASE_DAC0->DAC_MR = AT91C_DAC_USER_SEL_CH1;         // Only Channel 1 enabled
AT91C_BASE_DAC0->DAC_CHER= AT91C_DAC_CH0;                 // enable Channel 1
(значение 1 для записи в поля DAC_MR REFRESH и STARTUP было взято "с потолка", в качестве пробы).

Но после этого запись в AT91C_BASE_DAC0->DAC_CDR разных значений (0, 1000, 2000)
НИ К ЧЕМУ НЕ ПРИВОДИЛА: на выходе был постоянный 0.
Причем в регистре DAC_ISR флаг EOC после записи в CDR устанавливался
и сбрасывался после чтения ISR.
На вход ADVREF SAM3S подано напряжение 3 В от ИОН.
SAM3S работает с кварцем на 12 МГц.

У кого-нибудь был опыт запуска ЦАПа в этом SAM3S?
М. что-нибудь подскажете, что не так?
DmitryM
Цитата(AleksandrAA @ Oct 28 2016, 14:51) *
(соответствующие макросы были определены в ioat91sam3s4.h;
я работаю в IAR for ARM 7.40.1)

Далее я попытался запустить ЦАП следующим кодом:
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_DAC0);
AT91C_BASE_DAC0->DAC_CR = AT91C_DAC_SWRST; // reset
AT91C_BASE_DAC0->DAC_MR = AT91C_DAC_REFRESH & (1 << 8); // Refresh Period = 1024*REFRESH/DACC Clock
AT91C_BASE_DAC0->DAC_MR = AT91C_DAC_STARTUP & (1 << 24); // 8*Tdac_clk
AT91C_BASE_DAC0->DAC_MR = AT91C_DAC_USER_SEL_CH1; // Only Channel 1 enabled
AT91C_BASE_DAC0->DAC_CHER= AT91C_DAC_CH0; // enable Channel 1
(значение 1 для записи в поля DAC_MR REFRESH и STARTUP было взято "с потолка", в качестве пробы).

У кого-нибудь был опыт запуска ЦАПа в этом SAM3S?
М. что-нибудь подскажете, что не так?


DACC не использую, смущает что у Вас три записи подряд в регистр DAC_MR, т.е. каждой следующей записью затирается предыдущее значение. По макросам тоже не подскажу, поскольку использую gcc и штатные заголовочные файлы, предоставляемые Atmel.
_4afc_
Цитата(AleksandrAA @ Oct 28 2016, 15:51) *
причем в их описании указаны уже 4 периферии: A, B, C и D. Я предположил, что Extra Function это и есть D

В SAM4S аналог/альтернатива работает - если не использоать A, B, C и D

Цитата(AleksandrAA @ Oct 28 2016, 15:51) *
AT91C_BASE_DAC0->DAC_MR = AT91C_DAC_REFRESH & (1 << 8); // Refresh Period = 1024*REFRESH/DACC Clock

DACC Clock укладывается в требования даташита (на SAM4S хитрый клок)?
Jury093
Цитата(AleksandrAA @ Oct 28 2016, 14:51) *
У кого-нибудь был опыт запуска ЦАПа в этом SAM3S?

что мешает обратиться к производителю?
http://www.atmel.com/ru/ru/products/microc...x?tab=documents
и вытащить архив типа
http://www.atmel.com/ru/ru/Images/SAM3S-EK__KitsFiles.zip
и поискать там пример работы с DACC:

Код
/** \addtogroup dacc_module Working with DACC
* The DACC driver provides the interface to configure and use the DACC peripheral.\n
*
* The DACC(Digital-to-Analog Converter Controller) converts digital code to analog output.
* The data to be converted are sent in a common register for all channels. It offers up to 2
* analog outputs.The output voltage ranges from (1/6)ADVREF to (5/6)ADVREF.
*
* To Enable a DACC conversion,the user has to follow these few steps:
nvn
А в sam3s разве нет write protect регистров, что для PIO, что для DACC, для PMC? Или просто не указали здесь?
З.Ы. с sam3s не работал, работаю с sam3x там есть, сам постоянно на них наступаю
DmitryM
Цитата(nvn @ Oct 28 2016, 19:04) *
А в sam3s разве нет write protect регистров, что для PIO, что для DACC, для PMC? Или просто не указали здесь?
З.Ы. с sam3s не работал, работаю с sam3x там есть, сам постоянно на них наступаю

Они же по умолчанию выключены.
nvn
Возможно у меня они в стартап файлах включаются, незнаю не разбирался. Но факт, что приходится выключать чтоб в PMC тактовые включить, или PIO и т.д. иначе не работало.
И в примерах от Атмел тоже их выключают.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.