Цифровой барометр
Развитие и применение микропроцессоров как одно из направлений научно-технического прогресса. Разработка структурной и принципиальной схемы разрабатываемого устройства, анализ функциональности. Алгоритм работы управляющей программы: работа и требования.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 11.12.2015 |
Размер файла | 459,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Цифровой барометр
Введение
программа микропроцессор управляющий барометр
Одним из важнейших направлений научно-технического прогресса является развитие и применение микропроцессоров. Их малые размеры, высокая надежность, большие вычислительные и логические способности позволяют создавать контролирующие, управляющие и обрабатывающие цифровые устройства высокого качества и низкой стоимости. Начиная с 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. Разработка алгоритма работы управляющей программы
В общем виде управляющая программа показана на рисунке 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.5 - Блок-схема подпрограммы Temperature (int Tin, int Tout)
Рисунок 3.6 - Блок-схема подпрограммы CalcTemperature (float AD)
Для отображения обработанной информации используется подпрограмма DispString (char Str[10]). После установления начального адреса символу с каждой позиции переданной строки устанавливается соответствие из массива SegmentMap[30], который содержит передаваемые на семисегментный дисплей коды символов. Блок-схема данной подпрограммы изображена на рисунке 3.7.
Рисунок 3.7 - Блок-схема подпрограммы DispString (char Str[10])
4. Разработка управляющей программы
Листинг управляющей программы:
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
float Kmm = 0.00750063755419211
byte StPin = 4; //start pin No for output 4 bits DB0-DB3
byte WR1pin = 8; //pin No for WR1
byte WR2pin = 9; //pin No for WR1
byte ADpin = 10; // address/data signal
int sensorPin = A0; // select the input pin for the potentiometer
int ledPin = 13; //select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
byte SegmentMap[30] = {B11101110, B01100000, B00101111, B01101101, B11100001,
B11001101, B11001111, B01101000, B11101111, B11101101,
B00100011, B11000001, B11100110, B11101010, B10101001,
B10001110, B00000001, 0, B01000011, 0,
B11111110, B01110000, B00111111, B01111101, B11110001,
B11011101, B11011111, B01111000, B11111111, B11111101};
byte MaskLow[4] = {B00000001, B00000010, B00000100, B00001000};
byte MaskHigh[4] = {B00010000, B00100000, B01000000, B10000000};
char InfoPress[10];
char InfoTemp[10];
#define ArrSize 20
int TStep[ArrSize] = {-40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55};
int ADval[ArrSize] = {884, 842, 794, 738, 677, 612, 545, 480, 417, 359, 307, 260, 220, 185, 155, 130, 109, 92, 77, 65};
int Tout=0;
void setup() {
Serial.begin(9600);
if (! bmp. Begin())
{
Serial.println («Could not find a valid BMP085 sensor, check wiring!»);
while (1) {}
}
InitScreen();
}
void loop() {
ClearScreen();
Pressure (bmp.readPressure()*Kmm);
Tout=CalcTemperature (analogRead(sensorPin));
Temperature (bmp.readTemperature(), Tout*1.286);
DispString(InfoPress);
delay(3000);
DispString(InfoTemp);
delay(3000);
}
void DispString (char Str[10]) {
byte i=0;
WriteAddr0 ();
for (i=0; i<=10; i++) {
DispChar (Str[i]);}
}
void InitScreen() {
byte pin=0;
//Assign pins for LCD
pinMode (WR1pin, OUTPUT);
pinMode (WR2pin, OUTPUT);
pinMode (ADpin, OUTPUT);
for (pin=StPin; pin<=StPin+3; pin++) {
pinMode (pin, OUTPUT);}
//Init service pins
digitalWrite (WR1pin, LOW);
digitalWrite (WR2pin, LOW);
digitalWrite (ADpin, HIGH);
//Unblock LCD trigger
for (pin=StPin; pin<=StPin+3; pin++) {
digitalWrite (pin, HIGH);}
StrobeAD();
}
/////////////////////////////////////////////////////////////////////////////////////////////
void ClearScreen() {
byte i=0;
WriteAddr0 ();
for (i=0; i<=9; i++) {
DataClr();}
}
//////////////////////////////////////////////////////////////////////////////////////////
void Pressure (float P)
{
int pos1, pos2, pos3, pos4, pos5;
pos1=P/100;
pos2=(P-pos1*100)/10;
pos3=P-pos1*100-pos2*10;
pos4=(P-pos1*100-pos2*10-pos3)*10;
pos5=(P-pos1*100.0-pos2*10.0-pos3-pos4/10)*100;
InfoPress[0]=pos1;
InfoPress[1]=pos2;
InfoPress[2]=pos3+20;
InfoPress[3]=pos4;
InfoPress[4]=pos5;
InfoPress[5]=17;
InfoPress[6]=18;
InfoPress[7]=18;
InfoPress[8]=18;
InfoPress[9]=18;
}
////////////////////////////////////////////////////////////////////////
void Temperature (double Tin, double Tout)
{
InfoTemp[0]=TempSign(Tin);
InfoTemp[1]=TempConvers1 (Tin);
InfoTemp[2]=TempConvers2 (Tin);
InfoTemp[3]=14;
InfoTemp[4]=15;
InfoTemp[5]=TempSign(Tout);
InfoTemp[6]=TempConvers1 (Tout);
InfoTemp[7]=TempConvers2 (Tout);
InfoTemp[8]=14;
InfoTemp[9]=15;
}
//////////////////////////////////////////////////////////////////////////////////////
int TempConvers1 (double T)
{int pos1;
pos1=abs(T)/10;
return pos1;
}
/////////////////////////////////////////////////////////////////////////////////////
int TempConvers2 (double T)
{int pos2;
pos2=abs(T) - TempConvers1 (T)*10;
return pos2;
}
///////////////////////////////////////////////////////////////////////////////
int TempSign (double T)
{if (T>=0) {return 17;}
else {return 16;}
}
////////////////////////////////////////////////////////////
float CalcTemperature (int AD)
{int p=1, q=ArrSize, s;
float TempPrev, TempItog, del, porAD;
while (p<q)
{
s=(p+q)/2;
if (ADval[s]>=AD)
{
p=s+1;
}
else
{q=s;
}
}
TempPrev=TStep [s-1];
del=(5.0/(ADval [s-1] - ADval[s]));
TempItog=TempPrev+(ADval[s] - AD)*del;
return TempItog;
}
//////////////////////////////////////////////////////////
void StrobeAD() {
digitalWrite (ADpin, LOW);
digitalWrite (WR1pin, HIGH);
delayMicroseconds(1);
digitalWrite (WR1pin, LOW);
digitalWrite (ADpin, HIGH);
}
////////////////////////////////////////////////////////////////
void WriteAddr0 () //write address 00 to LCD
{int pin=0;
for (pin=StPin; pin<=StPin+3; pin++) {
digitalWrite (pin, LOW);}
StrobeAD();
}
/////////////////////////////////////////////////
void DispChar (byte Code) {
int Ln=0;
//Display Low part
for (Ln=0; Ln<=3; Ln++) {
digitalWrite (StPin+Ln, (SegmentMap[Code] & MaskLow[Ln]));}
StrobeWR();
//Display High part
for (Ln=0; Ln<=3; Ln++) {
digitalWrite (StPin+Ln, (SegmentMap[Code] & MaskHigh[Ln]));
}
StrobeWR();
}
/////////////////////////////////////////////////////
void StrobeWR() {
digitalWrite (WR1pin, HIGH);
delayMicroseconds(1);
digitalWrite (WR1pin, LOW);
}
/////////////////////////////////////////////////////////
void DataClr() {
int pin=0;
for (pin=StPin; pin<=StPin+3; pin++) {
digitalWrite (pin, LOW);}
StrobeWR();
StrobeWR();
}
Заключение
В данной курсовой работе продемонстрирована возможность разработки цифровых устройств на микроконтроллере ATMega328 в составе инструмента для проектирования электронных устройств Arduino Uno R3.
Конечным результатом проведенной работы являются электронный барометр с возможностью измерения температуры, его структурная и принципиальная схемы цифрового, а также алгоритм функционирования системы и листинг программы.
Таким образом, цели работы курсового проектирования были достигнуты в полном объеме.
Список источников
1. Каган Б.М., Сташин В.В. Основы проектирования микропроцессорных устройств автоматики. - М.: Энергоатомиздат, 1987.
2. Хартов В.Я. Микроконтроллеры AVR/. Практикум для начинающих. - М.: Изд-во МГТУ им. Н.Э. Баумана, 2007.
3. Петин В. Проекты с использованием контроллера Arduino. - M.: BHV, 2015.
Размещено на Allbest.ru
Подобные документы
Разработка структурной схемы устройства. Принцип работы его блоков: источника напряжения, цифрового программируемого устройства, семисегментного дисплея, датчиков давления и температуры. Разработка алгоритма работы управляющей программы, ее блок-схема.
курсовая работа [2,5 M], добавлен 23.06.2015В работе на базе PIC-контроллера реализуется цифровой секундомер. Выбор технических требований к устройству, к питанию. Разработка структурной схемы, принципиальной электрической схемы, алгоритма работы управляющей программы, управляющей программы.
курсовая работа [427,1 K], добавлен 20.06.2008Разработка функционально законченного устройства для обработки входных сигналов линии с использованием цифровых устройств и аналого-цифровых узлов. Алгоритм работы устройства. Составление программы на языке ассемблера. Оценка быстродействия устройства.
курсовая работа [435,5 K], добавлен 16.12.2013Разработка структурной и принципиальной схемы устройства. Микроконтроллер PIC16F886, температурные и электрические характеристики. Четырехразрядный семисегментный светодиодный индикатор. Разработка алгоритма управляющей программы, общий алгоритм.
курсовая работа [497,4 K], добавлен 31.01.2013Особенности проектирования микропроцессорного устройства "Цифровой осциллограф". Выбор микроконтроллера, описание периферийных устройств. Разработка принципиальной схемы устройства и программы для микроконтроллера, осуществляющей все функции устройства.
курсовая работа [923,5 K], добавлен 24.12.2012Разработка и описание алгоритма функционирования устройства, отладка рабочей программы на языке команд микропроцессора. Обоснование аппаратной части устройства. Составление электрической принципиальной схемы устройства, расчет быстродействия устройства.
курсовая работа [50,2 K], добавлен 03.12.2010Анализ технического задания. Оценка достоверности цифровой информации в канале связи. Выбор типа структурной схемы радиоприёмника. Разработка функциональной схемы. Применение приборов с переносом заряда. Проектирование схемы информационного тракта.
курсовая работа [2,0 M], добавлен 13.05.2009Однокристальные микро-ЭВМ, предназначенные для использования в бытовой радиоэлектронной аппаратуре. Обоснование технических требований к устройству. Разработка структурной и принципиальной электрической схем устройства. Алгоритм управляющей программы.
курсовая работа [159,9 K], добавлен 19.06.2010Исследование абстрактного цифрового автомата Мили заданного устройства. Алгоритм его работы, таблицы прошивки и возбуждения постоянного запоминающего устройства. Составление функции возбуждения, функциональной и электрической принципиальной схемы.
курсовая работа [758,5 K], добавлен 18.02.2011Проектирование функциональной и принципиальной схем цифрового вольтметра. Выбор устройства управления (микроконтроллера), источника и инвертора напряжения, индикаторов. Функции и структура управляющей программы, ее алгоритм и глобальные переменные.
курсовая работа [84,8 K], добавлен 14.03.2014