STM8L-Аналого-Цифровой Преобразователь (АЦП)

Сегодня кратенько о модуле АЦП. Плюс полный проект с примером.

001

В отличии от STM32, в микроконтроллерах серии STM8L модуль АЦП более простой, но в то же время более “продвинутый”, чем например AVR-ках.


Модуль АЦП Кратенько рассмотрим что же “может” АЦП:

  • разрешение 12, 10, 8, 6-бит
  • режимы одиночного и циклического преобразования
  • возможность подключения к встроенному ИОН и датчику температуры
  • время преобразования до 1 мкс, при тактовой частоте МК 16 МГц
  • возможность установки времени преобразования
  • аналоговый сторожевой триггер (не уверен в правильности интерпретирования “analog watchdog”)
  • возможность работы с контроллером DMA
  • и это ещё не все, читайте в документации RM0031.
Функциональная схема модуля АЦП:

image

Для начала работы с АЦП необходимо:

  • разрешить тактирование модуля
  • сконфигурировать необходимый режим работы
Максимальная частота для модуля АЦП составляет 16 МГц, при частоте системной шины 16 МГц. Я опять пропустил модуль тактирования, так как после сброса микроконтроллер работает от встроенного RC генератора частотой 16 МГц, с коэффициентом деления 8, т.е. на частоте 2 МГц, чего более чем достаточно на данном этапе.

Разрешим тактирование модуля:

CLK->PCKENR2 |= CLK_PCKENR2_ADC1;


Начать я думаю можно с простого режима однократного преобразования одного канала (точнее канал то у нас всегда один, так как физически у нас одно АЦП с мультиплексором).

Определившись с линией ввода-вывода необходимо её сконфигурировать, я выбрал линию PA6:

#define ADC_INPUT		A, 6, HIGH, INPUT_FLOATING_WITHOUT_ITERRUPT

PIN_CONFIGURATION(ADC_INPUT);


Однако после этого необходимо отключить триггер Шмитта, в регистре ADC_TRIGR (ADC trigger disable) для соответствующей линии, в моем случае это нулевой вход мультиплексора:

image

ADC1->TRIGR[4-1] = BIT(0);


Вход выбран и настроен, можно перейти к настройке режима работы АЦП.

По умолчанию разрешена работа АЦП с блоком ПДП (DMA), пока он нам не нужен отключим его:

ADC1->SQR[1-1] = ADC_SQR1_DMAOFF;


Модуль АЦП может последовательно преобразовывать несколько каналов, нам пока нужен лишь один канал:

ADC1->SQR[4-1] = BIT(0);


Зададимся временем преобразования (48 тактов):

ADC1->CR2 = 4;


Осталось только выбрать разрешение (8-бит), режим однократного преобразования и включить АЦП:

ADC1->CR1 = ADC_CR1_ADON | ADC_CR1_RES_8BIT;


Для запуска преобразований достаточно программного запуска:

ADC1->CR1 |= ADC_CR1_START;


После подождать окончания преобразования:

while ((ADC1->SR & ADC_SR_EOC) == 0)
{
}


и считать полученный результат:

adc_result = ADC1->DRL;


Ну вот и всё ;)

Примечание. На форуме попадалось высказывание что АЦП не очень хорошее в связи со встроенным ИОН, и результат “пляшет” очень сильно. У меня результат такой при 6,8,10 битах иногда переключается последний разряд, при 12 битах +-2 единицы. Это без фильтрации 50 Гц, и длинных проводках до переменного резистора (номинал 50 кОм (импортный, в наш ряд не попадает)).




Тестовый проект

На основе рассмотренного выше примера работы с АЦП, я написал маленький пример. Напряжение на вход АЦП подаю с делителя напряжения (аналогично примеру с STM32), результат преобразования вывожу на два индикатора. Подключение индикаторов прописано в файле main.h:

#define LCD_NOKIA_1100_RST		D, 3, LOW, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_NOKIA_1100_CS		D, 2, LOW, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_NOKIA_1100_SDA		D, 1, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_NOKIA_1100_SCLK		D, 0, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ

#define LCD_2X16_RS		C, 5, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_2X16_E		C, 4, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_2X16_DB4	C, 3, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_2X16_DB5	C, 2, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_2X16_DB6	C, 1, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ
#define LCD_2X16_DB7	C, 0, HIGH, OUTPUT_PUSH_PULL_SPEED_LIMIT_10MHZ


Задержка реализована простым программным циклом:

void delay_ms(uint16_t time)
{
	volatile uint32_t i;

	while (time-- > 0)
	{
		i = 30;
		while (i-- > 0)
		{
		}
	}
}


Основной цикл:

int main(void)
{
	PIN_CONFIGURATION(ADC_INPUT);

	lcd_nokia1100_init();
	lcd_nokia1100_set_position(7, 0);
	lcd_nokia1100_print_string("ZiBlog.ru @ 2011");
	lcd_nokia1100_set_position(1, 1);
	lcd_nokia1100_print_string("ADC CH0:");

	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 CH0:");

	mcu_adc_init();

	while (1)
	{
		ADC1->CR1 |= ADC_CR1_START;
		while ((ADC1->SR & ADC_SR_EOC) == 0)
		{

		}

		lcd_nokia1100_set_position(1, 10);
		lcd_nokia1100_print_dec_xxx(ADC1->DRL);

		lcd_2x16_set_position(1, 10);
		lcd_2x16_print_dec_xxx(ADC1->DRL);
	}

	return 0;
}


