Цифровой барометр

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информатика, ВТ, телекоммуникации
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    198,88 Кб
  • Опубликовано:
    2015-12-11
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Цифровой барометр







Цифровой барометр


Введение

программа микропроцессор управляющий барометр

Одним из важнейших направлений научно-технического прогресса является развитие и применение микропроцессоров. Их малые размеры, высокая надежность, большие вычислительные и логические способности позволяют создавать контролирующие, управляющие и обрабатывающие цифровые устройства высокого качества и низкой стоимости. Начиная с 1971 года, объемы ежегодного производства микроконтроллеров в несколько раз превышают объемы производства процессоров.

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

На сегодняшний день существует более 200 модификаций микроконтроллеров, среди которых популярностью пользуются 8-битные микроконтроллеры PIC фирмы Microchip Technology, AVR фирмы Atmel, 16-битные MSP430 фирмы TI, а также 32-битные микроконтроллеры архитектуры ARM, которую разрабатывает фирма ARM.



1. Разработка структурной схемы устройства

Структурная схема цифрового барометра приведена на рисунке 1.1. Устройство состоит из четырех блоков: источника напряжения, цифрового программируемого устройства, семисегментного дисплея, датчика атмосферного давления и температуры в помещении и датчика внешней температуры.

Рисунок 1.1 - Структурная схема цифрового барометра

Основой цифрового барометра является цифровое программируемое устройство (ЦПУ). Его основой является микроконтроллер ATMega328 в составе модуля Arduino Uno R3. Оно выполняет такие функции, как получение значений температуры и давления с датчиков, обработка полученных данных и вывод информации на дисплей.

Датчик BMP085 измеряет атмосферное давление с высокой точностью, а также получает данные о температуре воздуха и высоты над уровнем моря. Он отличается производительностью, точностью (минимальное значения измерения давления - 0.03hPa) и очень низким энергопотреблением.

Принцип действия датчика внешней температуры состоит в использовании термистора - полупроводникового прибора, электрическое сопротивление которого изменяется в зависимости от его температуры. ЦПУ получает значение падения напряжения с термистора, преобразует его в цифровой код и передает его в управляющую программу. Расчет значения температуры производится путем сопоставления полученного напряжения значению из таблицы соответствующих температур (таблицы температур находятся в технической документации термистора).

Жидкокристаллический модуль МТ-10Т7 состоит из БИС контроллера и ЖК панели и может отображать 10 знакомест.

2. Разработка принципиальной схемы

Принципиальная схема устройства показана на рисунке 2.1. Входное напряжение подается на вход VCC датчика давления, на вход VSS дисплея и в цепь с термистором, выполняющую функцию датчика внешней температуры.

Выводы датчика BMP085 SCL и SDA подключены к портам Arduino Uno A5/SCL и A4/SDA соответственно. Посредством этих выводов на Arduino осуществляется связь I2C и передача информации между датчиком и микропроцессором.

Порт назначения адреса А дисплея подключен к выводу D10 Arduino Uno, порты DB0-DB3, выполняющие функцию шин адреса / данных, подключены к D7-D4 соответственно. Порты дисплея R/W и RS предназначены для записи данных в модуль, подключены к выводам D9 и D8. Порты D4-D10 являются цифровыми входами, из которых D5, D6, D9, D10 обеспечивают широтно-импульсную модуляцию с разрешением 8 бит для получения изменяющегося аналогового сигнала.

Принципиальная схема Arduino Uno показана на рисунке 2.2.


Рисунок 2.1 - Схема электрическая принципиальная цифрового барометра

Рисунок 2.2 - Схема электрическая принципиальная Arduino Uno

Для рассматриваемого устройства спецификация приведена в таблице 2.1.


Таблица 2.1 - Перечень элементов схемы электрической принципиальной разрабатываемого устройства

Обозначение

Наименование

Кол.

Примечание

Микросхемы

DD1

Uno Arduino

1


Дисплей

DD2

ЖК модуль МТ-10Т7

1


Резисторы

R1

Резистор выводной - 10 кОм

1


R2

Термистор - 2,2 кОм

1


Конденсаторы

C1

Конденсатор - 100 нФ

1


C2-C3

Конденсатор - 0.1 мкФ

2


Дроссели

L2

Дроссель выводной - 10 мкГн

1


. Разработка алгоритма работы управляющей программы

В общем виде управляющая программа показана на рисунке 3.1.

