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

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

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

Q = T / tИ

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

Часто вместо скважности используется термин коэффициент заполнения γ, который является величиной, обратной скважности:

γ = 1 / Q = tИ / T

Коэффициент заполнения обычно выражается в процентах:

γ = (tИ / T) 100%

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

Для облегчения разработки программ управления каналами ШИМ в библиотеке пакета МСС18 имеются несколько функций. В таблице приведены некоторые наиболее часто используемые функции. Полное описание их дано в заголовочном файле pwm.h.

Функции ШИМ

Функция

Описание

ClosePWMx

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

OpenPWMx

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

SetDCPWMx

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

Рассмотрим вкратце библиотечные функции ШИМ на примере канала 1.

  1. ClosePWM1( ) – дезактивирует ШИМ канала 1.

Прототип функции:

Void ClosePwm1(void);

  1. OpenPWM1()–конфигурирует ШИМ канала 1, задавая период и длительность импульсов. Для работы ШИМ используется только таймер 2.

Прототип функции:

Void OpenPwm1(char period);

Аргумент функции period – может быть любым числом в пределах от 0х00 до 0xFF.

  1. SetDCPWM1( ) – записывает новое значение рабочего цикла в регистр ШИМ канала 1.

Прототип функции:

Void SetDcpwm1(unsigned int dutycycle);

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

unsigned int i=512;

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 – целая константа.

Для возврата в исходную секцию кода используется директива

#pragma code

В языке С18 для задания приоритета функции обработки прерывания имеются две директивы:

#pragma interrupt fname

#pragma interruptlow fname

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

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

#include <p18fxxx.h>

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

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

#pragma code low_vector = 0x18 // дальнейший программный код будет начинаться с адреса 000018h

void low_iterrupt(void)

{

_asm

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

_endasm

}

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

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

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

{

……………………..

}

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

{

…….

}

Управление приоритетной системой прерываний в микроконтроллерах семейства PIC18 выполняется с помощью бита с именем IPEN, который находится в регистре специальных функций RCON.

Если IPEN = 0, то приоритетная система прерываний выключена, и все прерывания имеют одинаковые приоритеты. По умолчанию предполагается, все прерывания будут иметь высокий приоритет, т.е. при возникновении любого прерывания происходит переход по вектору 000008h. Для общего (глобального) разрешения прерываний надо установить бит GIE = 1, который находится в регистре INTCON.

Если IPEN = 1, то приоритетная система прерываний включена. Для общего (глобального) разрешения прерываний с высоким приоритетом надо установить бит GIEH = 1. Для общего разрешения прерываний с низким приоритетом надо установить бит GIEL = 1. Эти биты находятся в регистре INTCON.