Уроки MSP430 LaunchPad. Урок 15: Преобразование аналогового сигнала

Глядя на последние уроки, можно сказать, что нам осталось изучить только два, из основных устройств периферии. Сегодняшний урок, мы начнём с рассмотрения Аналогово-Цифрового Преобразователя (АЦП), или Analog to Digital Converter (ADC), а в следующем приступим к изучению связи по последовательному интерфейсу.

Существование АЦП, напрямую связано с существованием Цифро-Аналогового Преобразователя (ЦАП), или Digital to Analog Converter (DAC). К несчастью, очень сложно полностью понять, как работает один, без понимания того, как работает другой. Но мы попробуем начать изучать каждый понемногу. Для понимания внутренних процессов, происходящих в АЦП и ЦАП, нужно понять для чего они существуют, поэтому для начала, разберёмся в разнице между аналоговым и цифровым сигналом.

Аналоговый сигнал, это то, с чем мы обычно встречаемся в окружающем нас физическом мире. Слишком мощная лампочка, может быть подключена к схеме, где вращая ручку, мы плавно изменяем яркость. В электроплите на кухне, можно плавно настраивать температуру между 50 и 300⁰С. Музыка, которую вы слушаете, создаётся пульсированием мембраны динамика, что приводит к появлению волн переменного давления воздуха, которое интерпретируется нашими ушами как звук. Большая часть существующей вселенной, аналоговая, это означает, что любые измерения, приведут к получению любого результата, в промежутке плавно изменяющихся значений. Наглядным примером является синусоида. Не важно, насколько детально вы будете разглядывать график этой функции, это всегда будет плавная линия. Каждое, из бесконечного количества, чисел между -1 и 1 будет найдено на этом графике.

В то время, как цифровой сигнал, существует только во вселенной компьютеров и электроники. Ключевое отличие цифрового сигнала от аналогового, это наличие только дискретных значений. Это как разрешить существование только значений 1, 2 и 3, и запретить 1.3 или 2.14 и подобных. Пример дискретной версии синусоиды, можно увидеть на этом рисунке.

Красные линии показывают цифровые значения, приближенные к линии синуса (голубой цвет). Возможно, этот пример не очень хорошо смотрится, но он позволяет представить себе, что случится, если у нас будет больше 9 возможных значений, доступных здесь. Можно понять, что чем больше значений дискретизации, тем лучше приближение к графику аналоговой функции. Самый простой периферийный модуль АЦП в MSP430, 10-битный, что даёт 2ˆ10 (или 1024) значений. Аппроксимированный график синусоиды выглядит гораздо лучше с таким набором значений:

Понятно, что чем больше бит, тем лучше будет результат, но это усложняет схему и замедляет скорость работы АЦП. Это станет очевидно, если понять, откуда АЦП получает значения. Давайте посмотрим, как он работает.

На самом деле, мы уже работали с простейшим АЦП, когда использовали компаратор. Когда мы конвертируем аналоговое значение (здесь напряжение) в цифровое (число), результат указывает нам на величину аналогового сигнала. Для компаратора, сигнал порогового напряжения, устанавливает некое аналоговое значение, и число на выходе компаратора, 0 или 1, зависит от величины этого порогового сигнала. Таким образом, получается 1-битный АЦП, т.к. выдаваемое им значение вмещается в 1 бит.

Насколько это применимо в приложениях? Что можно узнать по одному биту, которым ограничен компаратор и что он может сказать о входящем аналоговом сигнале? Если сигнал меняется, переходя пороговое значение, мы видим как бит меняется с 0 на 1. Но если сигнал меняется, оставаясь выше, или ниже порогового значения, мы не сможем узнать об этих изменениях.

Первое, приходящее в голову решение, поставить второй компаратор, с другим пороговым значением. Если на первом компараторе порог будет 1 В, а на втором 2 В, то если они оба вернули 1, значит напряжение входящего сигала Vin, превосходит пороговое напряжение, мы можем получить такие результаты:
  • 0,0: сигнал на обоих компараторах ниже порогового напряжения, значит напряжение сигнала меньше 1 В.
  • 0,1: сигнал на первом компараторе выше порога, на втором ниже, значит напряжение сигнала больше 1 В, но меньше 2 В.
  • 1,1: сигнал на обоих компараторах выше порога, значит напряжение входящего сигнала больше 2 В.
  • 1,0: невозможная ситуация, т.к. напряжение сигнала не может быть больше 2 В, и меньше 1 В одновременно.