Рисунок 3.1 - Общий вид управляющей программы


Общая блок-схема программы представлена на рисунке 3.1. При подключении питания однократно выполняется подпрограмма setup(), проверяющая подключение датчика и инициализирующая дисплей. После этого циклически выполняется подпрограмма loop(), которая считывает и преобразует полученные с датчиков данные в понятную пользователю форму и выводит информацию на дисплей, до того момента, пока питание не будет отключено. Показания давления и температуры сменяют друг друга с интервалом в три секунды. Блок-схемы программ setup() n loop() представлены на рисунках 3.2, 3.3.

Рисунок 3.2 - Блок-схема подпрограммы setup()


Рисунок 3.3 - Блок-схема подпрограммы loop()

Показание атмосферного давления считывается с датчика BMP085, умножается на переводной множитель Kmm для перевода из паскалей в миллиметры ртутного столба и передаются в подпрограмму Pressure (float P), где обрабатывается для корректного вывода на дисплей. Преобразованные данные (значения разрядов числового значения давления с точностью до 0,01 мм ртутного столба) передаются в строку InfoPress[10].

Показание температуры внутри помещения считывается с датчика BMP085 и аналогично значению давления передается в подпрограмму Temperature (int Tin, int Tout).

Механизм считывания и обработки внешней температуры несколько сложнее. В качестве датчика внешней температуры использован терморезистор, поэтому прежде, чем передавать полученное значение в подпрограмму Temperature (int Tin, int Tout), требуется провести линейную интерполяцию полученного значения напряжения с термистора и соотнести полученное значение падения напряжения с соответствующим значением температуры. Для этого полученное значение напряжение передается в подпрограмму CalcTemperature (float AD), которое возвращает значение температуры. После этого полученное числовое значение передается в подпрограмму Temperature (int Tin, int Tout) вместе со значением внутренней температуры. Значение Tout умножается на поправочный множитель 1,286 для минимизации погрешности. Обработанная информация заносится в строку InfoTemp[10]. Блок-схемы подпрограмм Pressure (float P), Temperature (int Tin, int Tout) и CalcTemperature (float AD) приведены на рисунках 3.4, 3.5, 3.6.

Рисунок 3.4 - Блок-схема подпрограммы Pressure (float P)



Рисунок 3.6 - Блок-схема подпрограммы CalcTemperature (float AD)

Для отображения обработанной информации используется подпрограмма DispString (char Str[10]). После установления начального адреса символу с каждой позиции переданной строки устанавливается соответствие из массива SegmentMap[30], который содержит передаваемые на семисегментный дисплей коды символов. Блок-схема данной подпрограммы изображена на рисунке 3.7.

Рисунок 3.7 - Блок-схема подпрограммы DispString (char Str[10])

. Разработка управляющей программы

Листинг управляющей программы:

#include <Wire.h>

#include <Adafruit_BMP085.h>

_BMP085 bmp;

float Kmm = 0.00750063755419211

StPin = 4; //start pin No for output 4 bits DB0-DB3WR1pin = 8; //pin No for WR1WR2pin = 9; //pin No for WR1ADpin = 10; // address/data signal

int sensorPin = A0; // select the input pin for the potentiometerledPin = 13; //select the pin for the LEDsensorValue = 0; // variable to store the value coming from the sensor

SegmentMap[30] = {B11101110, B01100000, B00101111, B01101101, B11100001,, B11001111, B01101000, B11101111, B11101101,, B11000001, B11100110, B11101010, B10101001,, B00000001, 0, B01000011, 0,, B01110000, B00111111, B01111101, B11110001,, B11011111, B01111000, B11111111, B11111101};

MaskLow[4] = {B00000001, B00000010, B00000100, B00001000};MaskHigh[4] = {B00010000, B00100000, B01000000, B10000000};

InfoPress[10];InfoTemp[10];

#define ArrSize 20TStep[ArrSize] = {-40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55};ADval[ArrSize] = {884, 842, 794, 738, 677, 612, 545, 480, 417, 359, 307, 260, 220, 185, 155, 130, 109, 92, 77, 65};Tout=0;

setup() {.begin(9600);(! bmp. Begin())

{.println («Could not find a valid BMP085 sensor, check wiring!»);(1) {}

}();

}

loop() {();

(bmp.readPressure()*Kmm);=CalcTemperature (analogRead(sensorPin));(bmp.readTemperature(), Tout*1.286);

(InfoPress);(3000);(InfoTemp);(3000);

}

