Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование микроконтроллеров AVR. Учебное пособие.pdf
X
- •ПРЕДИСЛОВИЕ
- •1. АРХИТЕКТУРА МИКРОКОНТРОЛЛЕРОВ AVR СЕМЕЙСТВА MEGA
- •1.1. Регистры микроконтроллера
- •1.2. Порты ввода/вывода
- •1.3. Периферийные устройства
- •1.3.1. Таймеры/счетчики
- •1.3.2. Аналого-цифровой преобразователь
- •2. ОБЩИЕ СВЕДЕНИЯ О ЯЗЫКЕ С
- •2.1. Вводные понятия в языке С
- •2.2. Правила приведения типов компилятора Code Vision AVR
- •2.3. Структура программы на языке С
- •3. СОЗДАНИЕ ПРОЕКТА С ИСПОЛЬЗОВАНИЕМ МАСТЕРА-ПОСТРОИТЕЛЯ
- •3.1. Выбор общих параметров проекта
- •3.1.1. Настройка портов
- •3.1.2. Настройка таймеров
- •3.1.3. Настройка параметров АЦП
- •3.1.4. Настройка параметров ЖКИ
- •3.2. Генерации программы
- •4. ПРИМЕНЕНИЕ МИКРОКОНТРОЛЛЕРОВ AVR ПРИ РАЗРАБОТКЕ ИЗМЕРИТЕЛЬНЫХ СИСТЕМ
- •ЗАКЛЮЧЕНИЕ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК

Если выходное напряжение рассмотренного формирователя импульсов подать на логический элемент триггер Шмитта, то фронты становятся
максимально крутыми. Ввод прямоугольного импульса в микроконтроллер можно осуществлять по возрастающему фронту.
Для дальнейшей обработки сигналов с формирователя импульсов
можно использовать таймеры/счетчики микроконтроллера. Для получения
результата требуется определить количество импульсов за определенное
время (за 1 с), а затем рассчитать период и скорость вращения с учетом
числа зубцов на валу ротора.
Описание работы программы. Блок-схемы алгоритмов
Блок-схема алгоритма основной программы остается неизменной, такой же, как и в п. 4.1. Измерение скорости вращения ротора производится
в режиме бесконечного цикла, как это показано в блок-схеме алгоритма
основной программы (рис. 4.2).
Процесс измерения скорости вращения ротора необходимо проводить
за строго определенный контролируемый промежуток времени (1 с), который формируется с помощью 16-разрядного таймера/счетчика ТС1.
Блок-схема алгоритма п/программы обработки прерывания таймера
ТС1 представлена на рис. 4.29.
При тактовой частоте процессора, равной 4 МГц, промежутки времени длительностью 1 с можно отсчитывать с помощью таймера/счетчика
ТС1 с предделителем 64: 4 МГц / 64 = 62,5 кГц (Т = 1/62,5 кГц = 16 мкс),
тогда Т = 1 с = 16 мкс · 62500 имп. В режиме OVERFLOW код для реинициализации равен 65536 – 62500 = 3036 в десятичной системе счисления,
а в шестнадцатеричной системе – 0BDC.
В течение промежутка времени, равного 1 с, производится подсчет
импульсов, поступающих с датчика скорости после формирователя. Эти
импульсы подаются на счетный вход таймера ТС0, а в конце этого промежутка времени необходимо считывать полученный результат и обнулять
счетчик для последующей счетной операции.
101

НАЧАЛО
Реинициализация
стартового значения
таймера/счетчика ТС1
Вычисление числа
оборотов ротора
ВОЗВРАТ
Перенос содержимого
счетного регистра TCNT0
в переменную speed
Вывод информации на
ЖКИ
Обнуление счетного
регистра TCNT0
Подсчет импульсов
датчика оборотов ротора
в счетном регистре
TCNT0
Нет
Да
Длительность
измерения
1 с
Рис. 4.29. Блок-схема алгоритма п/программы
обработки прерывания таймера ТС1
102

Фрагменты дополнительных кодов программы для измерения скорости вращения с четырьмя зубцами на валу представлены ниже: фрагмент
с определениями глобальных и локальных переменных (листинг 4.7.1),
фрагмент п/программы обработки прерывания АЦП (листинг 4.7.2).
Листинг 4.7.1
#include <alcd.h>
#asm
.equ _lcd_port=0x16; PORTD
#endasm
unsigned int speed=0; // speed - число импульсов с
датчика за секунду
unsigned int N=0; // N - число оборотов ротора в
минуту
unsigned char str1[16]; // строка для вывода результата
на ЖК-дисплей
// подпрограмма (функция) вывода данных на ЖК-дисплей
void lcd_output(void)
{
sprintf(str1," n:%1i ob/min", N); //
формат 1-й строки
lcd_clear(); // очистка
ЖК-дисплея
lcd_gotoxy(0,0); // определение позиции для вывода
1-го символа 1-й строки ЖКИ
lcd_puts(str1); // вывод
1-й строки
}
Листинг 4.7.2
{
TCNT1H=0x0B; // реинициализация стартового значения
счетчика
TCNT1L=0xDC; // таймера_1 (BDC)
speed=TCNT0; // перенос содержимого счетного регистра
в переменную
103

TCNT0=0x00; // обнуление содержимого счетного регистра
N=60*speed; // вычисление числа оборотов ротора в
минуту
// speed=0;
lcd_output(); // вывод информации на ЖК-дисплей
N=0;
}
После успешного завершения трансляции отлаженной программы
в среде Code Vision AVR можно перейти к симуляции ее работы в программной среде PROTEUS. Для этого требуется сначала подготовить файл
Design-схемы для симуляции программы измерения переменного напряжения, скриншот которого представлен на рис. 4.30, а затем загрузить
в микроконтроллер симулятора сгенерированный при компиляции файл
с расширением .cof.
Рис. 4.30. Скриншот файла Design-схемы для измерения скорости
При правильной настройке программы число оборотов вращения вала
на ЖКИ должно совпадать с расчетными значениями.
104