Такая комбинация из компараторов будет работать, но не очень эффективно. Мы сможем получить лучшее представление о входящем сигнале, но не лучшим способом.

На MSP430 используется АЦП последовательного приближения, или SAR ADC (Successive-Approximation-Register ADC). Это причудливое имя, на самом деле, просто описание того, как АЦП делает измерения. Играли в угадывание числа? Например, я загадываю номер от 1 до 100, и вы должны пытаться его отгадать, а я говорю больше или меньше загаданного, называемые вами варианты чисел. Какой самый эффективный путь отгадывания? Понятно, что самое логичное начать с 50, это гарантирует равные по скорости отгадывания возможности. А дальше? Логично использовать половинное значение оставшегося участка, т.е. если я скажу «больше» нужно выбрать 75, если «меньше» 25. Если продолжать по такому алгоритму, то не потребуется много шагов, для отгадывания задуманного мной числа (не больше 7, в большинстве случаев).

АЦП последовательного приближения работает по тому же принципу. В двоичном представлении, 1 со всеми последующими нолями, это всегда половина максимально возможного числа (например 0b1000 это 8, тогда как максимальное число 0b1111 или 15). Если мы возьмем всего один компаратор, и используем половинное опорное напряжение, мы получим наш первый бит, если сигнал выше 1/2 Vref, этот бит 1, если ниже, то 0. Затем, мы устанавливаем опорное напряжение на 1/4 или 3/4, в зависимости от предыдущего результата, и сравниваем вновь, получая следующий бит. Используя такой метод, вы можете получить цифровое значение, любого размера, в зависимости от того, сколько измерений вы сделали. В случае 10-битного АЦП в MSP430, это 10 измерений.

Таким образом, вместо добавления дополнительного компаратора для каждого возможного значения сигнала, мы используем один. Недостатком является необходимость менять опорный сигнал и делать множество последовательных измерений. Эти два фактора, приводят к ограничению скорости измерения. Для очень быстрых измерений, необходимо, как ускорить делитель опорного напряжения, так и запись результата в регистр (они оба зависят от частоты тактового сигнала ЦПУ, конечно). АЦП в MSP430 делает около 200000 снятий значений в секунду (samples per second, или 200 ksps, как это обозначается в спецификации).

Использование модуля АЦП


Модуль 10-битного АЦП (ADC10), как и модуль компаратора (Comparator_A+), имеет большое число рабочих режимов и настроек. Он может так же, объединятся с другими периферийными модулями (такими как таймер (Timer_A)), что делает его мощным измерительным инструментом. Сегодня мы рассмотрим базовые настройки АЦП, и проведем эксперимент с его использованием. Не забывайте, что нам необходим именно микроконтроллер с АЦП на борту, такой как G2231, в то время как G2211 не подойдет для этого урока. (В LaunchPad 1.5, оба чипа, и G2553, и G2452 имеют АЦП – прим. пер.).

Для начала изучим возможности периферийного модуля АЦП. Конечно, для его работы, необходим тактовый сигнал, АЦП может работать от любого, из трех источников тактового сигнала MSP430 (а значит и от кварца, на DCO или VLO). Кроме того, в модуле АЦП, есть собственный, не зависимый, генератор тактов. Этот генератор обычно работает на частоте около 5 мГц, но она не откалибрована, и может отличаться на разных чипах, а так же она зависит от напряжения питания и температуры. Главное преимущество встроенного генератора тактов, то, что он продолжает работать, даже когда все остальные тактовые сигналы остановлены в режиме экономии LPM.

Модуль АЦП ADC10, может брать сигнал с 16 входов. Обычно, 8 из них, – внешние входы, 4 – внутренние, 4 – для других применений (на некоторых моделях MSP430, они используются как дополнительные внешние входы). У G2231 есть 8 внешних входов, по одному на каждом выводе порта P1, а так же встроенный датчик температуры, подключенный к одному из внутренних входов АЦП (три других внутренних входа, работают с опорным напряжением).

