#byte PORT_B =6 /* Вывод RA5 — 5-й бит порта А
#bit RA5 =5.5 /* Порт В — регистр 06
#int_rtcc
void ecg_isr(void)
{
unsigned int analog;
static unsigned long int threshold = 0;
static unsigned int maximum;
analog = read_adc();
if (analog > threshold»8)
{
maximum = analog; /* Новое максимальное значение */
PORT_B = analog; /* Выдаем наружу */
threshold = maximum << 8; /* Новый 2-байтный порог */
RA5 =1; /* Сообщаем об этом */
}
else
if(threshold >= 0x0004) /* ЕСЛИ порог не менее h’0004’, */
{
threshold = threshold — 0x0004; /* ТО уменьшаем на 1/64 */
RA5 =0; /* Сообщаем об отсутствии обновления */
}
}
Переменная threshold имеет тип long int, поэтому компилятор CCS будет интерпретировать ее как 16-битное число. Обнуление переменной threshold выполняется единожды при запуске программы, поскольку переменная объявлена как static. И опять же, такое поведение отличается от поведения
При занесении в переменную threshold нового максимального значения последнее умножается на 256 путем сдвига на восемь разрядов влево. Хороший компилятор автоматически преобразует выражение N*256 к виду N << 8 или же, что еще лучше, просто возьмет в качестве результата операции старший байт пары.
Микроконтроллер используется для вычисления энергии разряда двухфазного дефибриллятора, приведенного на Рис. 14.5. Когда микроконтроллер обнаруживает начало разряда, он должен сделать 256 выборок с частотой 20 000 выборок в секунду. При этом энергия определяется как сумма квадратов отклонений сигнала от базового уровня — предполагается, что сопротивление цепи «грудная клетка пациента — электроды» остается постоянным на протяжении всего разряда.
Для получения опорного напряжения используется внешний ИОН с выходным напряжением 4.096 В, что при 8-битном преобразовании даст нам разрешение, равное 16 мВ. После начала разряда на выводе RA4 необходимо сформировать импульс для запуска развертки запоминающего осциллографа, позволяющего сохранить осциллограмму сигнала для архивных целей. А после окончания разряда старший байт значения энергии должен быть выведен в порт В для отображения на дисплее.
Покажите, как можно с помощью микроконтроллера PIC16F87XA с 20-МГц резонатором реализовать указанную измерительную систему. Можете считать, что на ИОН можно подавать смещение наподобие стабилитрона. На практике для достижения более точных результатов может использоваться дополнительный переменный резистор, с помощью которого осуществляется подстройка выходного напряжения ИОН в небольших пределах.
Решение
Подходящая схема показана на Рис. 14.20. Собственно сигнал, изменяющийся в диапазоне +1.8…+3.6 В (см. Рис. 14.5), подается на вход 0-го аналогового канала RA0/AIN0. Резистор сопротивлением 10 кОм защищает аналоговый вход от перегрузки, одновременно выполняя, совместно с конденсатором 3300 пФ, роль фильтра, устраняющего эффект наложения спектров, с частотой среза около 450 кГц. Поскольку реальные дефибрилляторы работают с очень большими напряжениями (порядка 25 кВ), для защиты микроконтроллера от высоковольтных выбросов используется два диода 1N4004, дополняющие внутренние защитные диоды (см. Рис. 14.12).
Рис. 14.20.
Внешний ИОН напряжением 4.096 В подключен непосредственно к выводу RA3, который является входом внешнего опорного напряжения (конфигурация АЦП — Ь’0101’). Чтобы снизить уровень помех на линиях
Для определения начального момента разряда используется внутренний аналоговый компаратор, как было показано на Рис. 14.5. При работе компаратора в режиме Ь’1110’ для формирования внутреннего опорного напряжения может использоваться модуль CVREF, как было описано на стр. 501. При сброшенном бите CIS (см. Рис. 14.6) компаратор 1 может использовать 0-й аналоговый канал совместно с модулем АЦП.
И, наконец, вывод RA4 и все выводы порта В должны быть сконфигурированы как выходы. Первый из указанных выводов используется для формирования синхроимпульса, а порт В — для вывода полученного результата.