STM8L–Аналоговый компаратор
Хотел испытать АЦП с ПДП контроллером, но случайно вывел из строя ЖКИ индикатор от сотового Nokia 1100, так что пока придет новый решил посмотреть что же такое компаратор.
В состав микроконтроллера входит два аналоговых компаратора.
Аналоговый компаратор 1 (COMP1)
В начале посмотрим на функциональную схему модуля:
Как видим данный компаратор имеет один фиксированный пороговый уровень, значение которого равно опорному напряжению (V_ref = 1,225 Вольт). Данное напряжение подается на инверсный вход компаратора.
Не инверсный вход компаратора может быть подключен к одной из 25-ти линий ввода-вывода, выбор нужно линии производится в блоке коммутации аналоговых сигналов (Routing interface). А так же совместно со вторым компаратором работать в «оконном» режиме.
Примечание. Одновременно использовать компаратор и АЦП не получается, так как вход модуля АЦП подключается к линиям ввода-вывода посредством тех же линий. АЦП переключает входа «сам», а биты CHxE и ASx должны быть сброшены. Однако возможно использовать одновременно АЦП и компаратор при подключении обоих к одной линии, далее я этим воспользуюсь.
Выход компаратора подключен к детектору фронтов. Детектор позволяет «выделять» нарастающий или спадающий фронт, или сразу оба и генерировать соответствующее прерывание (или пробуждать микроконтроллер из «спячки»).
Для использования компаратор нам нужно:
- подключить опорное напряжение к инверсному входу компаратора
- выбрать входную линию
- при необходимости разрешить прерывания
- настроить детектор фронтов
Пример
Так как модуль АЦП мы уже рассмотрели, попробуем использовать его совместно с компаратором.
Первым делом настроим компаратор.
Разрешим тактирование:
CLK->PCKENR2 |= CLK_PCKENR2_COMP;
Подключаем опорное напряжение к инверсному входу компаратора:
COMP->CSR3 = COMP_CSR3_VREFEN;
Делитель напряжения подключен у меня к линии PA6:
RI->ASCR2 |= BIT(6);
RI->ASCR1 |= BIT(1);
RI->IOSR1 |= BIT(0);
Прерывания использовать пока не будем.
Настроим детектор фронтов:
COMP->CSR1 = 3;
Настройки АЦП смотрим в предыдущей записи.
Пример целиком:
//------------------------------------------------------------------------------
int main(void)
{
PIN_CONFIGURATION(ADC_INPUT);
lcd_2x16_init();
lcd_2x16_set_position(0, 0);
lcd_2x16_print_string("ZiBlog.ru @ 2011");
lcd_2x16_set_position(1, 0);
lcd_2x16_print_string("ADC:");
lcd_2x16_set_position(1, 8);
lcd_2x16_print_string("COMP:");
// компаратор
CLK->PCKENR2 |= CLK_PCKENR2_COMP;
COMP->CSR3 = COMP_CSR3_VREFEN;
RI->ASCR2 = BIT(6);
RI->ASCR1 = BIT(0);
RI->IOSR1 = BIT(0);
COMP->CSR1 = 3;
// АЦП
CLK->PCKENR2 |= CLK_PCKENR2_ADC1;
ADC1->TRIGR[4-1] = BIT(0);
ADC1->SQR[1-1] = ADC_SQR1_DMAOFF;
ADC1->SQR[4-1] = BIT(0);
ADC1->CR3 = 0;
ADC1->CR2 = 4;
ADC1->CR1 = ADC_CR1_ADON | BIT(6);
while (1)
{
ADC1->CR1 |= ADC_CR1_START;
while ((ADC1->SR & ADC_SR_EOC) == 0)
{
}
lcd_2x16_set_position(1, 4);
lcd_2x16_print_dec_xxx(ADC1->DRL);
lcd_2x16_set_position(1, 13);
if (COMP->CSR1 & COMP_CSR1_CMP1OUT)
lcd_2x16_print_string("ON ");
else
lcd_2x16_print_string("OFF");
}
return 0;
}
Уровень “срабатывания” компаратора приблизительно равен опорному напряжению (1,225 Вольт), опорное напряжение АЦП 3,3 Вольта следовательно переключение будет происходить при значении АЦП равном (1,225/3,3)*256 = 95, реально так и получилось. Однако стоит отметить что я не сбросил биты CHxE и ASx, как было рекомендовано в документации.
На этом пока все.
Второй компаратор, возможно рассмотрю в следующий раз.
comments powered by Disqus