Скачиваний:
0
Добавлен:
10.01.2025
Размер:
150.32 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра ИИСТ

отчет

по лабораторной работе №5

по дисциплине «Микропроцессорные устройства в

информационно-измерительной технике»

Тема: Аналого-цифровой преобразователь

Бригада №5

Студенты гр. 9587

Преподаватель

Микус О.А.

Санкт-Петербург

2022

Цель работы.

Освоение принципов работы с аналого-цифровым преобразователем микроконтроллера АТ91SAM7S и получения результатов измерений.

Задание.

Датчик угарного газа позволяет измерять концентрацию в диапазоне 0...25 ppm с погрешностью 5%. Выходной сигнал представлен напряжением в диапазоне 1...12В с максимально допустимой нагрузкой по току 2 мА.

Определить параметры резистивного делителя, с помощью которого датчик можно подключить к АЦП. Использовать 4й канал АЦП.

Проводить постоянное измерение концентрации газа с усреднением по 5 отсчётам.

Отображать превышение допустимого значения (19ppm) в виде мигающего светодиода. После обнаружения превышения светодиод должен продолжить мигать даже, если концентрация газа уже вернулась в норму, до тех пор, пока не будет нажата кнопка.

Частота тактирования АЦП — 4,8 МГц. Время выборки — 1,25 мкс, разрядность преобразования — 8.

Основные теоретические положения.

Измерительный сигнал, прежде чем попасть на вход АЦП, подвергается нескольким преобразованиям (обычно линейным). Например, измеряемая физическая величина с помощью датчика преобразуется в слабый электрический сигнал. Затем этот сигнал может усиливаться нормирующим преобразователем. Для каждого блока в цепочке преобразований можно составить формулу определяющую, как выходной сигнал связан со входным. Получив такие формулы для каждого блока, можно в итоге получить формулу, которая позволит по коду АЦП узнать значение измеряемой величины. Такая зависимость называется функцией обратного преобразования.

Обработка результатов

1. Код программы в таблице 1.

Таблица 1 – Код программа

##include "Board.h"

//Массив масок светодиодов

static const int ledMask[2]={LED1, LED2};

//Указатель на структуру предзнаначенную для управления контроллером

//паралельного ввода вывода

static AT91PS_PIO pioa = AT91C_BASE_PIOA;

//Указатель на структуру управляющую контроллером питания

//Через него включается тактирование PIO необходимое для

//Считывания состояния кнопок находящихся на платке

//static AT91PS_PIO pmc = AT91C_BASE_PMC;

//Создать переменную типа указатель на структуру данных AT91S_ADC

//Присвоим ей начальное значение AT91C_BASE_ADC

static AT91PS_ADC adc = AT91C_BASE_ADC;

static AT91PS_PMC pmc = AT91C_BASE_PMC;

//Подготовка к работе с кнопками

void setUpButtons (void)

{

// За кнопки отвечает PIO. По умолчанию соответствующие

//ножки сконфигурированы как входы.

pioa->PIO_PER = SW_MASK;

pmc->PMC_PCER = 1 << AT91C_ID_PIOA;

// Включаем тактирование PIO.

// Без этого не удастся прочитать состояния кнопок.

}

// Определить номер нажатой кнопки (нумерация от нуля).

// Функция возвращает номер кнопки или -1, если никакая

// кнопка не нажата.

int pressedButtonIndex (void)

{

// Прочитать состояния ножек

unsigned int pinsStatus = pioa->PIO_PDSR;

// Поскольку нажатая кнопка обозначается нулевым битом

// в соответствующем ножке разряде, то выполняем логическое

// НЕ перед выполнением операции "И" c маской ножки.

if ((~pinsStatus) & SW1)

return 0;

if ((~pinsStatus) & SW2)

return 1;

return -1;

}

//Массив анализируемых значений

static volatile double arr[4];

static volatile double mean;

//Подготовка к работе с кнопками

//Подготовка к работе со светодиодами

void set_up_leds(void)

{

//Указываем что ножками к которым подключены светодиоды

//Управляет PIO а не встроенная периферия

pioa->PIO_PER = LED_MASK;

//Ножки будем использовать как выходы для подачи напряжения

pioa->PIO_OER = LED_MASK;

//Для гасения светодиодов

pioa->PIO_SODR = LED_MASK;

}

//Зажечь светодиод с указанным номером

void indicate(int index)

{

//Зажечь

pioa->PIO_CODR = ledMask[index];

}

void noindicate(int index)

{

pioa->PIO_SODR = ledMask[index];

}

//Настройка АЦП на использование 8-битного режима

