Встроенная функция disable_interrupts (GLOBAL) сбрасывает оба бита — GIE и PEIE. Обратная по смыслу функция enable_interrupts (GLOBAL) устанавливает оба бита, однако нам необходимо установить только PEIE, a GIE оставить сброшенным. Поэтому мы «напрямую» устанавливаем бит PEIE = 1. Аналогично, для сброса флага ADIF используется выражение ADIF = 0. Перед вызовом функции sleep () мы запускаем преобразование, вручную устанавливая бит
14.1. В Примере 14.2 пороговое значение уменьшалось по линейному закону. Несмотря на то что такой подход достаточно эффективен при априори известном периоде сигнала, который к тому же изменяется в незначительных пределах, в остальных случаях лучшие результаты можно получить, используя экспоненциальное изменение порога. Для получения такой характеристики из результата выборки необходимо вычитать не константу, а некоторую фиксированную долю полученного значения. Покажите, как можно модифицировать Программы 14.4 и 14.5, чтобы при каждой выборке пороговое значение уменьшалось примерно на 0.025 % (-1/4096), и определите постоянную времени в пересчете на количество отсчетов.
14.2. В реальных аналоговых сигналах обязательно присутствуют шумы. На практике это часто приводит к необходимости фильтрации или сглаживания. В любом случае шумы, наводимые извне, не должны иметь составляющих значительной амплитуды, с частотой, которая больше половины частоты дискретизации, поскольку при восстановлении эти составляющие окажутся сдвинутыми в полосу пропускания, как показано на Рис. 14.4. Сигнал необходимо пропускать через фильтр нижних частот перед аналого-цифровым преобразованием, как показано на Рис. 14.20.
Хотя такой внешний фильтр, устраняющий эффект наложения спектров, должен быть, по определению, реализован аппаратно (например, на
Другим методом, хорошо известным тем, кто занимается статистикой, является метод скользящего среднего, который часто используется, например, для вычисления среднего курса акций в течение месяца. Достаточно эффективный алгоритм такого рода получается при усреднении
где
Покажите, как можно модифицировать подпрограмму GET_ANALOG, чтобы она запоминала значение двух последних отсчетов и возвращала усредненное значение.
14.3. Предположим, что ЦАП МАХ506 используется для реализации автоматической регулировки усиления (АРУ) сигнала, подаваемого на аналоговый вход микроконтроллера в ЭКГ-мониторе из Примера 14.2. Задача АРУ заключается в том, чтобы максимальное значение сигнала на аналоговом входе лежало в диапазоне 3/4…7/8 полной шкалы. Как бы вы реализовали такую подсистему? Подсказка: вспомните, что выходной сигнал каждого канала ЦАП МАХ506 определяется собственным аналоговым входом и общим опорным напряжением
14.4. Входной синусоидальный сигнал необходимо подвергнуть двухполупериодному выпрямлению, т. е. отрицательные полуволны должны поменять свой знак. Напишите подпрограмму, выполняющую данное действие, полагая, что 8-битное оцифрованное значение находится в регистре ADRESH, а выходное значение должно быть передано через порт В на внешний ЦАП.
14.5. В основе схемы, изображенной на Рис. 14.21, лежит Fig. 10 из документа AN546 «
Рис. 14.21.
Глава 15
Хранить вечно!