DispString (char Str[10]) {i=0;();(i=0; i<=10; i++) {(Str[i]);}

}

InitScreen() {pin=0;

//Assign pins for LCD(WR1pin, OUTPUT);(WR2pin, OUTPUT);(ADpin, OUTPUT);(pin=StPin; pin<=StPin+3; pin++) {(pin, OUTPUT);}

//Init service pins(WR1pin, LOW);(WR2pin, LOW);(ADpin, HIGH);

//Unblock LCD trigger(pin=StPin; pin<=StPin+3; pin++) {(pin, HIGH);}();

}

///////////////////////////////////////////////////////////////////////////////////////////// ClearScreen() {i=0;();(i=0; i<=9; i++) {();}

}

////////////////////////////////////////////////////////////////////////////////////////// Pressure (float P)

{pos1, pos2, pos3, pos4, pos5;

=P/100;=(P-pos1*100)/10;=P-pos1*100-pos2*10;=(P-pos1*100-pos2*10-pos3)*10;=(P-pos1*100.0-pos2*10.0-pos3-pos4/10)*100;


InfoPress[0]=pos1;[1]=pos2;[2]=pos3+20;[3]=pos4;[4]=pos5;[5]=17;[6]=18;[7]=18;[8]=18;[9]=18;

}

//////////////////////////////////////////////////////////////////////// Temperature (double Tin, double Tout)

{[0]=TempSign(Tin);[1]=TempConvers1 (Tin);[2]=TempConvers2 (Tin);[3]=14;[4]=15;[5]=TempSign(Tout);[6]=TempConvers1 (Tout);[7]=TempConvers2 (Tout);[8]=14;[9]=15;

}

////////////////////////////////////////////////////////////////////////////////////// TempConvers1 (double T)

{int pos1;=abs(T)/10;pos1;

}

///////////////////////////////////////////////////////////////////////////////////// TempConvers2 (double T)

{int pos2;=abs(T) - TempConvers1 (T)*10;pos2;

}

/////////////////////////////////////////////////////////////////////////////// TempSign (double T)

{if (T>=0) {return 17;}{return 16;}

}

//////////////////////////////////////////////////////////// CalcTemperature (int AD)

{int p=1, q=ArrSize, s;TempPrev, TempItog, del, porAD;

(p<q)

{=(p+q)/2;(ADval[s]>=AD)

{=s+1;

}

{q=s;

}

}


TempPrev=TStep [s-1];=(5.0/(ADval [s-1] - ADval[s]));=TempPrev+(ADval[s] - AD)*del;TempItog;

}

////////////////////////////////////////////////////////// StrobeAD() {(ADpin, LOW);(WR1pin, HIGH);(1);(WR1pin, LOW);(ADpin, HIGH);

}

//////////////////////////////////////////////////////////////// WriteAddr0 () //write address 00 to LCD

{int pin=0;(pin=StPin; pin<=StPin+3; pin++) {(pin, LOW);}();

}

///////////////////////////////////////////////// DispChar (byte Code) {Ln=0;

//Display Low part(Ln=0; Ln<=3; Ln++) {(StPin+Ln, (SegmentMap[Code] & MaskLow[Ln]));}();

//Display High part(Ln=0; Ln<=3; Ln++) {(StPin+Ln, (SegmentMap[Code] & MaskHigh[Ln]));

}

///////////////////////////////////////////////////// StrobeWR() {(WR1pin, HIGH);(1);(WR1pin, LOW);

}

///////////////////////////////////////////////////////// DataClr() {pin=0;(pin=StPin; pin<=StPin+3; pin++) {(pin, LOW);}();();

}

Заключение

В данной курсовой работе продемонстрирована возможность разработки цифровых устройств на микроконтроллере ATMega328 в составе инструмента для проектирования электронных устройств Arduino Uno R3.

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

Таким образом, цели работы курсового проектирования были достигнуты в полном объеме.


Список источников

1. Каган Б.М., Сташин В.В. Основы проектирования микропроцессорных устройств автоматики. - М.: Энергоатомиздат, 1987.

2.      Хартов В.Я. Микроконтроллеры AVR/. Практикум для начинающих. - М.: Изд-во МГТУ им. Н.Э. Баумана, 2007.

.        Петин В. Проекты с использованием контроллера Arduino. - M.: BHV, 2015.


Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!