void set_up_adc(void)

{

//Параметры режима работы:

//Частота главного тактового гененартора

const unsigned int MSK=48e6;

//Частота тактирования

const unsigned int ADCClock=48e5;

const unsigned int PRESCAL = (MSK / ADCClock * 2) - 1;

const unsigned int STARTUP = 0x1F;

const unsigned int STime=125e-8;

const unsigned int SHTIM = (ADCClock * STime) - 1;

adc->ADC_MR = AT91C_ADC_LOWRES_10_BIT | AT91C_ADC_SLEEP_NORMAL_MODE | (PRESCAL << 8) | (SHTIM << 24) | (STARTUP << 16);

//Включить 4й канал и разрешаем преобразование по нему

adc->ADC_CHER = AT91C_ADC_CH4;

}

//Функция среднего значения

void mean_func(void)

{

mean = 0;

for (int i = 0; i < 5; i++)

{

mean += arr[i];

}

mean /= 5;

}

//Функция измерения значений

void measure(void)

{

for (int i = 0; i < 5; i++)

{

//Запуск преобразования

adc->ADC_CR = AT91C_ADC_START;

//В цикле постоянно проверяем флаг готовности результата по 4каналу

while (!(adc->ADC_SR & AT91C_ADC_EOC4)) {};

//Считываем результат по 4 каналу

const unsigned int adcCode = adc->ADC_CDR4;

//Масштабирование результата через на Функцию Преобразования

const double average_acceleration = ((adcCode*2.27*3.3*(7500+2500))/(2500*2e8))-2.27;

//Записываем в массив данное значением

arr[i] = average_acceleration;

}

}

int main(void)

{

//Включить настройку

set_up_adc();

//Включить светодиоды

set_up_leds();

//Включить кнопки

setUpButtons();

//Индекс нажатой кнопки

int buttonIndex =-1;

int a=0;

while (1)

{

measure();

mean_func();

if ((mean>19))

{

a=1;

}

buttonIndex=pressedButtonIndex();

if ((a==1)&&(buttonIndex==1))

{

a=0;

}

if (a==1)

{

indicate(0);

}

else

{

noindicate(0);

}

}

}

2. Алгоритм работы программы приведен на рисунке 1.

Рисунок 1 – Алгоритм программы

3. Значение полей SHTIM и PRESCAL для регистра режима АЦП (ADC_MR).

По заданию нужно обеспечить частоту тактирования АЦП ADCCLOCK — 4,8 МГц. Время выборки SampleTime— 1,25 мкс, разрядность преобразования — 8 Опорное напряжение АЦП принято равным 3,3 В., частота главного тактового генератора (Master Clock, MCK) равной 48 МГц. Время подготовки к запуску АЦП STARTUP зададим 0x1F.

Делитель частоты, формирующий частоту тактирования АЦП:

Величина, определяющая время выборки, называется SHTIM:

4. Функция обратного преобразования и структурная схема измерительного канала.

Начальные данные для анализа: .

где p – концентрация угарного газа, Uвых.д. – выходной сигнал датчика, Imax – максимально допустимая нагрузка по току датчика, n – разрядность АЦП.

Найдем обратную зависимость :

Найдём обратную зависимость Uвых.д.(Uвх.АЦП), где Uвх.АЦП – значение выходного сигнала датчика на входе АЦП после прохождения резистивного делителя:

Рисунок 2 – Схема резистивного делителя

На Рисунке 2: R1 и R2 – резисторы, составляющие переменный резистор, стоящий перед АЦП, чьи значения сопротивлений равны соответствующим значениям сопротивлений частей переменного резистора сверху и снизу от подвижной клеммы.

Согласно рисунку:

Тогда получим:

Найдем обратную зависимость Uвых.д.(UвхАЦП):

где N – значение выходного кода АЦП, X – значение входного сигнала АЦП, q – шаг квантования АЦП, Xmax – максимальное значение входного сигнала на АЦП, то есть значение максимального опорного напряжения.

Подставим Uвых.д.(Uвх.АЦП):

Подставим в p(Uвых.д.) и получим ФП:

Определим параметры резистивного делителя. По рисунку 2 найдем границы отношения R2 к R1:

Где Кд-коэффициент делителя.

По максимальному току найдем границы сопротивления R1:

Так как часть переменного резистора R1линейно подключается к выходу датчика, то с помощью нее можно регулировать нагрузку по току датчика.

Тогда получим:

Подберём R1 и R2, учитывая :

R1=7,5 кОм; R2=2,5 кОм.

При этом: ;

Это значит, что данные значения нам подходят.