
- •2.1. Аналого-цифровые преобразователи в pic-микроконтроллерах
- •2.2. Библиотека функций управления аналогово-цифровым преобразователем компилятора с18
- •3. Порядок выполнения работы
- •3.1. Разработка мку для измерения и индикации величины аналогового напряжения
- •3.2. Задание для самостоятельной работы
- •5. Содержание отчета
3.2. Задание для самостоятельной работы
Требуется разработать МКУ, состоящее из микроконтроллера PIC18F242, ЖК-дисплея и двух кнопок. МКУ должно измерять два аналоговых напряжения и выводить результаты на ЖК-дисплей. Схема МКУ (при моделировании ее в Proteus) приведена на рис. 2.
МКУ должно выполнять следующий алгоритм. После запуска программы и разомкнутых контактах кнопок SB1, SB2 на дисплей выводится текст приглашения (Нажмите только одну клавишу: SB1 или SB2) в виде:
Press only one
key: SB1 or SB2
При нажатии кнопки SB1 (замыкании ее контакта) МК производит измерение напряжения U1, и на дисплей выводится результат измерения в виде:
U1 = 2500 mV
U1 = 2,50 V
При нажатии кнопки SB2 (замыкании ее контакта) МК производит измерение напряжения U2, и на дисплей выводится результат измерения в виде:
U2 = 3000 mV
U2 = 3,00 V
В случае одновременного нажатия двух кнопок SB1 и SB2 на экран дисплея выводится текст сообщения об ошибке (одновременного нажатия кнопок) в виде:
Error. Two keys
are pressed
Рис. 2. Принципиальная схема МКУ к заданию
Разработку МКУ можно вести в следующей последовательности.
3.2.1. Запустите программу MPLAB IDE и выберите тип микроконтроллера.
3.2.2. Создайте проект с именем pr16 в новой папке, которую можно назвать proj16.
3.2.3. Наберите текст программы работы МКУ adc2.c в окне редактора (используйте цветовую кодировку текста при наборе) и сохраните его в папке proj16.
/*******************************************
adc2.c – программа измерения двух напряжений и вывода результата на ЖКД
****************************************************/
#include<p18f242.h>
#include<stdio.h> // заголовочный файл для библиотеки функций вывода
#include<xlcd.h> // заголовочный файл для библиотеки функций ЖКД
#include<delays.h> // заголовочный файл для библиотеки функций задержек
#include<adc.h> // заголовочный файл для библиотеки функций АЦП
#pragma config WDT=OFF, OSC=HS // установка битов конфигурации МК
void init(void); // прототип функции инициализации
unsigned int adconv1(void); // прототип функции АЦ-преобразования
// напряжения U1
unsigned int adconv2(void); // прототип функции АЦ-преобразования
// напряжения U2
void out_u1(unsigned int ad_res1); // прототип функции вывода на ЖКД
// напряжения U1
void out_u2(unsigned int ad_res2); // прототип функции вывода на ЖКД
// напряжения U2
void out_invite(void); // прототип функции вывода на ЖКД
// текста приглашения
void out_error(void); // прототип функции вывода на ЖКД
// текста сообщения об ошибке
char line[17]; // объявление строчной переменной для вывода на ЖКД
unsigned int ad_res1; // объявление переменной для хранения результата
// АЦ-преобразования напряжения U1
unsigned int ad_res2; // объявление переменной для хранения результата
// АЦ-преобразования напряжения U2
void main(void)
{
init( ); // вызов функции инициализации
again:
{
if((PORTCbits.RC0==1) && (PORTCbits.RC1==1)) // если кнопки
// SB1 и SB2 не нажаты
{
out_invite( ); // вывод на ЖКД приглашения
goto again;
}
if((PORTCbits.RC0==0) && (PORTCbits.RC1==1) ) // если нажата
// кнопка SB1
{
adconv1( ); // АЦ-преобразование напряжения U1
out_u1(ad_res1); // вывод на ЖКД результата измерения U1
goto again;
}
if((PORTCbits.RC0==1) && (PORTCbits.RC1==0) ) // если нажата
// кнопка SB2
{
adconv2( ); // АЦ-преобразование напряжения U2
out_u2(ad_res2); // вывод на ЖКД результата измерения U2
goto again;
}
if((PORTCbits.RC0==0) && (PORTCbits.RC1==0)) // если нажаты
// одновременно SB1 и SB2
{
out_error( ); // вывод на ЖКД сообщения об ошибке
goto again;
}
}
} // конец главной программы
void init(void) // функция инициализации
{
// инициализация МК
PORTA = 0;
TRISA = 0b00000011; // настроить 0-й и 1-й разряды порта А на ввод
PORTB = 0;
TRISB = 0; // настроить все разряды порта В на вывод
PORTC = 0;
TRISC = 0b00000011; // настроить 0-й и 1-й разряды порта С на ввод
// инициализация ЖКД
OpenXLCD(FOUR_BIT & LINES_5X7);
while(BusyXLCD( ));
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
// инициализации модуля АЦП
OpenADC(ADC_FOSC_4 & ADC_RIGHT_JUST & ADC_3ANA_0REF,
ADC_CH0 & ADC_INT_OFF);
/* Эта функция задает тактирование АЦП от генератора МК, коэффициент деления частоты FOSC равен 4; правое выравнивание результата АЦ-преобразования; три аналоговых входа: AN0, AN1, AN3; опорные напряжения UREF+ = UDD, UREF- = USS ; выбирается канал 0 (вход AN0); запрещаются прерывания от АЦП. */
}
unsigned int adconv1(void) // функция АЦ-преобразования напряжения U1
{
SetChanADC(ADC_CH0); // выбрать канал 0 АЦП
Delay10TCYx(2); // задержка на 20 мкс
ConvertADC( ); // запустить АЦ-преобразование
while(BusyADC( )); // ожидание готовности данных АЦП
ad_res1 = ReadADC( ); // чтение данных АЦП
return ad_res1;
}
unsigned int adconv2(void) // функция АЦ-преобразования напряжения U2
{
SetChanADC(ADC_CH1); // выбрать канал 1 АЦП
Delay10TCYx(2); // задержка на 20 мкс
ConvertADC( ); // запустить АЦ-преобразование
while(BusyADC( )); // ожидание готовности данных АЦП
ad_res2 = ReadADC( ); // чтение данных АЦП
return ad_res2;
}
void out_u1(unsigned int ad_res1) // функция вывода результата измерения
// напряжения U1 на ЖКД
{
unsigned int u1; // объявление переменной u1 для вывода
u1 = (ad_res1 * 5000.) / 1023. ; // преобразование кода АЦП
// в милливольты
……………………….. /* требуется написать самостоятельно
……………………….. для вывода на ЖКД в 1-ю строку напряжения U1
……………………….. в милливольтах, а во 2-ю строку напряжения U1
……………………….. в вольтах */
}
void out_u2(unsigned int ad_res2) // функция вывода результата измерения
// напряжения U2 на ЖКД
{
unsigned int u2; // объявление переменной u2 для вывода
u2 = (ad_res2 * 5000.) / 1023. ; // преобразование кода АЦП
// в милливольты
……………………….. /* требуется написать самостоятельно
……………………….. для вывода на ЖКД в 1-ю строку напряжения U2
……………………….. в милливольтах, а во 2-ю строку напряжения U2
……………………….. в вольтах */
}
void out_invite(void) // функция вывода на ЖКД текста приглашения
{
……………………… /* требуется написать самостоятельно для вывода
……………………… на ЖКД текста:
……………………… Press only one
……………………… key: SB1 or SB2
……………………… */
}
void out_error(void) // функция вывода на ЖКД сообщения об ошибке
{
……………………… /* требуется написать самостоятельно для вывода
……………………… на ЖКД текста:
……………………… ERROR. Two keys
……………………… are pressed
……………………… */
}
// функции задержки для работы с ЖКД
void DelayFor18TCY(void) // функция задержки на 18 командных циклов
{
Delay10TCYx(2); // задержка на 20 мкс
}
void DelayPORXLCD(void) // функция задержки на 15 мс
{
Delay1KTCYx(15);
}
void DelayXLCD(void) // функция задержки на 5 мс
{
Delay1KTCYx(5);
}
3.2.4. С помощью пункта меню View > Project откройте окно проекта pr16.mcw и внесите в проект исходный файл adc2.c и файл сценария линкера 18f242.lkr. Затем проверьте установку опций для создания проекта с помощью пункта меню Project > Build Options… > Project. Обязательно установите путь для поиска библиотек Library Search Path. Затем постройте проект, выбрав пункт меню Project > Build All. В случае успешной компиляции сверните окно MPLAB IDE.
3.2.5. Для проверки работы МКУ запустите программу ISIS.exe пакета Proteus VSM. Для упрощения разработки схемы можно использовать файл проекта с именем adc.dsn из папки проектов proj15. С этой целью выберите пункт меню File > Open Design. В раскрывшемся диалоговом окне найдите папку с именем proj15 и выберите из нее файл adc.dsn.
3.2.6. В схему из файла adc.dsn необходимо добавить резисторы и кнопки. Их надо выбрать из библиотек Proteus. После выбора всех необходимых компонентов выполните соединение элементов между собой согласно принципиальной схеме, приведенной на рис. 2. Затем сделайте надписи элементов схемы.
И в заключение необходимо сохранить разработанный проект в папке proj16. Для этого выберите пункт меню File > Save Design As… Раскройте папку e:\....\proj16 и сохраните в ней проект под именем adc2.dsn.
3.2.7. Теперь можно приступить к проверке работы МКУ. Сначала нужно записать hex-код разработанной программы в память МК. С этой целью наведите курсор мыши на изображение МК и дважды щелкните левой кнопкой. В открывшемся окне редактирования свойств компонента Edit Component щелкните по кнопке в правой части строки Program File. Откроется окно Select File Name с hex-файлами из папки proj16. Выберите файл с именем pr16.hex (это скомпилированный файл исходной программы adc2.c, написанной на языке Си), и нажмите кнопку «Открыть». Затем в строке Processor Clock Frequency (тактовая частота процессора) выставьте 4 МГц. Нажмите кнопку ОК для подтверждения выбора параметров. В заключение щелкните по пустому месту схемы для снятия выделения с МК.
Для проверки работы МКУ запустите проект на выполнение с помощью кнопки Play (Пуск). На экране дисплея должен появиться текст:
Press only one
key: SB1 or SB2
Если это произошло, то нажмите и зафиксируйте кнопку SB1. На экране дисплея должны появиться значения напряжения U1 в милливольтах и вольтах.
Далее разомкните кнопку SB1 и нажмите и зафиксируйте кнопку SB2. На экране дисплея должны появиться значения напряжения U2 в милливольтах и вольтах.
И, наконец, замкните и зафиксируйте обе кнопки: SB1 и SB2. На экране дисплея должно появиться сообщение об ошибке в виде:
Error. Two keys
are pressed
В заключение проверьте правильность измерения напряжений U1 и U2 при различных положениях движков потенциометров RV1 и RV2.