STM8L–Аналоговый компаратор

9 Февраля 2011 К комментариям

Хотел испытать АЦП с ПДП контроллером, но случайно вывел из строя ЖКИ индикатор от сотового Nokia 1100, так что пока придет новый решил посмотреть что же такое компаратор.

001

В состав микроконтроллера входит два аналоговых компаратора.

Аналоговый компаратор 1 (COMP1)

В начале посмотрим на функциональную схему модуля:

image

Как видим данный компаратор имеет один фиксированный пороговый уровень, значение которого равно опорному напряжению (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