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