Как и компаратор, АЦП нуждается в сигнале опорного напряжения. По факту, он может работать сразу с двумя сигналами опорного напряжения, для обозначения верхней и нижней границ конвертирования. Верхнее опорное напряжение, может быть любым, от 1.4 В до Vcc (до 3.6 В). Нижнее опорное напряжение, любое между 1.2 В и 0. Два источника опорного напряжения доступны внутри модуля АЦП, на 1.5 В и 2.5 В, а так же он может использовать Vcc, и внешний источник.

Модуль АЦП имеет 4 режима работы. Два из них – одноканальные. Два других, последовательно снимают сигнал с определенных из 16 входов. Каждая такая последовательность оцифровки сигнала с нескольких входов, может быть сделана один раз, а может непрерывно повторяться. (Важный момент, вы должны подключать входы в заданном порядке. Если вам нужно оцифровать сигнал с 3 входов, вы должны использовать A0, A1 и A2. Если вы хотите снимать сигнал не по порядку, то вам придется использовать одноканальный режим АЦП, и менять вход канала из программы.)

Эти режимы дают огромное число возможностей по настройке АЦП под конкретную задачу. Мы не будем рассматривать все варианты, просто помните об их существовании. Лучший способ научится использовать АЦП, использовать его на практике. Напишем свой пример, переделав наш проект измерителя ёмкости в вольтметр. Он будет не очень практичен, т.к. меряет напряжение только в диапазоне от 0 до 3.3 В, но он продемонстрирует принципы использования АЦП. Результат измерения будем выводить на ЖК-экран, но если у вас нет дисплейного модуля, можете легко модифицировать программу так, что бы смотреть результат в отладчике, как мы, в свое время, делали это с компаратором. Мы будем использовать АЦП в одноканальном режиме и непрерывно повторять измерение, по команде из программы.

В руководстве по семейству микроконтроллеров x2xx, есть серия диаграмм, объясняющая процесс использования каждого из четырех режимов АЦП. Например, в циклическом одноканальном режиме, модуль должен быть включен и доступен. Затем АЦП дается команда начать преобразование, которое сохраняется после завершения. Если прерывание разрешено, то его флаг устанавливается, и АЦП возвращается на один из трёх шагов, зависящих от наших настроек. Не забываем, что все происходит внутри модуля АЦП, оставляя возможность MSP430 заниматься своими делами. Можно использовать прерывания АЦП, что бы сделать что-нибудь с результатом преобразования в программе.

Наш код будет использовать однократный одноканальный режим, который то же самое, что и циклический одноканальный режим, только без цикла. Я его выбрал, так как не собираюсь использовать экономные режимы, и в этом режиме проще координировать временные задержки работы ЖК-панели и считывание данных с АЦП. Пока новое преобразование происходит, код висит в цикле, и ждет, пока преобразование закончится. Когда АЦП отработал, считывается результат, и идет вывод на дисплей, после этого запускается новое преобразование.

Всего существует 8 регистров связанных с работой модуля 10-битного АЦП. Четыре из них, нужны для настройки работы. Один, регистр данных, служит для сохранения результата преобразования. И три, для контроля за пересылкой результата преобразования из регистра данных (об этом позже, для нашего простого примера достаточно 5 регистров).

Пока, это выглядит, так, как-будто необходимо сделать много сложных настроек для работы АЦП. К счастью два из регистров используются только для конфигурирования входов. Регистр ADC10AE0 разрешает АЦП использовать выводы порта как входы. (Это необходимо, т.к. биты регистра выбора P1SEL, не настраивают использование выводов порта для конкретных функций. Т.к. это двоичное значение, каждый бит P1SEL, может настроить только два варианта использования вывода порта: либо для ввода/вывода, либо для любого внутреннего периферийного модуля, не только АЦП).

Хорошо, посмотрим на два других регистра конфигурации. Управляющий регистр ADC10CTL0 управляет базовыми настройками АЦП, такими как: выбор источника опорного напряжения; время и частота выборки; прерывания АЦП. Управляющий регистр ADC10CTL1, контролирует входы, тактовые сигналы, режимы работы и формат результата преобразования. Вот основные биты для каждого из управляющих регистров (мы не будем изучать их детально в этом уроке):

