Измерение атмосферного давления

Просмотров: 28684Комментарии: 6
Электроника. СхемотехникаМикроконтроллеры AVR

В этой статье будем создавать устройство для измерения атмосферного давления используя АЦП микроконтроллера ATmega8 (не зря же мы так нудно разбирались с АЦП в статье – Аналого-цифровой преобразователь МК ATmega8). В первую очередь чтобы измерить давление нужен какой-нибудь датчик. Свой выбор я остановил на датчике абсолютного давления MPX4115А фирмы Motorola.  В зависимости от давления он выдает на выходе напряжение от 0.2 до 4.8В, что соответствует давлению от 15кПа до 115кПа. Наверное, главный недостаток это цена датчика. Мне он достался за честные глаза, но цена его где то в районе 15-18дол. Внешний вид его можно увидеть на фото, нумерация ножек начинается от метки (слева на фото, скол на ножке).

1 – Выходное напряжение (которое связано с давлением)

2 – Земля

3 – Напряжение питания (4.85…5.35В)

4, 5, 6 – Не используются

На рисунке показан внешний вид датчика и рекомендуемая схема включения

Но даже, если мы измерим напряжение на выходе датчика, мы та привыкли видеть давление в мм.рт.ст. или в Паскалях. Для того чтобы получить давление, как минимум, в Па в даташите есть график и формула для пересчета выходного напряжения в давление.

Преобразуем формулу к виду, который будет нам более полезен.

P=(0.95Vs+Vout)/0.009Vs

Ошибка при измерениях составляет 1% (при температуре окружающей среды в диапазоне 0…850С) и 3% (при температуре в дипазонах -40…00С, 85…1250С).

В общем с датчиком, думаю, более менее понятно. Теперь займемся реализацией. Начнем со схемы. Схему нарисуем в Proteus, чтобы потом иметь возможность смоделировать работу схемы и программы. Подключим к МК символьный дисплей для отображения результата измерений (см. Подключение библиотеки символьного ЖКИ в WinAVR).

На схеме не показана обвязка по питанию микроконтроллера. Теперь напишем управляющую программу. Для написания программы воспользуемся такой блок-схемой:

Чтобы можно было приступить к написанию программы нужно измеренное напряжение преобразовать в привычный нам вид давления, т.е. в мм.рт.ст. В Паскали переведем используя приведенную выше формулу. А чтобы получить результат в мм.рт. ст. вспомним, что  1 мм.рт.ст  равен 133.322 Па. Значит:

Давление в мм.рт.ст = (Давление в кПа *1000)/133.322;

А уже этот результат будем выводить на экран. Для получения значения напряжения воспользуемся функциями работы с АЦП, которые были приведены в статье - Аналого-цифровой преобразователь МК ATmega8. Исходник программы приведен в конце статьи. Код программы в WinAVR выглядит так:

#include <iom8.h>

#include <util/delay.h>

#include <avr/io.h>

#include "lcd_lib.h"

#include <math.h>

#include <stdio.h>

#define ADC_VREF_TYPE 0x00

#define VS 5//напряжение питания

// Функция возвращает результат преобразования АЦП

unsigned int read_adc(unsigned char adc_input)

{

ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);

// Задержка

_delay_us(10);

// Начинаем преобразование АЦП

ADCSRA|=0x40;

// Ждем пока преобразование закончится

while ((ADCSRA & 0x10)==0);

ADCSRA|=0x10;

return ADCW;

}

// объявляем глобальные переменные

char lcd_buffer[16];

float p;

unsigned int ptemp;

int main()

{

unsigned int adc_res;

unsigned long int p0=101325;

// Инициализация АЦП

// Частота: 125,000 kHz

// Опорное напряжение: AREF

ADMUX=ADC_VREF_TYPE & 0xff;

ADCSRA=0x84;

LCDinit();

while(1)

{

//Давление. Vout =adc_res*VS/1023 = adc_res*0.00488, что и подставили в формулу для p

        adc_res=read_adc(0);

        p=(adc_res*0.00488+0.095*VS)/(0.009*VS);

        ptemp=(1000*p)/133.322;

//Отображение на экране результата 

        sprintf(lcd_buffer, "P=%i", ptemp);

        LCDclr();

        LCDGotoXY(0,0);

        LCDstring(lcd_buffer, 16);

        _delay_ms(1000);

}

}

Не привожу код в CodeVision, потому что там всю программу можно (кроме формул) получить используя автокодинг. Если хотите сделайте это как самостоятельное задание и проверьте программу в Proteus, собрав схему, которая приведена выше.

Конечно же, как минимум, не рационально использовать МК mega8 для измерения только давления, но у меня есть дальнейшие планы по усовершенствованию этого устройства. И, в случае чего,  думаю, переделать программу под другой МК не составит особого труда.


Datasheet MPX4115

Исходник в_WinAVR

Комментариев: 6 RSS

1 Комментатор 14 16-05-2011 23:22

Здравствуйте подскажите пожалуйста у меня проблема собрал все вроде работает только вот разброс показаний 600-750 т.е с периодическим нарастанием и спадом в чем проблема в питании АЦП?

2 Dmitry 17-05-2011 02:36

т.е. постепенно нарастает от 600 до 750, а потом обратно?

а что используется для питания АЦП?

3 Сергей 14-04-2014 18:38

хозяин статьи отпишитесь и оставьте свою страничку вк или маил буду благодарен

4 Иван 08-06-2014 22:38

#define ADC_VREF_TYPE 0x00 вот 0x00 что это значение обозночяет ??

5 Иван 08-06-2014 22:39

ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); это опишите подробней

6 Денис 17-09-2014 10:36

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

1.86-1.89В. И больше не меняется ни в какую сторону. Ответа нигде найти не могу, мож дохлый датчик попался? стоит-то не дешего он...

Оставьте комментарий!

grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки.

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)