ARM AT91SAM7X256: как работать с ADC (АЦП, аналого-цифровой преобразователь) Печать
Добавил(а) microsin   

Здесь все показано на простом на примере. Считываем значение напряжения с движка переменного резистора на отладочной плате 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

#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);
    }
}