ADC10CTL0
  • SREFx (биты 15-13): Выбор одной из 8 различных конфигураций верхнего и нижнего ИОН (источника опорного напряжения).
  • SHTx (биты 12-11): Продолжительность выборки. Напряжение входящего сигнала, поддерживается на одном уровне, за счёт зарядки конденсатора. Данный регистр контролирует длину времени зарядки. Понятно, что чем больше времени идет измерение, тем оно точнее, но частота выборки микроконтроллера ограничена, и есть опасность, что уровень входящего сигнала может успеть измениться до конца измерения. Можно установить время выборки в течение 4, 8, 16 или 64 тактов ADC10CLK.
  • REF2_5V, REFON (биты 6,5): Выбор между встроенным ИОН на 1.5 В и 2.5 В. Отключение/включение встроенного ИОН.
  • ADC10ON, ENC, ADC10SC (биты 4,1,0): Включение АЦП, разрешение преобразования и запуск преобразования, соответственно.
  • ADC10IE, ADC10IFG (биты 3,2): Разрешение прерывания и флаг прерывания.

ADC10CTL0
  • INCHx (биты 15-12): В одноканальном режиме, выбирает канал, с которого ведется преобразование. В режиме последовательных преобразований (многоканальном), выбирает старший канал (с максимальным номером).
  • ADC10DF (бит 9): Выбор формата результата: обычный двоичный код или дополнение.
  • SSELx, DIVx (биты 4-3,7-5): Выбор источника тактового сигнала и делитель частоты тактового сигнала на 1-8.
  • CONSEQx (биты 2-1): Выбор режима преобразования.
  • BUSY (бит 0): Флаг, только для чтения, сообщает о занятости АЦП преобразованием, в данный момент.

Это очень краткий обзор, мы не можем детально раскрыть все возможности АЦП, т.к. это выходит за рамки вводного урока. Постепенно, в следующих уроках, мы изучим более продвинутые возможности АЦП. Так же, вы в любое время можете прочитать соответствующие разделы руководства по семейству микроконтроллеров x2xx, для детального ознакомления.

Так же, необходимо выделить регистр ADC10MEM. Когда преобразование заканчивается, в нём сохраняется результат, который мы можем прочесть оттуда. Если бит формата результата ADC10DF в регистре ADC10CTL0, сброшен (= 0), мы можем считать результат, как есть, и 0x00 будет эквивалентно значению нижнего ИОН, а 0xFF будет эквивалентно значению верхнего ИОН. Все средние значения, распределены в промежутке между этими двумя точками. Если бит формата ADC10DF установлен (= 1), результат сохраняется как дополнение. Это может использоваться, в некоторых конфигурациях, для передачи данных, но в этом уроке, нам это не понадобится.

Итак, простейший вольтметр. Код проекта приведен в конце урока (или оригинал VMeterG2231.c). Для него требуется наша библиотека для ЖК-панели simple_LCM из предыдущего урока. В этом примере, мало нововведений, он должен быть легко понятен сам по себе. В нём использован вход A1 на P1.1. Вы можете проверить работу программы, установив переменный резистор, соединенный крайними выводами к земле и питанию, а средним к P1.1. Когда вы будете крутить резистор, вы должны увидеть изменение соответствующего значения, на экране ЖК-панели.

В следующий раз разберем, как сохранять данные для последующего анализа.

Упражнение: Как использовать тот же код, для измерения напряжения в более широком диапазоне? Подсказка: можно добавить пару пассивных компонентов. Более хитрая задача, это измерение положительного и отрицательного напряжения. Можете придумать, как это делать, учитывая, что MSP430 не способен использовать отрицательное опорное напряжение? Подсказка: операционный усилитель может помочь.

/* VMeterG2231.c: Использует модуль АЦП ADC10 для измерения напряжения
 * и вывода результата на ЖК-экран через библиотеку simple_LCM.
 *
 *  ::  Copyright 2011, MSPSCI
 *  ::  http://mspsci.blogspot.com
 *
 */

#include <msp430g2231.h>
#include <simple_LCM.h>

#define A1  BIT1
#define dv  0.0032258

/*  Глобальные переменные  */
float volts=0.0;

/*  Обьявление функций  */
void ADC_init(void);
void update_display(void);

void main(void) {
    
    WDTCTL = WDTPW + WDTHOLD;
    
    LCM_init();
    ADC_init();

    for (;;) {
        ADC10CTL0 |= ADC10SC;   // начинаем новое преобразование
        while ((ADC10CTL1 & ADC10BUSY) == 0x01); // ждем, когда преобразование закончится
        volts=ADC10MEM*dv;  // конвертируем результат в напряжение и сохраняем
        update_display();   // выводим на ЖК-экран
    }
        
} // main

