Здесь все показано на простом на примере. Считываем значение напряжения с движка переменного резистора на отладочной плате Olimex SAM7-EX256. Напряжение на движке меняется от 0 до 3.3 вольт и этот движок подключен к каналу 6 ADC (ножка AD6, вывод 5), используем источник опорного напряжения 3.3 вольт (ножка ADVREF, вывод 1). Таким образом, в 10-битном режиме с ADC будем считывать значение 0..1023.
В этом примере пропущен код инициализации процессора (он работает на частоте 48 МГц, но для нашего примера это не критично).
//adc.c
#include "ioat91sam7x256.h"
AT91PS_ADC a_pADC = AT91C_BASE_ADC;
AT91PS_PMC a_pPMC = AT91C_BASE_PMC;
//константы каналов (нас интересует только канал 6)
#define ADC_CHN_0 0x01
#define ADC_CHN_1 0x02
#define ADC_CHN_2 0x04
#define ADC_CHN_3 0x08
#define ADC_CHN_4 0x10
#define ADC_CHN_5 0x20
#define ADC_CHN_6 0x40
#define ADC_CHN_7 0x80
extern u32 adcTrimm;
void InitADC(void)
{
// разрешить тактовую для ADC
a_pPMC->PMC_PCER = 1 << AT91C_ID_ADC;
// сброс ADC
a_pADC->ADC_CR = 0x1;
a_pADC->ADC_CR = 0x0;
// установить на макимум startup time и hold time
a_pADC->ADC_MR = 0x0F1F0F00;
// разрешим все нужные каналы
a_pADC->ADC_CHER = ADC_CHN_6;
}
void GetAdc(void)
{
// запуск ADC-преобразования
a_pADC->ADC_CR = 0x2;
// Ждем окончания преобразования
while(!(a_pADC->ADC_SR & ADC_CHN_6));
//получаем результат и записываем его в глобальную переменную
adcTrimm = a_pADC->ADC_CDR6;
}
//main.c
#include < dbgu/dbgu.h>
#include < stdio.h>
#define PINS_DBGU {0x18000000/*PA27(DRXD), PA28(DTXD)*/, \
AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_DEFAULT}
static const Pin pPins[] = {PINS_DBGU};
u32 adcTrimm; //переменная, куда записываем данные с ADC
int main()
{
//настройка ножек PA27(DRXD), PA28(DTXD)
PIO_Configure(pPins, PIO_LISTSIZE(pPins));
//настройка порта DBGU на нужную скорость
DBGU_Configure(DBGU_STANDARD, 115200, BOARD_MCK);
//теперь printf будет выводить символы в DBGU
printf("-- ADC testing --\n\r");
InitADC();
while (1)
{
GetADC();
printf("ADC value == %u \r",adcTrimm);
}
}
Комментарии
microsin: вопрос совсем не глупый, но лучше чем написано в даташите на AT91SAM7X512, я на него не отвечу. Микроконтроллер имеет стандартный АЦП, и как у всех стандартных АЦП, у него максимальное значение выходных данных (1023 или 0x3FF) соответствует входному напряжению, равному выбранному напряжению источника опорного напряжения АЦП. Исходя из этого равенства пересчет считанных из АЦП данных в абсолютное напряжение на входе АЦП тривиален.
microsin: константа ADC_Utrimm - это маска, составленная из констант нужных каналов. В данном примере нас интересует только канал 6, поэтому это будет константа ADC_CHN_6. Благодарю за найденную ошибку в статье, постараюсь её исправить в ближайшее время.
У меня есть плата at91sam7x-kit. Хочу задействовать АЦП в программе. Посмотрел, что каналы АЦП выведены на разъем EXT.
А опорное напряжение уже заведено на контроллер? Если да, то 5 или 3.3 в? Спасибо!
microsin: опорное напряжение АЦП подается на ножку 1 ADVREF микроконтроллер а. Посмотрите на схему - там ясно видно, что на эту ножку заведено напряжение +3.3 вольт через перемычку S1.
RSS лента комментариев этой записи