4.8. ПОДГОТОВКА ПРОГРАММЫ
ДЛЯ ИЗМЕРЕНИЯ ТЕМПЕРАТУРЫ
При измерении температуры с помощью микроконтроллера AV R следу-
ет сначала выбрать первичный преобразователь (датчик) температуры, обеспечивающий выполнение условий, оговоренных в техническом задании.
Для такой задачи наиболее подходящим считается широко распро-
страненный интеллектуальный датчик DS18B20, который является цифровым измерителем температуры, с разрешением преобразования 9–12 разрядов и функцией тревожного сигнала контроля за температурой.
DS18B20 способен обмениваться данными с микроконтроллером по однопроводной линии связи, используя протокол 1-Wire. Диапазон измерения
температуры составляет –55...+125 °C. Аппаратная конфигурация шины
1-Wire показана на рис. 4.31.
Рис. 4.31. Аппаратная конфигурация шины 1-Wire
В цепи между датчиком температуры DS18B20 и индикатором ЖКИ
микроконтроллер играет роль только приемопередатчика цифровых сигналов, поэтому для реализации подобной задачи вполне достаточно даже ресурсов микроконтроллеров класса ATiny.
105

Описание работы программы. Блок-схемы алгоритмов
Основная функция DS18B20 – преобразование температуры датчика
в цифровой код. Разрешение преобразования задается 9, 10, 11 или 12 бит.
Это соответствует разрешающей способности: 0,5 (1/2) °C, 0,25 (1/4) °C,
0,125 (1/8) °C и 0,0625 (1/16) °C. После включения питания по состоянию
битов R0 и R1 в регистре конфигурации определяется уровень разрешения
преобразования 9, 10, 11 или 12 бит. С увеличением разрядности повышается время преобразования. Эта зависимость показана на рис. 4.32.
Рис. 4.32. Зависимость времени преобразования
от уровня разрешения
В зависимости от времени преобразования устанавливается время обновления данных. Система согласно протоколу на подключенной линии
связи 1-Wire определяет наличие датчика температуры. Если датчик присутствует, то считывается его цифровой код, по которому определяется
уровень разрешения преобразования и информация о температуре t1.
Если t1 > 1000, то температура отрицательная, если нет, то – положи-
тельная. Температура пересчитывается и периодически через определенное время выводится на ЖКИ.
Блок-схема алгоритма программы показана на рис. 4.33.
106

Инициализация
НАЧАЛО
Да
Нет
Датчик
найден
Анализ R0, R1 в
рег-ре конфигурац
Преобразование
температуры
Да
Нет
t1 > 1000
Температура
отрицательная
Температура
положительная
Вывод
результата
ВОЗВРАТ
Рис. 4.33. Блок-схема алгоритма программы
измерения температуры
Фрагменты дополнительных кодов программы для измерения темпе-
ратуры представлены ниже: фрагмент с определениями глобальных и ло-
107

кальных переменных (листинг 4.8.1), фрагмент программы, выполняемой
в цикле (листинг 4.8.2).
Листинг 4.8.1
// Alphanumeric LCD functions
#asm
.equ __lcd_port=0x12 //PORTD
#endasm
#include <alcd.h>
#include <stdio.h>
#define DEL 250 //период обновления данных (в мс)
char buff [99]; //буфер дисплея
unsigned char ds=0;
unsigned int i=0;
float t1=0,t=0;;
unsigned char devices; //количество устройств на линии
unsigned char RomCode[5][9]; //массив ром-кодов датчиков
void lcd()
{
lcd_gotoxy(0,0);
sprintf(buff," TEMP %.1f C ",t); // вывод
lcd_puts(buff); // вывод на дисплей
}
void temp()
{
if(ds==0){ devices=w1_search( DS18B20_SEARCH_ROM_CMD,
RomCode );} //поиск датчиков на линии 1-wire если нет
датчиков
if(devices==1) //если датчик есть
{
ds=0;
108

delay_ms(10);
ds18b20_init( &RomCode[0][0], 30, 60,
DS18B20_12BIT_RES ); //12 битный режим
delay_ms(10);
t1 = ds18b20_temperature( &RomCode[0][0] );
//считываем температуру
if( t1 > 1000 ) //если температура минусовая
{
t1 = 4096 - t1;
t1 = - t1;
}
if(t1!=-9999){ t = t1; } //отсекаем ошибки
}
}
Листинг 4.8.2
while (1)
{
i++;
lcd();
delay_ms(1);
if(i>=DEL){i=0; temp();} //вызываем с
определенной периодичностью
}
После успешного завершения трансляции отлаженной программы
в среде Code Vision AVR можно перейти к симуляции ее работы в программной среде PROTEUS. Для этого требуется сначала подготовить файл
Design-схемы для симуляции программы измерения температуры, скриншот
которого представлен на рис. 4.34, а затем загрузить в микроконтроллер симулятора сгенерированный при компиляции файл с расширением .cof.
109

Рис. 4.34. Скриншот файла Design-схемы
для измерения температуры
При правильной настройке программы показания температуры на ЖКИ
должны совпадать с показаниями прибора U2.
110
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