void ADC_init(void) {
            // Используем Vcc/Vss(аналоговая земля) для верхнего/нижнего ИОН,
            // 16 x ADC10CLKs (выборка за 16 тактов), включаем АЦП.
    ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON;
            // Вход A1, делитель ADC10CLK на 1, одноканальный режим.  
    ADC10CTL1 =  INCH_1 + SHS_0 + ADC10SSEL_0 + ADC10DIV_0 + CONSEQ_0;
    ADC10AE0 = A1;      // Разрешаем вход АЦП на порту P1.1
    
    ADC10CTL0 |= ENC;     // Разрешаем преобразования.
} // ADC_init

void update_display(void) {
    unsigned int ipart,fpart;
    
    ipart=(int)volts;   // целая часть
    fpart=(int)((volts-ipart)*1000);   // дробная часть, 3 цифры
    
    MoveCursor(0,0);
    __delay_cycles(10000);
    SendByte(0x06, FALSE);  // Сдвигаем курсор вперед.
    PrintStr("Voltmeter:");
        
    MoveCursor(1,15);
    __delay_cycles(10000);
    SendByte(0x04, FALSE);  // Сдвигаем курсор назад.
    SendByte(0x56, TRUE);   // печатаем 'V'
    SendByte(0x20, TRUE);   // печатаем ' '
            
    while (fpart > 0) {
        SendByte(0x30 + (fpart%10), TRUE);
        fpart /= 10;
    }
    SendByte(0x2E, TRUE);   // печатаем '.'
    SendByte(0x30 + ipart, TRUE);
    PrintStr("            ");

} // обновление экрана

Архив с программой и библиотекой

Оригинальные статьи на английском: Tutorial 15a: Analog Signal Conversion и Tutorial 15b: Using ADC10

Предыдущий урок этого цикла: Урок 14: Текстовый дисплей
  • +6
  • 23 ноября 2012, 07:40
  • Tabke
  • 1
Файлы в топике: lesson15.zip

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

RSS свернуть / развернуть
Большое спасибо. Очень полезные статьи.
0
Огромное спасибо, очень познавательно.
Одна замечание: в 14 уроке вы приложили файлы из урока в архив. Это гораздо удобнее чем сохранять файлы по отдельности.
Было-бы неплохо, если в остальных уроках вы делали-бы так-же.
0
А в остальных, и нету файлов. Я обычно даю ссылки на оригинал, из английских уроков, а потом привожу, тоже самое что и там, но преведенное в виде листинга прямо в тексте статьи. Вы считаете, что нужно эти листинги приложить ещё в виде файлов, или добавить оригинальные файлы в архиве в конце? Или всё сразу?
0
Ну вобще, было-бы удобно иметь ваши поправленые листинги.
0
Добавил.
0
Не раскрыта тема msp-шных фич:
1. Одноканальный, повторный одноканальный, последовательный и повторно-последовательный режимы преобразования
Рассмотрен только однократный одноканальный с ручным запуском.
2. Главная фича — оцепирование вообще без участия процессора. То есть запуск от таймера, автоматическое преобразование нужных каналов (одного или нескольких, однократное или повторное в разные регистры) и выставление флага прерывания.
0
А можно содержание сделать? Как у Lifelover в его сетевом курсе
0
Не понял там ничего. Там просто форум по майнкрафту.
Вы имели ввиду сделать внутри уроков ссылки на предыдущие?
0
да
0
и на следующие тоже.
где-нибудь в конце статьи это разместить
0
Сделал.
0
а сколько вообще этих уроков?:)
0
Двадцать, но, например, у шестнадцатого шесть частей.
Остались уроки по протоколам связи, USART, SPI, IIC — не законченный у него.
0
Подскажите, планируете-ли продолжать публикации переводов?
Очень информативный и познавательный материал.
0
Очень хотелось бы увидеть продолжение этого цикла статей.
0
Огромное за статьи.
Только начинаю разбираться с микроконтроллерами и с СИ, приделал к коду вывод на экран уровня напряжения:
Функция
void LCM_cgramlevelr(void) {
    // Функция записи в CGRAM 8-ми символов уровня от _ до полностью закрашенного символа
    SendByte(0x40, FALSE);  // Выбираем в CGRAM адрес 0х00 начало первого символа
    int iii = 8, aaa = 1, bbb; // Начальные условия iii байт закрашенной нижней линии первого байта
      while (aaa < 58) {  // На самом деле можно написать от 58 до 65
        for (bbb = aaa; bbb <= ( aaa + 7 ); bbb++) {
          if ( bbb < iii )
            SendByte(0x00, TRUE); // Пишем в CGRAM незакрашенную линию
          else SendByte(0x1F, TRUE); // Пишем в CGRAM закрашенную линию
        }
        iii = iii + 7;
        aaa = aaa + 8;
      }
    SendByte(0x80, FALSE); // Переключение адреса в DDRAM + указатель на первый символ первой строки
}

