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