Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов » Программирование устройств на PIC микроконтроллерах


Логин:
Пароль:
О сайте:

Pic.Rkniga.ru - Сайт как для начинающих, так и для опытных радиолюбителей, разрабатывающих свои устройства на популярных PIC микроконтроллерах.
Здесь можно обмениваться сообщениями на форуме, а также добавлять на сайт статьи и схемы своих устройств.

Меню сайта
Главная Форум по PIC микроконтроллерам Форум Статьи по PIC микроконтроллерам Статьи Справочная информаци по PIC микроконтроллерам Справочник Литература по PIC микроконтроллерам Литература Схемотехника Схемотехника устройств на PIC микроконтроллерах Микроконтроллеры Программаторы Все по программированию PIC микроконтроллеров Программы, Софт Программы Ссылки
Опрос

Какой средой программирования вы пользуетесь?


MPLab/MPLabX
MicroC
MicroBasic
MicroPascal
Другой


Последние материалы
  • Тестовая плата для отладки программ на микроконтроллере PIC18F4550
  • Кнопка On/OFF на PIC12F629.
  • Часы с синхронизацией от китайского будильника
  • ШИМ регулятор на PIC16F628A.
  • Счетчики прямого и обратного счета на PIC16F628A.
  • Таймер отключения питания для мультиметра и не только.
  • Измеритель напряжения и тока
  • Маршрутный компьютер для электровелосипеда
  • Простой двухканальный термометр на PIC16F690 и датчиках DS18B20
  • Электронная "Незабудка" для забывчивых
  • Популярные материалы
    Случайная книга
    Программирование устройств на PIC микроконтроллерах » Справочник » Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Автор публикации: alex Просмотров: 11906 Добавлен: 27-09-2012, 14:08 Комментарии: 0

    Содержание
    1. Обзор 16-битных PIC-микроконтроллеров
    2. Архитектура микроконтроллеров PIC24F
    3. Система команд и основы программирования микроконтроллеров PIC24F
       3.1 Программная модель микроконтроллеров PIC24F
       3.2 Режимы адресации и система команд
    4. Программирование портов ввода-вывода
       4.1 Аппаратно-программная архитектура портов ввода/вывода
       4.2 Программирование портов ввода/вывода
       4.3 Модуль регистрации событий
    5. Программирование прерываний
    6. Программирование таймеров
       6.1 Практическое использование 16-битных таймеров
       6.2 Работа таймеров в 32-битном режиме
    7. Интерфейс SPI микроконтроллеров PIC24F
       7.1 Аппаратно-программная реализация SPI в микроконтроллерах PIC24F
       7.2 Практическое программирование обмена данными по SPI
    8. Интерфейс I2C микроконтроллеров PIC24F
       8.1 Принципы функционирования интерфейса I2C
       8.2 Модуль интерфейса I2C микроконтроллеров PIC24F
       8.3 Практическое использование интерфейса I2C
    9.Программирование интерфейса PMP
       9.1 Режимы работы PMP
       9.2 Практические примеры программирования интерфейса PMP
    10. Последовательный интерфейс микроконтроллеров PIC24F
       10.1 Аппаратно$программная архитектура UART
       10.2 Практическое использование последовательного порта
    11. Обработка аналоговых сигналов в микроконтроллере PIC24F
       11.1 Программная модель интегрированного АЦП
       11.2 Практическое использование модуля АЦП
       11.3 Использование внешнего АЦП
    12. Генерация аналоговых и цифровых сигналов
       12.1 Модуль генерации цифровых сигналов
       12.2 Аналоговые компараторы в микроконтроллерах PIC24F

         В микроконтроллерах PIC24F предусмотрена возможность генерации различных цифровых и аналоговых сигналов, которые можно использовать для управления внешними устройствами. На кристалле микроконтроллеров PIC24F имеется несколько модулей, выполняющих подобные функции: модуль аналоговых компараторов, модуль формирования опорных напряжений аналоговых компараторов, а также модуль генерации цифровых сигналов. Модули, относящиеся к обработке аналоговых сигналов, в процессе функционирования оперируют только с аналоговыми напряжениями и являются, по сути, простейшими преобразователями «цифра–аналог–цифра». С помощью модуля генерации цифровых сигналов формируются последовательности цифровых сигналов на основе временных параметров, задаваемых Таймером 2 или 3. Все перечисленные периферийные модули очень полезны при разработке внешних аналоговых и цифровых интерфейсов, создании различного рода преобразователей сигналов, в измерительных и управляющих схемах. Вначале рассмотрим модуль генерации цифровых сигналов.

    12.1. Модуль генерации цифровых сигналов

         Модуль генерации цифровых сигналов содержит несколько каналов. Каждый из каналов функционирует следующим образом: в регистры данных (один или оба, в зависимости от выбранного режима работы) заносится значение интервала времени, которое затем будет сравниваться с текущим значением, находящимся в регистре одного из таймеров (Таймера 2 или Таймера 3).
         При совпадении значений в регистрах данных и регистре таймера на определенных выходах микроконтроллера будет генерироваться либо одиночный цифровой импульс, либо их последовательность. Параметры импульсов определяются содержимым регистров данных и настройками Таймера 2 или Таймера 3. Характеристики выходных сигналов модуля генерации цифровых сигналов могут варьироваться в очень широком диапазоне, что дает возможность получить импульсные сигналы с различной скважностью и частотой. Такие импульсные последовательности легко преобразовать в аналоговые гармонические (синус/косинус) сигналы и их комбинации с помощью несложных аналоговых фильтров. Подобная методика используется при синтезе аналоговых сигналов звуковых частот. Как и все периферийные модули микроконтроллера PIC24F, модуль генерации цифровых сигналов представляет собой автономное устройство, которое может настраиваться и функционировать независимо от других модулей. Его можно настроить для работы с использованием прерывания, что позволит разгрузить процессор.
    Функциональная схема одного канала модуля показана на Рис. 12.1.
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.1. Функциональная схема одного канала модуля генерации цифровых сигналов

         Каждый канал модуля содержит два регистра данных – OCxR и OCxRS. В одних режимах работы используется только регистр OCxR, а в других режимах — оба регистра. Например, в режимах однократного сравнения в регистр OCxR помещается значение, которое будет сравниваться с содержимым регистра одного из таймеров. При совпадении значений будет генерироваться единичный импульс или последовательность импульсов. В этом случае длительность такого сигнала будет определяться разностью содержимого регистра OCxR и регистра периода Таймера 2 или Таймера 3. Таким образом, содержимое регистра OCxR определяет интервал задержки между очередной перезагрузкой таймера и изменением уровня сигнала на выводе OCx.
         В режимах двойного сравнения дополнительно задействуется регистр OCxRS, содержимое которого определяет момент второго перепада импульсного сигнала. Фактически содержимое регистров OCxR и OCxRS будет определять длительность импульсного сигнала в этих режимах.
         Выбор режима (однократного или двойного сравнения), а также дополнительные характеристики импульсных сигналов определяются битами OCM регистра управления модуля OCxCON. Бит 3 (OCTSEL) этого же регистра определяет источник базового сигнала (0 — Таймер 2, 1 — Таймер 3). Количество каналов модуля генератора цифровых сигналов определяется моделью микроконтроллера, поэтому для получения детальной информации нужно обращаться к технической документации на данный микроконтроллер. Конфигурирование прерываний ничем не отличается от настройки прерываний для других модулей, только здесь нужно использовать соответствующие флаги разрешения и приоритета прерываний.
         Далее рассмотрим практический пример программирования модуля генерации цифровых сигналов для микроконтроллера PIC24FJ128GA010. Отладку и анализ результатов выполним в среде программирования MPLAB IDE с помощью симулятора MPLAB SIM. Разработаем генератор импульсов, выход которого будет переключаться каждые 3 с, для чего выберем режим однократного сравнения с использованием только регистра OC1R. Выходной сигнал будет генерироваться на выходе OC1 (RD0) микроконтроллера.
         Создадим с помощью мастера проектов MPLAB IDE новый проект и включим в него файл со следующим исходным текстом:

    #include <p24fj128ga010.h>
    #include <stdio.h>
    #define SYSCLK 8000000
    #define t1 3
    #define PREG2 SYSCLK/2/256*t1
    unsigned int cnt = 0;
    void __attribute__ ((__interrupt__)) _OC1Interrupt(void)
    {
       _OC1IF = 0;
       printf("OC1 toggled %d times\n", ++cnt);
    }
    void main(void)
    {
       PR2 = PREG2;
       OC1CON = 0x0000;
       OC1CON = 0x0003;
       OC1R = PR2;
       IFS0bits.OC1IF = 0;
       IEC0bits.OC1IE = 1;
       TMR2 = 0;
       T2CON = 0x8030;
       while(1)
       {
       }
    }

         Анализ исходного текста программы начнем с переменных и констант, объявленных в программе. Константа SYSCLK содержит значение тактовой частоты микроконтроллера (8 МГц). Константа t1 равна 3 и обозначает интервал времени срабатывания таймера, а константа PREG2 определяет значение, которое будет загружено в регистр периода Таймера 2, который мы намерены использовать в этом проекте. Эта константа соответствует времени срабатывания Таймера 2, равному 3 с. В программе объявлена также целочисленная переменная cnt, которая будет равна количеству перепадов импульсного сигнала на выходе OC1.
         В программе используется прерывание первого канала модуля с функциейобработчиком _OC1Interrupt. Эта функция сбрасывает флаг прерывания и выводит содержимое счетчика cnt на «виртуальную» консоль функцией printf.
         В основной программе мы определяем две настройки: канала 1 модуля генерации цифровых сигналов и Таймера 2. Конфигурирование канала 1 выполняется операторами
    OC1CON = 0x0000;
    OC1CON = 0x0003;
    OC1R = PR2;

         Первый оператор сбрасывает текущие настройки канала 1 модуля (эту процедуру желательно выполнять каждый раз при перенастройке каналов модуля генерации цифровых сигналов). В регистр управления OC1CON заносится значение 3, т. е. выбирается режим переключения выхода OC1 при каждом срабатывании Таймера 2, который выбран в качестве базового для этой программы. Переключение выхода OC1 должно выполняться всякий раз при перезагрузке Таймера 2, поэтому в регистр данных OC1R помещаем значение регистра периода PR2 Таймера 2.
         Настройка Таймера 2 выполняется стандартным образом. Вначале в регистр периода PR2 помещается значение перезагрузки (оно определяется константой PREG2), регистр Таймера 2 TMR2 обнуляется, а в регистр управления T2CON заносится значение 0x8030. Коэффициент деления частоты тактового сигнала
         Таймера 2 здесь выбран равным 256.
    Операторы
    IFS0bits.OC1IF = 0;
    IEC0bits.OC1IE = 1;

    выполняют инициализацию прерывания канала 1 модуля, для чего вначале сбрасывается флаг прерывания OC1IF, а затем устанавливается флаг разрешения прерывания OC1IE.
         Для отладки нашей программы скомпилируем ее в режиме Debug, затем выберем отладчик MPLAB SIM и выполним некоторые дополнительные действия. В окне настройки отладчика установим значение тактовой частоты устройства, равное 8 МГц (Рис. 12.2).
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.2. Установка тактовой частоты

         Кроме того, установим опцию вывода данных в «виртуальное» окно отладчика, для чего выберем закладку UART1 IO и установим опции так, как показано на Рис. 12.3.
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.3. Установка опций вывода в «виртуальное» окно

         Напомню, что установка опции «виртуального» вывода позволит выводить данные программы в окно Output при отладке. И последняя операция — в настройках проекта нужно выбрать закладку MPLAB LINK30 и выделить память для «кучи», указав объем выделяемой памяти в окне Heap size (Рис. 12.4).
         Эта настройка необходима для использования библиотечных функций ANSI C.
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.4. Выделение памяти для «кучи»

         Для отладки приложения в окно просмотра переменных нужно вывести переменные TMR2, PORTD (бит 0 соответствует выводу OC1) и cnt (Рис. 12.5).
         После выполнения этих настроек можно запустить программу в режиме Animate и наблюдать за изменениями значений переменных в окне Watch.
         Функционирование канала 1 модуля генерации цифровых сигналов в режиме двойного сравнения я покажу на следующем примере. Для этого разработаем проект, аппаратная часть которого показана на Рис. 12.6.
         Схема работает следующим образом: на выводе OC1 микроконтроллера каждые 3 с появляется короткий импульс положительной полярности, который переключает защелку DD1 в противоположное состояние. В результате светодиод D1 будет периодически включаться/выключаться. Длительность импульса будет определяться программными настройками канала 1. Микроконтроллер работает на тактовой частоте 8 МГц (частота выполнения команд равна 4 МГц).
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.5. Окно просмотра переменных
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.6. Аппаратная часть проекта

         Программная часть проекта разработана в среде MPLAB IDE и содержит файл программы со следующим исходным текстом:

    #include <p24fj128ga010.h>
    _CONFIG2(FCKSM_CSDCMD&OSCIOFNC_ON&POSCMOD_HS&FNOSC_PRI)
    #define SYSCLK 8000000
    #define t1 3
    #define PREG2 SYSCLK/2/256*t1
    void __attribute__ ((__interrupt__)) _OC1Interrupt(void)
    {
       _OC1IF = 0;
    }
    void main(void)
    {
       OC1CON = 0x0000;
       OC1CON = 0x0005;
       OC1R = 3000;
       OC1RS = 10000;
       _OC1IF = 0;
       _OC1IE = 1;
       PR2 = PREG2;
       TMR2 = 0;
       T2CON = 0x8030;
       while(1)
       {
       }
    }

         Здесь используются те же константы, что и в предыдущей программе, поэтому останавливаться на них мы не будем. В качестве базового таймера для канала 1 модуля генерации цифровых сигналов используется Таймер 2. Настройки Таймера 2 соответствуют интервалу его перезагрузки, равному 3 с.
         В течение этого интервала времени на выводе OC1 будет генерироваться импульс, длительность которого определяется разностью содержимого регистров данных OC1RS и OC1R. Регистр OC1R определяет смещение фронта импульса относительно момента перезагрузки Таймера 1.
         Как только содержимое регистра таймера TMR2 превысит содержимое OC1R, сигнал на выводе OC1 перейдет в состояние ВЫСОКОГО уровня. Этот уровень будет удерживаться до того момента, пока содержимое TMR2 не превысит значение во втором регистре данных OC1RS. После этого сигнал на выводе OC1 перейдет в состояние НИЗКОГО уровня. Таким образом, в каждом периоде перезагрузки Таймера 2 на выводе OC1 будет генерироваться импульсный сигнал, положительный фронт которого будет переключать защелку DD1.
    Настройка режима двойного сравнения выполняется операторами
    OC1CON = 0x0000;
    OC1CON = 0x0005;
    OC1R = 3000;
    OC1RS = 10000;

         Как обычно, перед настройкой нового режима канал 1 следует отключить, что и выполняет первый оператор. Затем в регистр управления канала 1 модуля записывается число 5, которое и определяет выбранный режим работы. Бит 3 регистра OC1CON сброшен в 0, поэтому в качестве базового источника будет использоваться Таймер 2.
         В регистр OC1R записывается значение смещения относительно начала перезагрузки таймера, которое определяет момент формирования нарастающего
         фронта импульса на выходе OC1. Содержимое второго регистра данных OC1RS определяет момент формирования спадающего фронта импульса. Оба значения в данном примере выбраны произвольно, поэтому читатели могут при желании поэкспериментировать с этой программой, записывая в регистры данных различные значения и наблюдая результат. Функция-обработчик прерывания канала 1 модуля _OC1Interrupt используется для сброса флага прерывания _OC1IF, установленного после перепада 1—0 импульса.
         Из прямоугольной последовательности импульсов можно синтезировать непрерывный аналоговый сигнал требуемой частоты. Более того, поскольку микроконтроллеры PIC24F включают, как правило, несколько каналов в одном модуле генерации цифровых сигналов, то можно получить непрерывный аналоговый сигнал, используя микширование различных сигналов в смесителях.
         В простейшем случае для получения, например, синусоидального сигнала частотой 1000 Гц на выходе OC1 можно установить полосовой фильтр со средней частотой 1000 Гц (Рис. 12.7).
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.7. Схема формирования синусоидального сигнала частотой 1000 Гц

         В этой схеме используется аналоговый полосовой фильтр Баттерворта 2-го порядка с центральной частотой 1000 Гц и коэффициентом усиления сигнала, равным 1. Входной импульсный сигнал фильтра поступает с выхода OC1 микроконтроллера PIC24FJ128GA010. Операционный усилитель для такого фильтра должен иметь высокую скорость нарастания входного сигнала (slew rate), чтобы избежать появления нелинейных искажений. Используя несколько таких полосовых фильтров для разных выходных сигналов и смеситель, можно получить непрерывный сигнал произвольной формы и частоты.

    12.2. Аналоговые компараторы в микроконтроллерах PIC24F

         Модуль компараторов аналоговых сигналов и модуль формирования опорного напряжения микроконтроллеров PIC24F часто используются при создании аналого-цифровых интерфейсов различных измерительных и управляющих схем. Модуль формирования опорного напряжения обычно используется в качестве источника смещения (опорного напряжения) для модуля аналоговых компараторов, хотя его вполне успешно можно применить в качестве управляемого цифро-аналогового преобразователя.
         Функциональная схема модуля формирования опорного напряжения показана на Рис. 12.8.
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.8. Модуль формирования опорного напряжения

         Вкратце рассмотрим работу этого модуля. На схеме обозначены биты регистра управления CVRCON данного модуля, соответствующие тем или иным установкам. Бит 4 (CVRSS) регистра CVRCON определяет источник входного напряжения для модуля формирования опорного напряжения. Если бит установлен, то используется внешний источник напряжения, если же CVRSS = 0, то используется напряжение питания микроконтроллера.
         Бит 7 (CVREN) включает (1) или отключает (0) модуль. Бит 5 (CVRR) определяет диапазон изменения и шаг выходного напряжения модуля. Если CVRR = 1, то выходное напряжение изменяется от 0 до значения 0.75CVRSRC, при этом шаг составляет CVRSRC/24 (здесь CVRSRC — выбранное напряжение питания модуля). При CVRR = 0 выходное напряжение модуля формирования опорного напряжения изменяется от 0.25CV до 0.75CVRSRC с шагом CVRSRC/32.
         Биты 3:0 (CVR3:CVR0) регистра управления CVRCON определяют выходное напряжение модуля. При этом значение выходного напряжения определяется выбранным с помощью бита CVRR рабочим диапазоном.
         Если CVRR = 1, то напряжение на выходе модуля CVREF определяется по формуле
    CVREF = (CVR/24) x CVRSRC.
    Если бит CVRR = 0, то выходное напряжение вычисляется следующим образом:
    CVREF = 0.25CVRSRC + (CVR/32) x CVRSRC.

         Кроме этих битов, на функционирование модуля формирования опорного напряжения оказывает влияние бит 6 (CVROE) регистра CVRCON. Если он установлен, то выходное напряжение появляется на выводе CVREF микроконтроллера, если сброшен — выходной каскад вывода CVREF отключается от схем формирования.
         Далее рассмотрим пример применения модуля формирования опорного напряжения в простой схеме контроля температуры на микроконтроллере PIC24FJ128GA010. Аппаратная часть проекта показана на Рис. 12.9.
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.9. Аппаратная часть проекта

         В этой схеме сигнал с датчика температуры LM335 подается на неивертирующий вход операционного усилителя DA1, который здесь работает в качестве компаратора. На инвертирующий вход DA1 подается напряжение смещения с выхода модуля формирования опорного напряжения CVREF, соответствующее напряжению на выходе датчика температуры при температуре окружающей среды приблизительно 25°С. Величина напряжения на выходе CVREF устанавливается программно. Так, для переключения компаратора при температуре, превышающей 25°С, напряжение CVREF должно быть равным примерно 2.98 В.
         При превышении температурой этого значения напряжение на выходе датчика D1 станет выше напряжения на инвертирующем входе и на выходе компаратора DA1 появится ВЫСОКИЙ уровень, что приведет к генерации прерывания INT3.
         Программная часть проекта разработана в среде MPLAB IDE и включает файл со следующим исходным текстом:

    #include <p24fj128ga010.h>
    _CONFIG2(FCKSM_CSDCMD&OSCIOFNC_ON&POSCMOD_HS&FNOSC_PRI)
    #define SYSCLK 8000000
    #define t1 3
    #define PRG1 SYSCLK/2/256*t1
    unsigned long del = 0;
    void __attribute__ ((__interrupt__)) _INT3Interrupt(void)
    {
       _INT3IF = 0;
       _RA0 = 1;
       del = 0;
       TMR1 = 0;
       T1CON = 0x8030;
    }
    void __attribute__ ((__interrupt__)) _T1Interrupt(void)
    {
       _T1IF = 0;
       del++;
       if (del == 5)
       {
       _RA0 = 0;
       T1CON = 0x0;
       }
       }
    void main(void)
    {
       TRISA = 0xfffe;
       _RA0 = 0;
       _INT3IF = 0;
       _INT3IE = 1;
       _T1IF = 0;
       _T1IP = 1;
       _T1IE = 5;
       PR1 = PRG1;
       CVRCON = 0;
       CVRCONbits.CVREN = 1;
       CVRCONbits.CVROE = 1;
       CVRCON |= 0x000B;
       while(1)
       {
       }
    }

         В процессе функционирования программа обрабатывает два прерывания: внешнее прерывание INT3 и прерывание Таймера 1. Прерывание INT3 вызывается переходом сигнала на выходе компаратора DA1 из НИЗКОГО уровня в ВЫСОКИЙ. Функция-обработчик прерывания _INT3Interrupt включает светодиод на выводе 0 порта А и запускает Таймер 1, который предназначен для отсчета времени (15 с) нахождения светодиода во включенном состоянии.
         По прошествии этого интервала светодиод выключается, а Таймер 1 отключается. Формирование задержки и отключение Таймера 1 выполняется в обработчике прерывания _T1Interrupt Таймера 1. Временные параметры рассчитаны для тактовой частоты микроконтроллера, равной 8МГц.
         Конфигурирование модуля формирования опорного напряжения выполняется в основной программе. Оператор

    CVRCONbits.CVREN = 1;

    включает модуль (см. Рис. 12.8), а оператор

    CVRCONbits.CVROE = 1;

         подключает выход модуля к выводу CVREF микроконтроллера. Кроме того, по умолчанию, в качестве источника питания модуля используется источник питания устройства (бит CVRSS равен 0) и выбирается диапазон выходных напряжений с начальным значением 0.25CVRSRC (бит CVRR = 0). Чтобы при таких установках на выходе CVREF появилось напряжение порядка 2.98 В, необходимо в младшие 4 бита регистра управления CVRCON записать код, соответствующий аналоговому напряжению 2.98 – 1.25 = 1.72 В. Это соответствует десятичному значению 11 или шестнадцатеричному 0x000B. Это значение следует записать в регистр CVRCON, что выполняется с помощью оператора

    CVRCON |= 0x000B;

         Инициализация прерывания INT3 выполняется операторами
    _INT3IF = 0;
    _INT3IE = 1;

         а инициализация прерывания Таймера 1 — с помощью операторов
    _T1IF = 0;
    _T1IP = 1;
    _T1IE = 5;

         Запуск Таймера 1 осуществляется в функции-обработчике прерывания INT3 обычным способом с использованием операторов
    TMR1 = 0;
    T1CON = 0x8030;

         Загрузку регистра периода Таймера 1 требуемым значением мы выполняем в основной программе. Перейдем к анализу работы модуля аналоговых компараторов. В микроконтроллере PIC24FJ128GA010 реализовано два канала аналоговых компараторов (Рис. 12.10).
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.10. Функциональная схема двухканального модуля аналоговых компараторов

         Оба канала модуля содержат аппаратно реализованные компараторы (C1 и C2), которые настраиваются с помощью одного регистра управления CMCON.
         Настройка каждого из компараторов заключается в выборе нескольких опций, которые устанавливаются с помощью соответствующих битов регистра управления и состояния CMCON. Вот назначение отдельных битов этого регистра:
    • биты C1EVT и C2EVT (12, 13) — устанавливаются при изменении состояния (переключении) компаратора C1 или C2 соответственно. Биты доступны для чтения и могут быть сброшены программно;
    • биты C1EN и C2EN (10, 11) — установка этих битов разрешает работу компараторов C1 или C2 соответственно, сброс бита запрещает работу соответствующего канала модуля;
    • биты C1OUTEN и C2OUTEN (8, 9) — установка этих битов разрешает прохождение выходных сигналов компараторов C1 и C2 на соответствующие выводы микроконтроллера;
    • биты C1OUT и C2OUT (6, 7) — доступны для чтения и отражают состояние выходов компараторов C1 и C2 соответственно. Значение этих битов определяется установками битов C1INV и C2INV;
    • биты C1INV и C2INV (4, 5) — установка этих битов приводит к инверсии сигнала на выходах компараторов C1 и C2 соответственно. Если биты сброшены в 0, то при условии VIN+> VIN- на выходе компараторов будет ВЫСОКИЙ уровень. Если биты установлены в 1, то при этих же условиях на выходе компараторов будет НИЗКИЙ уровень;
    • биты C2POS и C2NEG (2, 3) — определяют источники входных сигналов для компаратора C2. Если C2POS = 1, то вход VIN+ компаратора С2 подключается к выводу C2IN+, если же C2POS = 0, то вход VIN+ подключается к выходу модуля формирования опорного напряжения CVREF. Если C2NEG = 1, то вход VIN– компаратора C2 подключается к выводу C2IN+, если же C2NEG = 0, то вход VIN– компаратора С2 подключается к выводу C2IN– микроконтроллера;
    • биты C1POS и C1NEG (0,1) — определяют источники входных сигналов для компаратора C1. Если C1POS = 1, то вход VIN+ компаратора С1 подключается к выводу C1IN+, если же C1POS = 0, то вход VIN+ подключается к выходу модуля формирования опорного напряжения CVREF. Если C1NEG = 1, то вход VIN– компаратора C1 подключается к выводу C1IN+, если же C1NEG = 0, то вход VIN– компаратора С1 подключается к выводу C1IN– микроконтроллера.
         Для определения момента переключения компараторов и выполнения соответствующих действий можно задействовать прерывание компаратора, поскольку при изменении состояния выходного сигнала любого из компараторов устанавливается флаг прерывания CMIF (бит 2 регистра IFS1 микроконтроллера). Функция-обработчик прерывания компараторов может прочитать биты C1EVT и C2EVT, чтобы определить, какие именно изменения состояния произошли. Даже если бит разрешения прерывания компараторов CMIE (бит 2 регистра IEC1 микроконтроллера) сброшен, т. е. прерывание запрещено, флаг прерывания CMIF все равно будет устанавливаться при изменениях состояний компараторов.
         Рассмотрим применение канала 1 модуля аналоговых компараторов на примере схемы сигнализации превышения температуры с датчиком LM335. Аппаратная часть проекта показана на Рис. 12.11.
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.11. Аппаратная часть проекта

         Здесь сигнал с датчика температуры D1 поступает на вход C1IN– модуля аналогового компаратора 1. При превышении температуры среды 54°С сработает внутренний компаратор C1 и на его выходе установится ВЫСОКИЙ уровень, который, поступая на вывод C1OUT микроконтроллера, включит светодиод.
         Программно вход C1IN– подключается ко входу VIN– компаратора C1, а на вход VIN+ подается напряжение CVREF с модуля формирования опорного напряжения. При таких настройках для получения ВЫСОКОГО уровня на выходе компаратора C1 при превышении порогового значения необходимо инвертировать выход установкой бита C1INV.
         Программная часть проекта разработана в среде MPLAB IDE. Исходный текст программы приводится далее:

    #include <p24fj128ga010.h>
    _CONFIG2(FCKSM_CSDCMD&OSCIOFNC_ON&POSCMOD_HS&FNOSC_PRI)
    void main(void)
    {
       CVRCON = 0;
       CVRCONbits.CVREN = 1;
       CVRCONbits.CVROE = 1;
       CVRCON |= 0x000D;
       CMCON = 0x0F10;
       while(1)
       {
       }
    }

         Программа очень проста. Поскольку на вход VIN+ компаратора 1 мы подаем опорное напряжение CVREF с выхода модуля формирования опорного напряжения, то первые четыре оператора программы выполняют соответствующие настройки. Для получения напряжения CVREF, равного приблизительно 3.278 В (это соответствует температуре датчика 54°С) при напряжении питания +5 В, в младшие 4 бита регистра управления CVRCON записывается значение 0xD:

    CVRCON |= 0x000D;

         Настройка компаратора 1 выполняется в регистре управления CMCON с помощью оператора

    CMCON = 0x0F10;

         Обратите внимание, что для инвертирования выходного сигнала компаратора С1 бит 4 регистра CMCON (C1INV) установлен.
         Для демонстрации работы прерывания модуля аналогового компаратора немного модифицируем наш проект. Для сигнализации превышения температуры будем использовать бит 0 порта А (вывод RA0 микроконтроллера PIC24FJ128GA010), к которому подключим светодиод, а схему подключения датчика оставим прежней (Рис. 12.12).
    Микроконтроллеры PIC. Архитектура и программирование. Часть 12. Генерация аналоговых и цифровых сигналов
    Рис. 12.12. Аппаратная часть проекта

         Исходный текст программы на языке Си для данного проекта показан ниже:

    #include <p24fj128ga010.h>
    _CONFIG2(FCKSM_CSDCMD&OSCIOFNC_ON&POSCMOD_HS&FNOSC_PRI)
    void __attribute__ ((__interrupt__)) _CompInterrupt(void)
    {
       _CMIF = 0;
       _C1EVT = 0;
       _RA0 = CMCONbits.C1OUT;
    }
    void main(void)
    {
       TRISA = 0xfffe;
       _RA0 = 0;
       CVRCON = 0;
       CVRCONbits.CVREN = 1;
       CVRCONbits.CVROE = 1;
       CVRCON |= 0x000D;
       CMCON = 0x0F10;
       _CMIF = 0;
       _CMIP = 5;
       _CMIE = 1;
       while(1)
       {
       }
    }

         Большая часть исходного текста программы нам уже знакома, поэтому рассмотрим только внесенные изменения. Поскольку компаратор 1 модуля теперь работает в режиме прерывания, то в нашей программе объявлена функцияобработчик прерывания с предопределенным в файле p24fj128ga010.gld именем _CompInterrupt. Функция сбрасывает флаг прерывания _CMIF и флаг события _C1EVT. В защелку 0 порта А записывается значение флага состояния C1OUT компаратора 1, при этом на вывод RA0 подается соответствующий уровень.
    Операторы
    _CMIF = 0;
    _CMIP = 5;
    _CMIE = 1;

    позволяют настроить параметры прерывания модуля аналоговых компараторов, при этом прерыванию присваивается приоритет 5. Последний оператор разрешает работу прерывания. Для функционирования вывода 0 порта А в режиме выхода защелка TRIS этого вывода сбрасывается в 0.
         Мы рассмотрели только часть функций, которые могут выполняться модулями компараторов. Обширная информация по функциям этих модулей и их применению содержится в документации фирмы Microchip.

    ЗАКЛЮЧЕНИЕ

         В этом материале было охвачено как можно более широкий круг вопросов, касающихся программирования систем на базе 16-битных микроконтроллеров PIC. Хотя довольно сложно проанализировать все аспекты проектирования таких систем в одной материале, особенно с учетом бурного развития технологий, тем не менее, автор надеется, что анализ основных принципов разработки и программирования устройств с 16-битными микроконтроллерами фирмы Microchip окажет несомненную пользу и при решении тех задач, которые не были рассмотрены. Хочется надеяться, что даже в таком объеме книга принесет пользу читателю и станет настольной для многих разработчиков, как опытных, так и начинающих.

    Литература
    1. Ю. С. Магда. Микроконтроллеры PIC. Архитектура и программирование, М, 2009.

    Комментарии