Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Название:Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
- Автор:
- Жанр:
- Издательство:Издательский дом «ДМК-пресс»
- Год:2007
- Город:Москва
- ISBN:5-9706-0034-2
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Барретт - Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С краткое содержание
В книге последовательно рассматриваются все этапы создания встраиваемых систем на микроконтроллерах с применением современных технологий проектирования. Задумав эту книгу, авторы поставили перед собой задачу научить читателя искусству создания реальных устройств управления на однокристальных микроконтроллерах.
Издание содержит материал, охватывающий все вопросы проектирования, включает множество заданий для самостоятельной работы, примеры программирования, примеры аппаратных решений и эксперименты по исследованию работы различных подсистем микроконтроллеров.
Данная книга является прекрасным учебным пособием для студентов старших курсов технических университетов, которые предполагают связать свою профессиональную деятельность с проектированием и внедрением встраиваемых микропроцессорных систем. Книга также будет полезна разработчикам радиоэлектронной аппаратуры на микроконтроллерах.
Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
/*putcommands: функция посылает команду управления ЖКИ */
/********************************************************************/
void putcommands(unsigned char d) {
PORTDLC = PORTDLC&0xF7; /*установить RS в 0 для передачи команды */
PORTDLC = PORTDLC|0x04; /*установить E в 1 */
PORTDLC = 0x00; /* установить E и RS в 0 */
delay_100us();
delay_100us();
}
/********************************************************************/
/* delay_5ms: программная задержка 5 мс */
/********************************************************************/
void delay_5ms(void) {
int i;
for (i=0; i<50; i++) {
delay_100us();
}
}
/********************************************************************/
/* delay_100us:программная задержка в 100 мс */
/********************************************************************/
void delay_100us(void) {
int i;
for(i=0; i<800; i++) {
asm("nop");/*выполнение команды nор ассемблера занимает 1 период*/
}
}
/********************************************************************/
/* display_count_LCD: преобразует целое число в ASCII символ */
/* для вывода на ЖКИ */
/********************************************************************/
void display_count_LCD(unsigned int count) {
unsigned int thousands_int;
unsigned int hundreds_int;
unsigned int tens_int;
unsigned int ones_int;
char thousands;
char hundreds;
char tens;
char ones;
/*выбирает и преобразует наибольшую значащую цифру в десятичное */
/* значение + 48, образуя ASCII код */
thousands_int = count/1000;
thousands = (char)(thousands_int + 48);
/*выбирает и преобразует следующую наибольшую значащую цифру */
/* в десятичное значение + 48, образуя ASCII код */
hundreds_int = (count - thousands_int*1000)/100;
hundreds = (char)(hundreds_int + 48);
/*выбирает и преобразует следующую наибольшую значащую цифру */
/* в десятичное значение + 48, образуя ASCII код */
tens_int = (count - thousands_int*10 0 0 - hundreds_int*100)/10;
tens = (char)(hundreds_int + 48);
/*выбирает и преобразует следующую наибольшую значащую цифру */
/* в десятичное значение + 48, образуя ASCII код */
ones_int = (count-thousands_int*1000-hundreds_int*100-tens_int*10);
ones = (char)(ones_int + 48);
/*выводит результат на ЖКИ*/
putcommands(0x80); /*курсор ЖКИ переводится на строку 1, позицию 1*/
putchars(thousands);
putchars(hundreds);
putchars(tens);
putchars(ones);
}
/********************************************************************/
/********************************************************************/
7.4.3. Анализ
В предыдущем разделе мы рассказали, как измерить скорость вращения двигателя и отобразить ее в оборотах в минуту. В этом разделе мы замкнем контур обратной связи. Для этого мы сравним мгновенную скорость вращения с опорным значением, чтобы затем скорректировать коэффициент заполнения ШИМ и стабилизировать скорость вращения двигателя на желательном уровне при изменении нагрузки двигателя.
Стабилизируем скорость двигателя на уровне 1600 об/мин. Чтобы сделать это, мы должны определить требуемый коэффициент заполнения ШИМ для 1600 об/мин. Из полученного нами графика (рис. 7.17) мы видим, что для обеспечения скорости вращения приблизительно в 1600 об/мин, необходимо подать на двигатель напряжение в 8 В. При питании двигателя от источника в 12 В соответствующий коэффициент заполнения ШИМ составит 66.7 % (8 В/ 12 В).
Чтобы достичь коэффициента заполнения ШИМ в 66.7%, установим значение периода ШИМ на 256 единиц, а коэффициент заполнения ШИМ на 172 единицы.
Как мы уже указывали при предыдущем обсуждении системы ШИМ, эти значения устанавливаются в регистрах PWPER0 и PWDTY0, соответственно.
Мы используем сигнал управления ШИМ с частотой 976 Гц. Для этого частоту таймера ШИМ, равную 8 МГц, необходимо поделить на 32. При этом мы получим частоту в 250 кГц (период 4 мкс) и используем ее в качестве синхронизирующей для системы ШИМ. Поскольку мы используем период в 256 импульсов, частота управления ШИМ будет равна 976 Гц (период = 4 мкс/импульс×256 импульсов).
Ниже приведен исходный текст программы, позволяющей изменять коэффициент заполнения ШИМ, чтобы стабилизировать скорость на уровне 1600 об/мин.
Эта функция используется начальной установки скорости вращения двигателя.
/********************************************************************/
/*init_PWM(): инициализация модуля ШИМ контроллера 68HC12 */
/********************************************************************/
void init_PWM() {
PWTST = 0x00; /*Установить порт ШИМ в нормальный режим */
PWCTL = 0x00; /*установить режим фронтовой ШИМ */
PWCLK = 0x28; /*без объединения каналов, ECLK/128*/
PWPOL = 0x01; /*активный уровень 1 */
DDRP = 0xFF; /*Порт P конфигурировать как выходной */
PWEN = 0x01; /*установить выход ШИМ */
PWPER0 = 255; /*установить для ШИМ период, соответствующий 976 Гц */
PWDTY0 = 171; /*установить начальный коэффициент заполнения */
/* на отсутствие движения */
}
/********************************************************************/
Если в процессе выполнения программы обработки прерывания RTI скорость вращения превышает 1600 об/мин, коэффициент заполнения ШИМ уменьшается на 1. С другой стороны, если скорость вращения меньше, чем 1600 об/мин, коэффициент заполнения ШИМ увеличивается на 1. Каждое приращение или снижения коэффициента заполнения ШИМ приводит к изменению скорости на 8.5 об/мин. Попробуйте вычислить это изменение в качестве домашней работы (задание 19).
Код, позволяющий сравнить опорную скорость с действительной и скорректировать ее обеспечивается в программе обработки RTI прерывания (RTLISR). В этой распечатке кода, функции поддержки ЖКД были помещены в файл для включения LCD.H с их функциями-прототипами.
7.4.4. Структура программы и блок-схема алгоритма
На рис. 7.20 показаны блок-схема алгоритма и структура программы регулирования частоты вращения маломощного двигателя постоянного тока. В следующем параграфе приведен полный текст программы для этого проекта. Попробуйте разработать блок-схемы алгоритмов для каждой функции проекта в качестве домашней работы (задание 20).

а) Управление скоростью двигателя. Блок-схема алгоритма

б) Управление скоростью двигателя. Структура программы
Рис. 7.20.К программе управления скоростью двигателя
7.4.5. Программный код
В этом разделе мы использовали методику проектирования сверху-вниз, чтобы разработать, выполнить, и документировать систему стабилизации частоты вращения двигателя. Приводится полный код программы. Если бы мы привели этот код полностью в начале раздела, его сложность могла бы вас испугать. Использование же восходящей методики проектирования позволяет проще и удобнее разбираться с работой каждой функции кода и связью их между собой.
Читать дальшеИнтервал:
Закладка: