А.П.Евдокимов, Л.Л.Владимиров Программирование микроконтроллера К1986ВЕ92QI компании Миландр (1186478), страница 6
Текст из файла (страница 6)
При этом микроконтроллер работает (задающий генератор выдает импульсы, ведет свой подсчет таймер...), но блок операций не исполняется ввиду его отсутствия.Главная функция нашей программы имеет вид:int main()Здесь int (от integer – целый) указывает тип данных – целочисленный. Иногда в скобках после главной функции пишут void (пустой), чем подчеркивают, что тип данных, с которым будет иметь делофункция, – произвольный.Внутри главной функции – названия двух процедур:PortsInit();TimerInit();Первая инициализирует порт, вторая – таймер.
Описание этих процедур должно быть выполнено до обращения к главной функции.44Процедура LED() также должна быть описана до обращения кней. Внутри процедуры объявляется переменная i:static uint8_t i;То есть переменная i – беззнаковая (u – unsigned), целая (int – integer),8-битная. Спецификатор static позволяет переменной сохранять своезначение между вызовами процедуры, а не инициализировать ее повторно при каждом вызове.Далее познакомимся с оператором switch.switch (переменная){case константа 1:Блок операторов 1break;case константа 2:Блок операторов 2break;...default:Блок операторов 3break;}Оператор switch сравнивает значение переменной с несколькими константами.
В случае (case), если переменная равна константе 1,выполняется блок операторов 1, после этого выполняется операторbreak, программа выходит из блока оператора switch и выполняетследующий после блока switch оператор. Если переменная равнаконстанте 2, то будет выполнен блок операторов 2, затем – выход изблока switch по оператору break и так далее. Если же переменная неравна ни одной из прописанных констант (default), то будет выполнен блок операторов 3, а затем break – выход. В нашем случае значение переменной i увеличивается на единицу, результат делится на 2, азатем определяется остаток от деления.
Ясно, что остаток будет принимать значения то 0, то 1. При этом, исходя из текста программы, впервом случае на линии порта будет выставлен логический 0, а вовтором – логическая единица.ПРАКТИЧЕСКАЯ ЧАСТЬ1. Подключите отладочную плату к компьютеру.2. Подайте питание на плату.3.
Запустите среду программирования Keil μVision.454. Занесите программу в микроконтроллер с помощью программатора. Удостоверьтесь в правильности работы устройства.5. По заданию преподавателя измените частоту мигания светодиода, соотношение длительности свечения и паузы.КОНТРОЛЬНЫЕ ВОПРОСЫ1. Что представляет собой таймер общего назначения микроконтроллера К1986ВЕ92QI?2. Для чего нужен делитель тактовой частоты? Как настроитьего работу?3. Для чего нужен предделитель? Как настроить его работу?4. Как организовать прерывание от таймера?5. Поясните логику работы программы, приведенной в даннойлабораторной работе.46ЛАБОРАТОРНАЯ РАБОТА 6.РЕЖИМ ШИРОТНО-ИМПУЛЬСНОЙ МОДУЛЯЦИИЦЕЛЬ РАБОТЫУметь настраивать таймер в режиме широтно-импульсной модуляции.ТЕОРЕТИЧЕСКАЯ ЧАСТЬКак вы помните из предыдущей работы, в режиме ШИМ микроконтроллер вырабатывает последовательность прямоугольных импульсов, у которых амплитуда и период являются постоянными, а ширина импульса изменяется в соответствии с программой (рисунок 6.1).При этом чем больше длительность импульса, тем выше среднееза период значение сигнала.
Средний уровень сигнала может бытьвыделен с помощью фильтра нижних частот либо период T выбирается таким, что в силу инерционности объекта воздействия последнийреагирует не на каждый импульс, а на средний уровень сигнала.Например, при частоте импульсов, подаваемых на светодиод, выше40-50 Гц глаз человека перестает замечать мерцания и реагирует насредний уровень яркости свечения светодиода.Рисунок 6.1 – Широтно-импульсная модуляция:T = const – период сигнала; = var – длительность импульса;Uср = var – среднее значение сигнала за периодНапомним, что принцип широтно-импульсной модуляции часто применяют в автоматизации при необходимости цифровогоуправления такими величинами, как скорость вращения двигателяпостоянного тока, яркость свечения лампы, температура электронагревателя и т.п.47Рассмотрим программу, при выполнении которой микроконтроллер вырабатывает последовательность прямоугольных импульсов, у которых ширина сначала плавно возрастает до максимума,а затем резко спадает до минимума.
Ряд блоков программы был изучен ранее и пояснений не требует, тем не менее внимательно прочитайте каждый комментарий.// Подключение заголовочных файлов тех библиотек,// которые непосредственно используются в данной программе#include <MDR32F9Qx_port.h>#include <MDR32F9Qx_rst_clk.h>#include <MDR32F9Qx_timer.h>// Определение макроса задержки#define DELAY(T) for (i = T; i > 0; i--)// Глобальная переменная счетчика,// которая используется в макросе DELAY()int i;// Глобальная переменная длительности импульса по каналу 1uint16_t CCR1_Val;// Процедура инициализация портаvoid PortInit(){// Создание структуры для инициализации портаPORT_InitTypeDef Nastroyka;// Включение тактирования порта ARST_CLK_PCLKcmd(RST_CLK_PCLK_PORTA, ENABLE);// Сброс установок порта АPORT_DeInit(MDR_PORTA);// Настройка порта А, линия 1Nastroyka.PORT_Pin = PORT_Pin_1;// Работа линии на передачуNastroyka.PORT_OE = PORT_OE_OUT;// Альтернативная функция: TMR1_CH1Nastroyka.PORT_FUNC = PORT_FUNC_ALTER;// Цифровой режимNastroyka.PORT_MODE = PORT_MODE_DIGITAL;// Крутой фронтNastroyka.PORT_SPEED = PORT_SPEED_FAST;// Инициализация порта А объявленной структуройPORT_Init(MDR_PORTA, &Nastroyka);}// Процедура инициализация таймераvoid TimerInit(){48// Включение тактирования таймера 1RST_CLK_PCLKcmd(RST_CLK_PCLK_TIMER1, ENABLE);// Сброс установок таймера 1TIMER_DeInit(MDR_TIMER1);// Создание структуры конфигурации таймераTIMER_CntInitTypeDef sTIM_CntInit;// Заполнение структуры значениями по умолчаниюTIMER_CntStructInit(&sTIM_CntInit);// Предделитель частоты таймера равен 1sTIM_CntInit.TIMER_Prescaler = 0x0;// Установка максимально возможного периода импульсов ШИМsTIM_CntInit.TIMER_Period = 0xFFF;// Инициализация таймера 1 объявленной структуройTIMER_CntInit (MDR_TIMER1, &sTIM_CntInit);// Инициализация канала СН1 таймера 1 объявленной структуройTIMER_ChnStructInit (&sTIM_ChnInit);// Создание структуры конфигурации каналаTIMER_ChnInitTypeDef sTIM_ChnInit;// Режим работы канала – генерация ШИМsTIM_ChnInit.TIMER_CH_Mode = TIMER_CH_MODE_PWM;// Для получения сигнала ШИМ следует установить// формат выработки сигнала REF номер 6sTIM_ChnInit.TIMER_CH_REF_Format = TIMER_CH_REF_Format6;// Выбор канала 1sTIM_ChnInit.TIMER_CH_Number = TIMER_CHANNEL1;// Инициализация канала 1 объявленной структуройTIMER_ChnInit(MDR_TIMER1, &sTIM_ChnInit);// Установка длительности импульсов по первому каналуTIMER_SetChnCompare(MDR_TIMER1, TIMER_CHANNEL1, CCR1_Val);// Создание структуры конфигурации выходов каналаTIMER_ChnOutInitTypeDef sTIM_ChnOutInit;// Заполнение элементов структуры значениями по умолчаниюTIMER_ChnOutStructInit(&sTIM_ChnOutInit);// Выбор источника сигнала для прямого выхода CHx - сигнал REFsTIM_ChnOutInit.TIMER_CH_DirOut_Source = TIMER_CH_OutSrc_REF;// Настройка прямого выхода канала таймера CHx на вывод данныхsTIM_ChnOutInit.TIMER_CH_DirOut_Mode =TIMER_CH_OutMode_Output;// Настройка выходов канала 1sTIM_ChnOutInit.TIMER_CH_Number = TIMER_CHANNEL1;TIMER_ChnOutInit (MDR_TIMER1, &sTIM_ChnOutInit);// Включение делителя тактовой частоты таймера 149TIMER_BRGInit(MDR_TIMER1, TIMER_HCLKdiv1);// Разрешение работы таймера 1TIMER_Cmd(MDR_TIMER1, ENABLE); }// Объявление главной функцииint main(){// Установка начальной длительности импульса ШИМCCR1_Val = 0x001;// Вызов процедуры инициализации портаPortInit();// Вызов процедуры инициализации таймераTimerInit();// Главный циклwhile (1){// Инкремент переменной CCR1_Val (длительность импульса)CCR1_Val++;DELAY(5000); // Задержка// Установка новой длительности импульсаTIMER_SetChnCompare(MDR_TIMER1, TIMER_CHANNEL1, CCR1_Val);if (CCR1_Val == 0xFFF){CCR1_Val = 0x001;}}}Итак, главная функция main() начинается с вызова процедурыинициализации порта.
Таймер TIMER1 содержит 4 канала ШИМ. Какследует из таблицы 1.1 первый канал таймера TMR1_CH1 являетсяцифровой альтернативной функцией и закреплен за линией PA1 (вывод микросхемы – 62). В процедуре инициализации порта это прописано так:Nastroyka.PORT_FUNC = PORT_FUNC_ALTERПеременная CCR1_Val отвечает за длительность импульса, до вызова всех процедур ей присвоено значение 0x001. Когда начинаетсяосновной цикл, оператором CCR1_Val++ увеличивается на 1 значениепеременной CCR1_Val, которая отвечает за длительность импульса. Спомощью оператора if проверяем достигнуто ли предельное значениеширины импульса, равное периоду следования импульсов 0xFFF. Если достигнуто, то переменной CCR1_Val присваивается значение0x001, импульс становится минимальной ширины, и процесс начинается снова.50ПРАКТИЧЕСКАЯ ЧАСТЬ1.
Переведите мультиметр в режим измерения постоянногонапряжения. С помощью соединительных проводников подключитечерный вывод мультиметра к выводу 30 разъема X27 отладочной платы (рисунок 1.3), а красный вывод мультиметра – к выводу 12 того жеразъема платы.2. Подключите отладочную плату к компьютеру.3.
Подайте питание на плату.4. Запустите среду программирования Keil μVision.5. Занесите программу в микроконтроллер с помощью программатора. Наблюдая за изменением показаний мультиметра, удостоверьтесь в правильности работы устройства.6.
Отключите блок питания от отладочной платы и USB-кабель– от компьютера.7. Включите и настройте осциллограф. Подключите кабельосциллографа к отладочной плате: земля – к выводу 30 разъема X27(рисунок 1.3), потенциальный вывод – к выводу 12 того же разъемаплаты.8. Измерьте амплитуду, период следования, минимальную имаксимальную длительность импульсов.