Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы по МПТ Оля.docx
Скачиваний:
18
Добавлен:
15.04.2015
Размер:
153.55 Кб
Скачать

18. Реализация широтно-импульсной модуляции в pic-мк: параметры шим, функции управления шим на языке с18.

Скважностью импульсной последовательности называется отнош-е периода следования импульсов Т к их длительности tИ и обозначается буквой Q: Q = T / tИ

Скважность – величина безразмерная и не имеет единиц измерения.

Часто вместо скважности используется термин коэф-ент заполн-я γ, который является велич-ой, обратной скважности: γ = 1 / Q = tИ / T

Коэф-ент заполнения обычно выражатся в проц-ах: γ = (tИ / T) 100%

Все микроконтроллеры семейства PIC18 имеют внутренние модули, которые могут вырабатывать импульсные последовательности с широтно-импульсной модуляцией (ШИМ). Количество этих модулей или по-другому каналов ШИМ может быть от 1 до 5. Для облегчения разработки программ управления каналами ШИМ в библиотеке пакета МСС18 имеются несколько функций. В табл.1 приведены некоторые наиболее часто используемые функции. Полное описание их дано в заголовочном файле pwm.h.

Таблица 1

Функции ШИМ

Функция

Описание

ClosePWMx

Дезактивирует ШИМ канала х

OpenPWMx

Конфигурирует ШИМ канала х

SetDCPWMx

Записывает значение нового рабочего цикла в ШИМ канала х

Рассмотрим вкратце библиотечные функции ШИМ на примере канала 1. ClosePWM1( ) – дезактивирует ШИМ канала 1. Прототип функции: void ClosePWM1(void); OpenPWM1( ) – конфигурирует ШИМ канала 1, задавая период и длительность импульсов. Для работы ШИМ используется только таймер 2. Прототип функции: void OpenPWM1(char period); Аргумент функции period – может быть любым числом в пределах от 0х00 до 0xFF. SetDCPWM1( ) – записывает новое значение рабочего цикла в регистр ШИМ канала 1. Прототип функции: void SetDCPWM1(unsigned int dutycycle);

Аргумент функции dutycycle – может быть любым 10-битным числом. Только младшие 10 бит числа dutycycle записываются в регистры канала ШИМ.

19. Прерывания в pic18: источники прерываний, управляю-е биты, программирование прерываний на языке с18.

Микроконтроллеры PIC18 имеют несколько источников прерываний и функцию приоритетной системы прерываний, которая позволяет для каждого источника прерываний назначить высокий или низкий приоритет. При возникновении прерывания с высоким приоритетом происходит переход по вектору 000008h, а при возникновении прерывания с низким приоритетом – по вектору 000018h. Каждому источнику прерываний соответствует три управляющих бита: флаг прерываний, указывает на то, что выполнено условие возникновения прерывания; бит разрешения прерывания, разрешает переход по вектору прерывания при установке соответствующего флага; бит приоритета, выбор низкого или высокого приоритета прерывания.

Обработка прерывания заключается в следующем: Приостанавливается выполнение текущей программы, сохраняется текущий контекст и передается управление подпрограмме обрабо-и прерывания ISR. После выполнения ISR восстанавливается информация о предыдущем контексте и возобновляется нормальная работа программы. Рассмотрим основные особенности программирования прерываний при использовании компилятора С18. Как и любая функция языка Си, подпрограмма обработки прерывания ISR может иметь локальные и глобальные переменные. Однако ISR не может иметь входных параметров и не может возвращать какого-либо значения, то есть объявляется как:

void isr(void)

{

……..

}

ISR может быть вызвана только реакцией на работу аппаратуры, но не из другой Си-функции. В языке С18 не производится автоматическое размещение начала ISR по адресу вектора прерывания. Это объясняется тем, что источников прерывания, а следовательно, и ISR может быть несколько. Векторов прерыва-я, то есть адресов только два: 000008h для высокого приоритета и 000018h для низкого приоритета. Обычно по адресу вектора прерывания размещается ассемблерная команда GOTO для перехода на нужную ISR. Используется in-line ассемблер, при этом блок команд ассемблерного кода должен начинаться с директивы _asm и кончаться директивой _endasm:

_asm

…………

………… // команды Ассемблера

…………

_endasm

Для размещения вектора прерывания в программном коде испол-ся директива #pragma code section_name = address. Здесь section_name – идентификатор языка Си, address – целая константа (integer). Для возврата в исходную секцию кода используется директива #pragma code. В языке С18 для задания приоритета функции обработки прерывания имеются две директивы:

#pragma interrupt fname

#pragma interruptlow fname

Директива #pragma interrupt объявляет функцию обработки прерывания как имеющую высокий приоритет, а директива #pragma interruptlow – как имеющую низкий приоритет.

Пример программирования прерываний в языке С18.

#include <p18fxxx.h>

void high_isr(void); // прототип ISR с высоким приориор-м

void low_isr(void); // прототип ISR с низким приоритетом

#pragma interrupt high_isr // функция high_isr объявляется с

// высоким приоритетом

#pragma interruptlow low_isr // функция low_isr объявляется с

// низким приоритетом

#pragma code high_vector = 0x08 //дальнейший программный код

//будет начинаться с адреса 000008h

void high_interrupt(void)

{

_asm

goto high_isr // переход на функцию с именем high_isr

_endasm

}

#pragma code low_vector = 0x18 // дальнейший программный код

// начинаться с адреса 000018h

void low_iterrupt(void)

{

_asm

goto low_isr // переход на функцию с именем low_isr

_endasm

}

#pragma code // возврат в исходную программную секцию кода

………………………………..

void main(void) // главная функция программы

{

……………………..

}

void high_isr(void) // функция обработки прерывания с

{ // высоким приоритетом

………

}

void low_isr(void) // функция обработки прерывания с

{ // низким приоритетом

…….

}

Управление приоритетной системой прерываний в МК семейства PIC18 выполняется с помощью бита с именем IPEN, который находится в регистре специальных функций RCON. Если IPEN = 0, то приоритетная система прерываний выключена, и все прерыв-я имеют одинаковые приоритеты. По умолчанию предполагается, все прерывания будут иметь высокий приоритет, т.е. при возникнове-и любого прерывания происходит переход по вектору 000008h. Для общего (глобального) разрешения прерываний надо установить бит GIE = 1, который находится в регистре INTCON.Если IPEN = 1, то приоритетная система прерываний включена. Для общего (глоб-го) разрешения прерываний с высоким приоритетом надо установить бит GIEH = 1. Для общего разрешения прерываний с низким приоритетом надо установить бит GIEL = 1. Эти биты находятся в регистре INTCON.