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

5. Оценка погрешностей измерительного канала.

Погрешность, вносимая АЦП микроконтроллера:

Аддитивная погрешность: 2 ед. младшего разряда;

Мультипликативная погрешность: 2 ед. младшего разряда;

Погрешность нелинейности: 3 ед. младшего разряда.

Суммарная погрешность:

Относительная погрешность: . Приведённая погрешность: .

Вывод

В ходе выполнения лабораторной работы была освоены принципы работы с аналого-цифровым преобразователем микроконтроллера AT91SAM7S. Было написана программа, которая регистрирует превышение концентрации угарного газа.

#include "Board.h"

#include <stdio.h>

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

static AT91PS_PIO pioa = AT91C_BASE_PIOA;

static AT91PS_ADC adc = AT91C_BASE_ADC;

static volatile double res[3];

static volatile double mean;

void set_up_leds(void)

{

pioa->PIO_PER = LED_MASK;

pioa->PIO_OER = LED_MASK;

pioa->PIO_SODR = LED_MASK;

}

void blink(void)

{

static unsigned char index = 0;

pioa->PIO_CODR = ledMask[index];

pioa->PIO_SODR = (~ledMask[index]) & LED_MASK;

for ( int i = 0; i < 1000000; i++ ) {}

if (!index)

index = 1;

else

index = 0;

}

void indicate(void)

{

pioa->PIO_CODR = ledMask[0];

pioa->PIO_SODR = (~ledMask[0]) & LED_MASK;

}

void deindicate(void)

{

pioa->PIO_SODR = ledMask[0];

}

void set_up_adc(void)

{

const unsigned int PRESCAL = (48e6 / 4e6 * 2) - 1;

const unsigned int STARTUP = 0x1F;

const unsigned int SHTIM = (4e6 * 2.75e-6) - 1;

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

adc->ADC_CHER = AT91C_ADC_CH4;

}

void mean_value(void)

{

mean = 0;

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

mean += res[i];

mean /= 3;

}

void measure(void)

{

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

{

adc->ADC_CR = AT91C_ADC_START;

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

const unsigned int adcCode = adc->ADC_CDR4 & 0xff;

const double rotation = ( ( ( (3.3 * adcCode) / ( 90 * 256 ) ) - 2e-3 ) * 3000 ) / 33e-3;

res[i] = rotation;

}

}

int main(void)

{

set_up_leds();

set_up_adc();

while (1)

{

measure();

mean_value();

if (mean < 1800 || mean > 2800)

indicate();

else

deindicate();

if (mean <= 0 || mean > 3000)

blink();

}

}