Уровень напряжения от 0 до 8 прописан там где вычисляется дробная и целая часть напряжения
level=(int)(volts*2.45); // целая часть значения от 0 до 8, пропорциональная напряжению

И вывод символа на экран перед значением напряжения, код прописан сразу после отправки на экран целой части напряжение
if (level == 0)
          SendByte(0x20, TRUE); // если уровень равен нулю выводим пробел
        else SendByte(0x00 + level - 1, TRUE); // иначе выводим символ из CGRAM 

Подскажите по функции записи в CGRAM последовательности символов, что там переписать чтобы не убого было, кое как вымучил и думаю можно как то попроще написать.
0
Подскажите пожалуйста гуру мсп :)

В общем нужно батарейное питание и простые функции обработки и генерации… на меге8 получил потребление 1 миллиампер на полном функционале… теперь хочу msp430g2553 попробывать применить…

для начала запустил АЦП с опорой полтора польта и шим генератор на первом таймере, проц клокает на 8 мегагерцах, кторой таймер клокает от 14 килогерцового тормоза и опрашивает АЦП, и кидает результат из АЦП на выход ШИМа(а там светик моргает когда ногу трогаеш)

так вот проблемы:

1) не срабатывает прерывание АЦП

инициирую АЦП так:
Код:
ADC10CTL0 &= ~ENC;
ADC10CTL0 = ADC10IE | ADC10ON | REFON | ADC10SHT_2 | SREF_1;
ADC10CTL1 = CONSEQ_0 | ADC10SSEL_3 | ADC10DIV_0 | SHS_0 | INCH_1;
ADC10AE0 = 0x6;
ADC10CTL0 |= ENC;

дальше в основном цикле хочу стартануть его и уйти в спячку а там по прерывании отработать результат, переключить вход и снова уйти на спячку до следующего результата преобразования

текст main()
Код:
ADC10CTL0 |= ADC10SC;
_BIS_SR(LPM0_bits + GIE);

ну и в обработчике
Код:
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR_HOOK(void)
{
/* USER CODE START (section: ADC10_ISR_HOOK) */

static int a=0;

a=ADC10MEM;
a=a/4;

if((a>=0)&&(a<255))
TA0CCR1 = a;

ADC10CTL1 |= INCH_1;
ADC10CTL0 |= ADC10SC;

/* USER CODE END (section: ADC10_ISR_HOOK) */
}

так вот в этот обработчик оно не попадает никогда!

если же этот код перенести в таймерное прерывание
Код:
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR_HOOK(void)
{
/* USER CODE START (section: TIMER1_A0_ISR_HOOK) */
static int a=0;

a=ADC10MEM;
a=a/4;

if((a>=0)&&(a<255))
TA0CCR1 = a;

ADC10CTL1 |= INCH_1;
ADC10CTL0 |= ADC10SC;
/* USER CODE END (section: TIMER1_A0_ISR_HOOK) */
}

то вродебы всё работает так как надо НО… потребление 3 миллиампера!!! как роде не уходит в сон…

мне нужно чтоб во время сна АЦП преобразовывал(согласен и на 14 килогерц такта АЦП
а вот таймер 1 должен гудеть на все 8 мегагерц… так надо… его результатом АЦП буду корректировать… или выключать…

ЧЯДН?
почему нет низкого потребления и нет прерывания АЦП?
0
Уважаемый автор, планируется-ли развитие данной темы?
Можно-ли ожидать дальнейших работа по данной теме?
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.