В предыдущей части занятия мы познакомились с принципом работы компаратора, с модулем компараторов, а также с модулем источника опорного напряжения.
Теперь на основе вышеизложенного попробуем что-нибудь сочинить.
Мы будем с помощью делителя, собранного на обычном переменном резисторе, изменять напряжение на входе одного из компараторов модуля и следить за переходом через порог напряжения, установленного с помощью модуля источника опорного напряжения. В случае превышения порога мы будем зажигать светодиод, а в случае возврата обратно в состояние ниже данного порога будем светодиод тушить.
Делитель будем использовать с прошлого урока, причём средняя ножка переменного резистора у нас будет подключенной к той же ножке порта RA0 ввиду совпадения входов AN0 у первого канал АЦП и входа первого компаратора. Подключим делитель к плате
Перемычки светодиодов также установим.
Подключим программатор, подключив его затем и к ПК.
Проект возьмём за основу из урока 23 по передаче данных по шине USART с именем USART_TX и назовём его COMP_AN.
Откроем проект в MPLAB X, сделаем его главным и в настройках убедимся, что контроллер будет питаться от программатора.
Удалим из файла main.c все служебные функции, оставим только main(), в котором удалим весь код, оставим лишь только пустой бесконечный цикл
1 2 3 4 5 6 |
void main() { while(1) { } } |
Настроим ножки входов обоих компараторов на вход, а порт B весь на выход
1 2 3 4 5 6 |
void main() { TRISA=0X03; PORTA=0X00; TRISB=0X00; PORTB=0X00; |
Включим использование первого диапазона значений множителя источника опорного напряжения
1 2 |
PORTB=0X00; CVRR = 1; |
Коэффициент множителя установим, например, в 12
1 2 3 4 5 |
CVRR = 1; CVR3 = 1; CVR2 = 1; CVR1 = 0; CVR0 = 0; |
Напряжение опорное для самого источника у нас будет питание контроллера. Я его измерил — оно равно 4,61 вольт.
Тем самым, получим выходное напряжение источника 12/24*4,56 около 2,28 вольт.
Включим источник опорного напряжения
1 2 |
CVR0 = 0; CVREN = 1; |
Теперь настроим модуль компараторов.
Использовать будем только первый компаратор и включим инвертирование его выхода, так как у нас опорное напряжение на плюсовом входе
1 2 |
CVREN = 1; C1INV = 1; |
Включим режим двух компараторов общим опорным (неинверсным) входом и мультиплицированными инверсными входами (CM2:CM0 = 110)
1 2 3 4 |
C1INV = 1; CM2 = 1; CM1 = 1; CM0 = 0; |
Добавим глобальную переменную для считывания регистра CMCON
1 2 3 |
#include "string.h" //------------------------------------------------ unsigned char tmp; |
Дальше небольшая хитрость, не помню даже, где я о ней узнал, но лучше так сделать. Спустя 10 микросекунд мы либо считываем либо что-то пишем в регистр CMCON для устранения несоответствия
1 2 3 |
CM0 = 0; __delay_us(10); tmp = CMCON; |
Затем, предварительно сбросив флаг прерывания, включим прерывания от модуля компараторов
1 2 3 4 5 |
tmp = CMCON; CMIF = 0; CMIE = 1; PEIE = 1; GIE = 1; |
В бесконечном цикле будем мигать одним из светодиодов, чтобы убедиться, что компаратор работает независимо и на ход общей программы не влияет
1 2 3 4 5 6 |
while(1) { PORTB |= 0X80; __delay_ms(105); PORTB &= ~0X80; __delay_ms(105); |
Над функцией main() добавим функцию-обработчик прерываний от компаратора
1 2 3 4 5 6 7 8 |
//------------------------------------------------ void __interrupt(high_priority) tcInt(void) { if (CMIF) { } } //------------------------------------------------ |
В теле условия в функции-обработчике мы сбросим флаг прерывания, определим, в какую сторону мы перешли порог срабатывания, и зажжём или потушим, в зависимости от этого, светодиод
1 2 3 4 5 6 7 8 9 10 11 12 |
if (CMIF) { CMIF=0; if (C1OUT) { PORTB |= 0X01; } else { PORTB &= ~0X01; } } |
Соберём код, прошьём контроллер и покрутим винт переменного резистора, чтобы убедиться, что компаратор работает правильно и правильно реагирует на пересечение порога срабатывания. Подключим к общему проводу схемы и к среднему выводу резистора мультиметр, чтобы нам видеть, на каком именно пороге срабатывает компаратор. Если напряжение меньше порогового, то у нас светодиод не горит
Светодиод загорается, если мы порог превысим
При уменьшении напряжения ниже порогового, которое обеспечивается источником опорного напряжения, у нас светодиод опять должен тухнуть.
Таким образом, в данном уроке мы познакомились с модулем компараторов, а также ещё и с модулем источника опорного напряжения, который служил нам в качестве порогового напряжения компаратора.
Всем спасибо за внимание!
Предыдущая часть Программирование МК PIC Следующий урок
Купить программатор (неоригинальный) можно здесь: PICKit3
Купить программатор (оригинальный) можно здесь: PICKit3 original
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий