
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра ИИСТ
отчет
по лабораторной работе №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 кОм.
При
этом:
;
Это значит, что данные значения нам подходят.