STM8L Компараторы: часть2 COMP2 и оконный режим

В первой части мы рассмотрели COMP1. Теперь займёмся вторым компаратором COMP2 и задействуем оконный режим. Работать будем с микроконтроллером STM8L152C6T6, который установлен на плате STM8L-DISCOVERY. STM8L152C6T6 относится к классу medium. Для работы с компараторами возьмём делитель напряжения из первой части, только переделаем его так, чтобы он давал напряжение от 0 до 1,5V.


Выход делителя теперь подключим к ножке PE5 микроконтроллера:



Для иллюстрации подключения компаратора из RM0031 возьмём рисунок из раздела Routing interface (RI) для medium:


Подключаем второй компаратор COMP2. Включаем тактирование и источник опорного:

CLK_PCKENR2_bit.PCKEN25 = 1; //включаем тактирование RI, COMP1, COMP2
COMP_CSR3_bit.VREFEN = 1; // подключаем Vref = 1,221 V к инвертирующему входу COMP1

Входной сигнал отмечен жёлтой линией — выбираем ножку PE5. Это 3 нога в группе — значит RI_IOSR3; группа 7, значит 7 бит- CH24E.

RI_IOSR3_bit.CH24E = 1;

Опорное напряжение на COMP2 приходит по красной линии. За выбор опорного отвечает бит INSEL в регистре COMP_CSR3.

INSEL = 0; // опорное не выбрано
INSEL = 1; // внешний сигнал в качестве опорного
INSEL = 2; // опорное Vref = 1,221 V
INSEL = 3; // опорное 3/4 Vref = 0,916 V
INSEL = 4; // опорное 1/2 Vref
INSEL = 5; // опорное 1/4 Vref
INSEL = 6; // опорное с выхода ЦАП

Выбираем в качестве опорного 3/4 Vref = 0,916 V

COMP_CSR3_bit.INSEL = 3; // опорное 3/4 Vref = 0,916 V

Выбираем скорость компаратоа: быстро/медленно

COMP_CSR2_bit.SPEED = 0; // Slow speed

Настраиваем детектор фронтов COMP2 и включаем триггер Шмидта на PE5:

COMP_CSR2_bit.CMP2 = 3; //срабатывает по фронту и спаду (нужно, даже если не нужны прерывания)
COMP_CSR4_bit.NINVTRIG = 1;

Подключаем первый компаратор COMP1. Подаём входной сигнал (жёлтая линия) на его неинвертирующий вход.
Таким образом, будут задействованы оба компаратора (оконный режим).

COMP_CSR3_bit.WNDWE = 1; // WINDOW mode

Включаем триггер Шмидта и настраиваем детектор фронтов на COMP1.

COMP_CSR1_bit.STE = 1;
COMP_CSR1_bit.CMP1 = 3; //срабатывает по фронту и спаду (нужно, даже если не нужны прерывания)


Для отображения работы COMP1 настраиваем ГОЛУБОЙ СВЕТОДИОД
Для отображения работы COMP2 настраиваем ЗЕЛЕНЫЙ СВЕТОДИОД

PC_DDR_bit.DDR7 = 1; //настраиваем C7 на выход ГОЛУБОЙ СВЕТОДИОД
PC_CR1_bit.C17 = 1; //переключаем его в режим push-pull
  
PE_DDR_bit.DDR7 = 1; //настраиваем E7 на выход ЗЕЛЕНЫЙ СВЕТОДИОД
PE_CR1_bit.C17 = 1; //переключаем его в режим push-pull

В цикле будем отображать выходы компараторов.

while (1) 
{   
  PC_ODR_bit.ODR7 = COMP_CSR1_bit.CMP1OUT; //переключаем пин от COMP1 
  PE_ODR_bit.ODR7 = COMP_CSR2_bit.CMP2OUT; //переключаем пин от COMP2
}

При помощи переменного резистора меняем входное напряжение на ножке PE5 от 0 до 1,5V. Контролируем его внешним вольтметром. COMP1 настроен на порог 1,221V. COMP2 настроен на порог 3/4 Vref = 0,916V. Видим, как переключаются компараторы и вместе с ними светодиоды. Файл с примером COMP_2_WND.zip находится во вложении.

Сделаем пример, в котором будут использоваться прерывания COMP1 и COMP2.
Добавим обработчик прерывания:

#pragma vector = 20  //прерывание по срабатыванию COMP1, COMP2
__interrupt void COMP_EF1_EF2(void)
{  

  if( (COMP_CSR2_bit.CMP2OUT == 1) &&  (COMP_CSR1_bit.CMP1OUT == 0) ) 
  {
    PC_ODR_bit.ODR7 = 1;  // Vin внутри диапазона - ГОЛУБОЙ СВЕТОДИОД горит
  }
  else
  {
    PC_ODR_bit.ODR7 = 0;  // Vin вне диапазона - ГОЛУБОЙ СВЕТОДИОД потушен
  }

  COMP_CSR1_bit.EF1 = 0;   //обнуляем бит выхода из прерывания COMP1
  COMP_CSR2_bit.EF2 = 0;   //обнуляем бит выхода из прерывания COMP2
}

Голубой светодиод отображает работу компараторов уже внутри прерывания. COMP1 настроен на порог 1,221V. COMP2 настроен на порог 3/4 Vref = 0,916V. Когда Vin внутри диапазона — ГОЛУБОЙ СВЕТОДИОД горит, когда Vin вне диапазона — ГОЛУБОЙ СВЕТОДИОД потушен. Внутри обработчика необходимо вручную обнулять биты выхода из прерывания EF1 и EF2. На этот вектор (20) прилетают прерывания не только от COMP1, но и от COMP2 и от АЦП.
В основном цикле разрешаем прерывания COMP1, разрешаем прерывания COMP2 и глобально разрешаем прерывания:

COMP_CSR1_bit.IE1 = 1;  
COMP_CSR2_bit.IE2 = 1;
asm("rim");
while (1); //ждём прерывания

К выходу C7 помимо светодиода я подключил жёлтый канал осциллографа. На вход делителя напряжения вместо AVCC=3V я подал синусиду от внешнего генератора 50Гц. Её видно на синем луче осциллографа. Работа оконного компаратора будет зависеть от настройки детекторов фронтов COMP1 и COMP2.

Компаратор включается на ниспадающей части входного сигнала между 1,221V и 0,916V.
COMP_CSR1_bit.CMP1 = 1; // COMP1 срабатывает по спаду
COMP_CSR2_bit.CMP2 = 1; // COMP2 срабатывает по спаду



Компаратор включается на восходящей части входного сигнала между 0,916V и 1,221V.
COMP_CSR1_bit.CMP1 = 2; // COMP1 срабатывает по фронту
COMP_CSR2_bit.CMP2 = 2; // COMP2 срабатывает по фронту



Компаратор включается на обеих частях входного сигнала между 0,916V и 1,221V.
COMP_CSR1_bit.CMP1 = 3; // COMP1 срабатывает по фронту и спаду
COMP_CSR2_bit.CMP2 = 3; // COMP2 срабатывает по фронту и спаду



Файл примера COMP_2_WND_INTR.zip находится во вложении.
  • +2
  • 02 апреля 2019, 22:26
  • CreLis
  • 2
Файлы в топике: COMP_2_WND.zip, COMP_2_WND_INTR.zip

Комментарии (0)

RSS свернуть / развернуть
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.