Разработка устройства нахождения минимального давления при помощи микроконтроллера ATMega324P

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



для всех элементов данной категории +5 V.

Следующий блок - это микроконтроллер. Рассмотрим подключенные к схеме выводы микроконтроллера.

Выводы с 33 по 40 это выводы аналогово-цифрового преобразователя. Так как у данного микроконтроллера 8 выводов АЦП, а мы используем 7 датчиков, то один вывод не будет задействован.

Выводы 14 и 15, это выводы последовательного протокола передачи данных USART. 14 вывод RXD0 отвечает за принятые данные, 15 TXD0 за отправленные данные. Индекс 0 означает, что мы используем первые USART из двух доступных в нашем протоколе.

Подключенные вывод AVCC к источнику питания в +5V показывает, что опорное напряжение питания микроконтроллера было взято именно с него, для корректной работы аналогово-цифрового преобразователя. Так же как источник опорного напряжения можно использовать вывод AREF. Это может быть напряжение со специальной микросхемы опорного напряжения, или же со стабилитрона. Если нужно замерять небольшое напряжение, заметно меньшее чем напряжение питания, скажем от 0 до 1 вольт, то чтобы было точнее, и чтобы оно не затерялось на фоне пятивольтового питания, то на AREF мы заводим опорное напряжение в 1 вольт. Еще можно использовать внутренний источник опорного напряжения +2.56V. Но данный источник имеет явные недостатки. Если брать данные с него, то показания сильно плавают и бывают, не стабильны. Кое-как исправить ситуацию можно поставив конденсатор на вход AREF (оттуда берется питание для внутреннего источника).

Напряжение питание самого микроконтроллера так же берется из источника в +5V, так как он не маломощный. Более простые МК данного семейства могут использовать меньшее напряжение питания. Вывод, на который подается питание, обозначен под номером 5.

Третьи блок представляет собой микросхему преобразователь MAX232.

Для корректной работы необходимо подключить дополнительно к ножкам микросхемы четыре конденсатора емкостью 1мкФ. С1 и С2 выполняют роль корректировки работы микросхемы, С3 и С4 являются сглаживающими элементами. Так как они подключены к проводам, где подпитывается микросхема. Особенностью питания MAX232 является то, что она берет ток из интерфейса RS-232.

Элементы U2 и U3 являются инверторами. Они необходимы для корректной передачи данных, так как MAX232 использует, инвертированные сигналы. Подключение ножек к выводам со стороны МК осуществляется по следующему принципу: из RXD0 микроконтроллера через U3 на R1OUT микросхемы MAX232, а TXD0 напрямую к T1IN. Подключение со стороны последовательного интерфейса RS232: из T1OUT через U2 на TXD порта RS232, а R1IN напрямую RXD порта RS232. Временная диаграмма и схема электрическая принципиальная представлена в приложении Б и В соответственно.

5.Разработка программного обеспечения

давление датчик микроконтроллер программный

Для корректной работы разработанного нами устройства необходимо корректное управление микроконтроллером. Для этого необходимо написать программное обеспечение для микроконтроллера - прошивка или набор команд управления микроконтроллером.

Выбор среды разработки программного обеспечения был остановлен на CodeVisionAVR. CodeVisionAVR - пакет разработки программного обеспечения для микроконтроллеров семейства AVR. Он поддерживает все современные чипы данного семейства. Встроенные компиляторы языков Assembler и С открывают большие возможности в использование микроконтроллеров.

Так как язык C более применяем в больших проектах, где требуется использовать большое количество сложных алгоритмов, которые сложно написать на языке Assembler. При анализе задание на курсовой проект было выявлено, что, при написании прошивки на Assembler-е, позволит более детально оптимизировать процесс работы, но разработка на языке С проще. Для реализации прошивки был выбран язык С.

При написании прошивки были сделаны выводы, что оптимальная частота дискретизации лежит в границах 50-200кГц, соответственно время на обработку входных данных необходимо больше.

Код прошивки:

#include

#include

#include

#define FIRST_ADC_INPUT 0

#define LAST_ADC_INPUT 6char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];

#define ADC_VREF_TYPE 0x60[ADC_INT] void adc_isr(void)

{unsigned char input_index=0;_data[input_index]=((ADCH/5)+0.095)/0.009;(++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))_index=0;=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;_us(10);|=0x40;

}main(void)

{char i,min,rec;

#pragma optsize-=0x80;=0x00;

#ifdef _OPTIMIZE_SIZE_

#pragma optsize+

#endif=0x00;=0x00;=0x00;=0x00;=0x00;=0x00;=0x00;=0x00;A=0x00;B=0x00;=0x00;A=0x00;B=0x00;A=0x00;B=0x00;H=0x00;

TCNT1L=0x00;H=0x00;L=0x00;

OCR1AH=0x00;AL=0x00;BH=0x00;BL=0x00;=0x00;A=0x00;B=0x00;=0x00;A=0x00;B=0x00;=0x00;=0x00;=0x00;=0x00;=0x00;=0x00;A=0x00;B=0x18;C=0x06;H=0x00;L=0x33;=0x80;=0x00;=0x00;=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);=0xEE;&=0xF8;

#asm("sei")(1)

{("%c",&rec);_ms(1);(rec=='s')

{

#asm("sleep")=adc_data[0];(i=1;i<LAST_ADC_INPUT-FIRST_ADC_INPUT+1;i++)

{(min<adc_data[i])=adc_data[i];

}("%d",min);

rec=0;

}

}

}

Для компьютера в Visual Studio 2008 был написан драйвер код которого приведен дальше.

Исходный код драйвера:

// comport.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include

#include

#include int ATTEMPTS=3;int TIMEOUT=150;Connect(HANDLE *handle, const char *port, int speed)

{

*handle=CreateFile(port,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);(*handle==INVALID_HANDLE_VALUE)

{=0;1;

}(handle,EV_RXCHAR);(handle,1500,1500);CommTimeOuts;.ReadIntervalTimeout = 0xFFFFFFFF;.ReadTotalTimeoutMultiplier = 0;.ReadTotalTimeoutConstant = TIMEOUT;.WriteTotalTimeoutMultiplier = 0;.WriteTotalTimeoutConstant = TIMEOUT;(!SetCommTimeouts(*handle, &CommTimeOuts))

{=0;2;

}ComDCM;(&ComDCM,0,sizeof(ComDCM));.DCBlength = sizeof(DCB);(handle, &ComDCM);.BaudRate = DWORD(speed);.ByteSize = 8;.Parity = NOPARITY;.StopBits = ONESTOPBIT;.fAbortOnError = TRUE;.fDtrControl = DTR_CONTROL_DISABLE;.fRtsControl = RTS_CONTROL_DISABLE;.fBinary = TRUE;.fParity = FALSE;.fInX = ComDCM.fOutX = FALSE;.XonChar = 0;.XoffChar = (unsigned char)0xff;.fErrorChar = FALSE;.fNull = FALSE;.fOutxCtsFlow = FALSE;.fOutxDsrFlow = FALSE;.XonLim = 128;.XoffLim = 128;(!SetCommState(*handle,&ComDCM))

{=0;3;

}0;