old.ziblog.ru/2011/01/30/stm8l-analogo-tsifrovoy-preobrazovatel-atsp/
  • 0
  • 27 августа 2011, 13:48
  • ZiB

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

RSS свернуть / развернуть
Блин, я тоже сейчас про него пишу :)
Но у меня чуть подробнее, с блекджеком и DMA.

Однако после этого необходимо отключить триггер Шмитта
Просто электричество экономит, а необходимости в этом нет.

Да и я так и не понял, кто все эти люди и о каком внутреннем ИОН для АЦП они говорят?

The reference voltage is either internally connected to analog power supply pins or
connected to external pins where you can connect a reference voltage source. This
reference voltage connection option depends on the given STM8 package and STM8 device
type.
(AN2719)

А от внутренней опоры АЦП работать не может, зато может её измерить, чтобы посчитать, к примеру, напряжение питания.
0
Не понял мысли по ИОН :( чего хотел сказать то?
0
На форуме попадалось высказывание что АЦП не очень хорошее в связи со встроенным ИОН, и результат “пляшет” очень сильно.
Встроенный ИОН вроде для АЦП нельзя использовать.
0
А ты вон про что :)
Внутреннюю структуру АЦП я не видел, поэтому сказать ни чего не могу по этому поводу. Но верно подмечено не корректно написана фраза:
… связи со встроенным ИОН…
На счет отключение триггера, это я рекомендую делать очень сильно влияет на результат преобразования, забирает вверх чуть-чуть.
0
*Посмотрел на фотку*
О_о это ты весь RM0031 распечатал чтоли? :)
0
Да, это одни из первых экспериментов, писано ещё в январе.
Не люблю читать с монитора, но в виде книги у меня только по STM8L и STM32L, так как больше всего мне понравились.
0
Даташиты и подобные им документы я обычно читаю в электронном виде — удобнее навигация и поиск.

А вот всякие книги стараюсь доставать в бумажном виде или печатать.
0
Книгой то же нормально, не нужно часто переключаться, да и на буке не очень комфортно, тем более процесс у меня отлажен, да же как то твердый переплет делал :)
ziblog.ru/2010/10/26/kak-sdelat-knigu/
0
А как делаете в мягком? Твердую корочку заменяете на мягкую бумагу? Сколько по времени занимает весь процесс?
0
Детально не засекал время, но думаю при среднем объеме 200-300 страниц около двух часов. Саму книгу так же делаю. Обложку печатаю на бумаге формата А3, обрезав по длине до формата А4 для печати на принтере название или полноцветной обложки. Далее ламинирую и приклеиваю к самой книге. Получается очень качественно и быстро. Я как-то фотографировал процесс, но что-то сходу не нашел фотографий.
0
Маньяк. Мне тонера жалко. Да и давно уже электронные книги бумажным предпочитаю для всех применений. Разве что, для этого не подойдет.
0
а читалку с e-ink кто нить юзает? а то думаю какую бы прикупить чтобы pdf удобно было читать.
0
Я пока что слюнки на нее пускаю. Для PDF/DJVU однако ж выбор невелик — нужна читалка с экраном 10". Из того что я видел/о чем слышал — Kindle DX, Pocket Book какой-то и вроде еще одна модель. Стоят около 13-15к. Но меня больше интересуют 6" читалки для обычных книжек, техлитературу и справочники я вся равно прямо на компе читаю.
0
О я начинал с Plam-ов, сейчас у меня КПК от HP под виндой, но видать я совсем старый :) ну не люблю я с экрана читать. Да и делать что-то «руками» мне нравиться, книгу по шитью (использованная в примере) для себя печатал, сшил по ней рубашку для себя :)
0
Круть! Покажи)
0
Всякие е-буки мы вот тут обсуждали. Там даже есть видео, где на такой книжке даташит на мегу листают. Дико неудобно!
0
А и фиг с ними, с даташитами. Они как правило нужны исключительно за компом, а с ним по удобству тягаться некому. Хотя был случай когда я курил даташиты на КПК iPAQ h2210 (320x240 3.5"). Неудобно :) Хотя для того, чтобы выбрать из имеющихся в промэлектронике микросхем регуляторов громкости подходящие хватило.
А вот худлит на них читается прекрасно. У КПК все же мал экран и главное — велик аппетит (моего хватало часов на 6). У Pocket Viewer аппетит на уровне e-ink, но экран ужасен, нормально видно только при очень специальном освещении.
Кстати, о упомянутом по ссылке Wexler'е. Я покупал было Wexler.book T5001. Прошивка оказалась совершенно непригодной для использования :( В остальном интересный девайс.
0
Ну у меня сейчас нетбук есть. Для того, чтобы пойти почитать мануал где-нибудь на балконе или на лавочке во дворе его достаточно. Дисплей конечно не e-ink, зато светится :)

Вообще, дико полезная штука. С его покупкой я первые недели две включал десктоп только чтобы музыку послушать, да торренты покачать :)
0
У меня есть Hanlin V3+ Но на ней ПДФ не очень. Я на ней книжки нормальные скорей читаю. Хотя пару раз пригодилась и для даташитов.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.