Вы находитесь на странице: 1из 10

7/6. Использование модуля 10-разрядного АЦП при измерении сопротивления.

Измеритель сопротивления (от 0 до 999 ом, разрешающая способность 1 ом, с


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

Напряжение замерили без всяких "выкрутасов" (напрямую), ток замерили, "превратив"


его в напряжение.
Не нужно быть "гигантом мысли" чтобы понять, что и сопротивление тоже можно
"превратить" в напряжение, а затем его (напряжение) замерить.
Во всех этих случаях, речь идет об уровнях напряжения, но только сформированных
"на разные лады".
Короче, да здравствует великий закон Ома!
Итак, применяю все тот же банальный делитель напряжения, только один из его
резисторов есть то, сопротивление чего нужно замерить.
Назову его Rx.
Какой именно резистор?
Если "зафиксировать" резистор нижнего плеча делителя, а Rх включить в верхнее
плечо, то нулевому сопротивлению Rx будет соответствовать не нулевое, а
максимальное показание.
И вообще "все пойдет шиворот на выворот", так как увеличение номинала Rx
приведет к уменьшению величины измеряемого напряжения, а должно быть наоборот.
Если бы у этого технического решения не было альтернативы, то можно было бы
поработать и в этом "геморройном" направлении (программный выход из этой ситуации
есть), но альтернатива есть, и очень даже "симпатичная": Rx нужно включить не в
верхнее, а в нижнее плечо делителя.
В этом случае, ничего "инвертировать" не нужно, так как будет иметь место быть
прямо пропорциональная зависимость уровня напряжения, "падающего" на Rx, от его
номинала.
И при "коротыше" показание будет нулевым.
Но и в этом случае, одна "бяка" все-таки имеется: когда Rx отключен, то на
аналоговый вход, через резистор верхнего плеча делителя напряжения, будет
подаваться уровень напряжения источника питания делителя.
Это, в любом, разумном случае (и при использовании, в качестве источника Uоп.,
Uпит. ПИКа, и при использовании, в качестве источника Uоп., внешнего источника),
приведет к замеру числового значения верхнего уровня квантования (1023).
Если разрядов индикации три (единица игнорируется), и в программе имеется
процедура гашения незначащих нулей, то на индикацию выведется число 23.
Это я говорю "не с бухты – барахты". Лично наблюдал.
"Убивается" эта "бяка" достаточно просто: сразу же после "загрузки" результата замера
уровня напряжения в регистр Temp_H/Temp_L, программными средствами, производится
анализ числового значения его двухбайтного слова.
Если оно больше .999 (от .1000 и более), то содержимое Temp_H/Temp_L
сбрасывается в ноль.
Далее, нули в старшем и среднем десятичных разрядах погасятся в процедуре
гашения незначащих нулей, а на индикацию выведется ноль младшего разряда (в
данном случае, он не гасится), что и требуется.
Теперь нужно произвести предварительный расчет.
Его результаты будут зависеть от разрешающей способности.
Выбираю разрешающую способность 1 ом.
В этом случае, десятичная запятая не нужна.
Значит речь идет о диапазоне замера сопротивлений от 0 до 999 ом, с разрешающей
способностью 1 ом.
Если диапазон квантования по уровню ограничить 0 в и 1,024 в., то будет обеспечено
"золотое" соответствие: 1 ом – 1 ма – 1 мв.
1 мв есть "шаг" квантования по уровню.
Одному ому будет соответствовать один "шаг" квантования по уровню.
Вывод: источник опорного напряжения должен выдавать напряжение = 1,024 в.

1
Именно такое "дельце" было "провернуто" в предыдущем подразделе.
Так что, мудрить нечего: используется "слегка доработанное" устройство измерения
тока (и программа –"мать" Analog_4.asm).
Применяется все тот-же "непотопляемый" делитель напряжения.
Резистор его нижнего плеча (Rx) будет внешним (по отношению к устройству).
Получилось вот что:

Так как, в данном случае, имеются "длинные проволочины", в которых могут быть
наводки, то, для улучшения помехоустойчивости, аналоговый вход заблокирован
конденсатором С3.
Я поставил конденсатор с номиналом 47н, но можно и меньше.
Естественно, что его наличие приведет к тому, что, после подключения Rx, истинный
результат замера сформируется не сразу же после окончания 1-го цикла АЦП, а после
окончания N-цикла, но интервал времени наличия этого "безобразия" настолько мал,
что визуально не ощущается.
При замере постоянного (или медленно изменяющегося) параметра, такая "затяжка"
вполне приемлема.
А вот если речь идет о быстрых изменениях, то "упаси Бог от этого конденсатора".
Теперь нужно вычислить ("грубо") номинал резистора верхнего плеча делителя
напряжения (R1).
Максимальное значение Rx известно.
Оно равно 999 ом, что, после "превращения" в напряжение, соответствует 0,999 в.
Напоминаю, что внешний источник опорного напряжения формирует опорное
напряжение величиной 1,024 в, и диапазон Uоп. от 1 в до 1,023 в игнорируется.
Предположим, что Uпит. ПИКа = 5 в.
Тогда Кдел. делителя напряжения должен быть = 5 в / 0,999 в = 5,005
Rв (резистор верхнего плеча) = Rх(Кдел. – 1) = 999 ом х 4,005 = 4000,995 ом или
примерно 4 Ком.
Плюс, "ефрейторский зазор" (для для любознательных и ищущих истину).
Получился переменный (подстроечный) резистор номиналом 5,1 или 5,6 Ком (R1).
Его движок и крутится при калибровке.
Программа под это устройство называется Analog_5.asm (прилагается).

2
Она в точности такая же, как и программа Analog_4.asm, но в нее (в Analog_5.asm)
добавлена процедура "убийства квантовок" с числовыми значениями от 1000 до 1023,
о необходимости которой говорилось выше.
Ниже Вы видите "вырезку" из программы Analog_5.asm в части касающейся этого.
………………………….
;-------------------------------------------
; Теперь модуль АЦП можно выключить.
;-------------------------------------------
clrf Adcon0 ; Для снижения потребляемого устройством тока,
; модуль АЦП выключается до конца отработки
; текущего полного цикла программы.
;--------------------------------------------------------------------------------
; Блокировка нулями результата измерения с числовым значением от .1000 и более.
; Примечание: разложение числа 1000 = 256 х 3 + 232
;--------------------------------------------------------------------------------
movlw 3 ; Проверка байта Temp_H на "залегание в нем"
subwf Temp_H,W ; числа 3 (0000 0011).
btfss Status,Z ; Если это число 3, то переход на проверку
goto Bin2_10 ; байта Temp_L, а если нет, то переход
; в ПП Bin2_10.
movlw .232 ; Проверка байта Temp_L на "залегание в нем"
subwf Temp_L,W ; числа 232 (1110 1000).
btfss Status,C ; Если это число меньше или равно 232 (С=1),
goto Bin2_10 ; то переход в ПП Bin2_10.
clrf Temp_H ; Если это число больше 232 (С=0), то
clrf Temp_L ; результат замера сбрасывается в 0.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ГРУППА ПОДПРОГРАММ ПРЕОБРАЗОВАНИЯ 2-БАЙТНЫХ ДВОИЧНЫХ ЧИСЕЛ В 3-РАЗРЯДНЫЕ
; ДЕСЯТИЧНЫЕ ЧИСЛА (разрядность двоичного числа - 10).
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Подготовка к преобразованию.
;================================================================================
Bin2_10 bcf Status,C ; Сброс флага переноса-заема.
………………………….
Так как регистр TempH/TempL двухбайтный, то содержимое его байтов анализируется
последовательно.
С целью максимально быстрого "расставания" с этой процедурой в случаях, когда
числовое значение TempH/TempL находится в диапазоне от .0 до .999, содержимое
регистра Temp_H анализируется первым.
"Пороговые" константы (.3 и .232) берутся из разложения числа .1000.
Содержимое регистра Temp_H анализируется по критерию наличия или отсутствия
нулевого результата (выше .3, по определению, "мертвая зона").
А вот содержимое регистра Temp_L анализируется по критерию наличия или
отсутствия заема.
Последнее позволяет сформировать "запретную зону" ("сектор") чисел, "залет" в
которую заканчивается "безжалостным убийством" результата измерения.
Это "убийство" заключается в сбросе содержимого TempH/TempL в ноль.
Ну и поделом.
"Бяки" нравятся только садомазохистам, а остальных они сильно расстраивают.
Чтобы откалибровать этот измеритель, сначала, при помощи резистора R3, нужно
"выставить", на выводе RA3, уровень опорного напряжения равный 1,023 … 1,024
вольта.
Затем нужно либо подключить Rx точно известного номинала и ориентироваться на
этот номинал, либо, с помощью "достойного" (по точности замера) измерителя
сопротивления, точно замерить номинал "ширпотребовского" резистора, подключить его
в выводам Rx, и ориентироваться на результат этого замера.
Далее, изменяя сопротивление резистора R1, нужно добиться точного соответствия
результата замера, индицируемого в линейке 7-сегментных индикаторов, номиналу Rx
(в омах).

3
После этого, сопротивление переменного резистора R1 замеряется, и вместо него
устанавливается постоянный резистор.
После того, как измеритель сопротивления будет откалиброван, при замере Rx
номиналом более 999 ом, на индикацию, в младшем, десятичном разряде, будет
выводиться ноль, а остальные два нуля будут погашены, (они незначащие).
Наличие такого результата замера свидетельствует о том, что номинал Rx - более
999 ом.
Теперь "закоротите" Rx.
Результат - ноль в показаниях.
Теперь отключите Rx.
Результат - ноль в показаниях.
Теперь подключите, в качестве Rx, переменный резистор килоом эдак на 1,5.
При изменении его сопротивления от нуля, числовое значение результата измерения
будет увеличиваться от нуля и до 999.
При дальнейшем увеличении числового значения результата измерения, произойдет
сброс показаний в ноль, причем, этот сброс будет произведен не только в диапазоне
Rx от 1000 ом до 1023 ом, а в диапазоне Rx от 1000 ом до бесконечности.
Проще говоря, данный измеритель сопротивления не "воспринимает" все резисторы
номиналом от 1 Ком и более, что, в принципе, и нужно.
Немного не удобно то, что отсутствует признак, по которому можно было бы
определить, происходит ли замер Rx = 0 или замер Rx с номиналом превышающим
999 ом.
Это дело программно поправимое, и оно делается за считанные минуты.
Такой признак имеет место быть программе Analog_6.asm (прилагается),
Символ нуля, выводимый в знакоместо младшего, десятичного разряда, при отсутствии
замера (Rx не подключен), и при замере Rx номиналом более 999 ом, "мерцает"
("мигает").
При измерении Rx в диапазоне от 0 до 999 ом, этого "мерцания" нет.
Такой эффект получается при искусственном затягивании интервала времени
нахождения рабочей точки программы вне ПП динамической индикации ("дурное дело
не хитрое". Обратное сложнее).
В данном случае, применена задержка на 0,2 сек., но ее длительность можно изменить
на свой вкус.
Чтобы "не размножать" количество задействованных в программе регистров общего
назначения, в этой задержке используется то, что есть (LED0, LED1 и Count).
Уменьшив или увеличив номинал R1 (нужен соответствующий расчет), можно
организовать измерение сопротивлений меньшего или большего номинала.
Так как при этом изменяется и разрешающая способность, то нужно "озаботиться"
выставлением запятой.

Об уменьшении времени выборки.


В тех случаях, когда необходима высокая частота дискретизации, задача уменьшения
интервала времени цикла АЦП становится очень актуальной.
По большому же счету, как можно меньший (в пределах допустимого) интервал
времени цикла АЦП, во всех случаях использования модуля АЦП, как говорится,
"совсем не помешает" ("кашу маслом не испортишь").
Существуют вполне определенные "границы" диапазона возможных длительностей
времени преобразования, за которую заходить нельзя (вспомните про Tad = 1,6 и 8
мкс.).
Соответственно, "площадь территории этого маневра" не велика.
Конечно же, можно (и нужно) "поманеврировать" и на ней, но, на мой взгляд,
разумнее всего, в первую очередь, обратить внимание на интервал времени выборки и
проанализировать возможности его разумного уменьшения.
Ранее, с целью элементарного упорядочения массива информации, рассуждения,
относящиеся к интервалу времени выборки, были "привязаны" к "даташитному
официозу".
В даташитах четко обозначен максимальный номинал выходного сопротивления
источника аналогового сигнала равный 10 Ком., и поэтому, не мудрствуя лукаво, был
"сделан упор" на усреднение (5 Ком).
4
Усреднение это "штуковина" хорошая, и особенно при "первичном въезде", но не более
того.
Теперь нужно "включить здравый, практический смысл" и "привязаться" не к
усреднению, а к этому смыслу.
Если не применять делитель напряжения, а подать, на активный, аналоговый вход,
напряжение непосредственно с выхода источника аналогового сигнала (или через
резистор), то путь прохождения тока, при заряде конденсатора Hold, будет таким же,
как и путь прохождения тока при его разряде, только с противоположным
направлением.
Это обеспечивает примерное равенство скоростей заряда и разряда, что и удобно, и
вообще распрекрасно.
Но при "врезке", между выходом источника аналогового сигнала и аналоговым входом
ПИКа, делителя напряжения, это примерное равенство нарушается.
Для того чтобы не быть голословным, я нарисовал
ту картинку, которую Вы видите слева ("привязка" к
измерителю уровня напряжения подраздела 7/3).
Что такое Rвнутр.?
Это суммарное (последовательное соединение)
сопротивление резисторов Ric и Rss.
Ric разработчики назвали "сопротивлением
соединения".
Проще всего счтать его обычным, постоянным
резистором c сопротивлением 1 Ком.
Rss это сопротивление канала внутреннего,
электронного коммутатора, обеспечивающего
подключение конденсатора Hold к аналоговому
входу, который назначен активным. Его номинал равен 7 Ком. (при Uпит. = 5 в.)
Значит, Rвнутр. = 1 Ком + 7 Ком = 8 Ком.
Проще всего считать Rвнутр. обычным, постоянным резистором с сопротивлением
8 Ком.
Именно из-за наличия Rвнутр., постоянная времени заряда/разряда конденсатора Hold
не может оказаться меньше постоянной времени заряда/разряда RC цепочки, в состав
которой входит R = 8 Ком и С = 120 пф.
Через Rвнутр. проходит как ток заряда, так и ток разряда.
Rвых. это выходное сопротивление источника аналогового сигнала.
Кружочек с буквами VA условно считается источником аналогового сигнала с нулевым
сопротивлением.
В комплексе с Rвых., получается достаточно "перпендикулярная" картинка, в которой
"полномочия удобно, условно разделены".
Путь прохождения разрядного тока конденсатора Hold обозначен синей линией со
стрелками.
Основная часть тока разряда проходит через резистор R2 (по пути наименьшего
сопротивления).
Остальная, незначительная часть тока разряда проходит через R1 и Rвых (об этом
говорилось в конце подраздела 7/2).
Чтобы не "загромождать" рисунок, я не стал "разрисовывать" это "ответвление", но о
нем всегда нужно помнить (учитывать этот "шунтирующий эффект").
Путь прохождения зарядного тока конденсатора Hold обозначен красной линией со
стрелками.
В этом случае, ток заряда конденсатора Hold проходит через R1 и Rвых.
Предположим, что, при зафиксированном номинале резистора R2, Кдел. делителя
напряжения увеличивается.
Это соответствует увеличению номинала резистора R1.
Что получится?
Получится достаточно существенное увеличение расхождения между скоростями
разряда и заряда конденсатора Hold (скорость разряда будет меняться меньше, чем
скорость заряда).
Чем больше будет Кдел. делителя напряжения, тем медленнее будет происходить
заряд и тем большей будет разница между скоростью заряда и скоростью разряда.
5
Это может привести к тому, что в случае, если уровень аналогового напряжения
быстро нарастает, конденсатор Hold, за интервал времени фиксированной задержки, не
успеет зарядиться до уровня текущей выборки, что соответствует "вранью" аналого –
цифрового преобразования.
Почему эта "бяка" не обозначила себя в предоставленных Вашему вниманию
устройствах?
Потому, что, в данном случае, уровень напряжения аналогового сигнала не меняется
или меняется медленно.
Именно по этой причине, можно применить делитель напряжения с большими Кдел.
При этом, номинал резистора верхнего плеча делителя напряжения может достигать
одного мегоома, и даже более.
В худшем случае, первые несколько замеров могут оказаться "бракованными" (они
"проскакивают" быстро. Визуально отследить эту "бяку", даже при желании, весьма
затруднительно), но с остальными замерами будет все в порядке.
При наличии же быстро изменяющихся уровней напряжения аналогового сигнала
(например, "оцифровка" речевого сигнала), "картина" совсем другая.
В этом случае, без учета сказанного, существует большая вероятность "оцифровки"
аналогового сигнала с большими, "устойчивыми" (во времени) погрешностями, и
особенно в области высоких частот его спектра, где скорости наибольшие.
В части касающейся делителей напряжения, в этих случаях, нужно либо отказаться от
их применения, либо расчитать делитель напряжения таким образом, чтобы как можно
более минимизировать расхождение между скоростью заряда и скоростью разряда, при
условии обеспечения требуемого значения частоты дискретизации.
В идеале, нужно стремиться к тому, чтобы скорость заряда была равна скорости
разряда.
При подключении аналогового входа к выходу источника аналогового сигнала
(напрямую или через резистор), это условие (или что-то близкое к этому)
обеспечивается, как бы, "автоматически", так как "ветвиться" просто некуда.
В части касающейся детализации, "вышележащие", общие выводы, конечно же, не есть
"вершина совершенства", но знание "места установки капкана" это гораздо лучше, чем
незнание оного.
А с устройством этого "капкана", и с тонкостями всей этой "капканизации", можно
разобраться далее, и в рабочем режиме (по мере "подворачивания поводов").
На мой взгляд, это наиболее разумное решение.
Итак, в части касающейся соотношений скоростей заряда и разряда конденсатора Hold,
имеет место быть (я надеюсь на это) некое "просветление".
Теперь нужно разобраться с тем, как, без потери качества АЦП, минимизировать
интервалы времени заряда/разряда конденсатора Hold, ведь за счет этого можно
сократить интервал времени выборки, а значит и уменьшить суммарный интервал
времени "выборка + преобразование".
Даже поверхностное "ковыряние" в "вышележащей" картинке наталкивает на
"гениальную" цепочку рассуждений (типа "на голову яблоко упало").
Имеет место быть внутренний резистор Rвнутр.
В старой песне поется "… Эту песню не задушишь, не убъешь …"
Это про него.
Он "основательно окопался" внутри ПИКа, и его нужно воспринимать как данность.
А раз это так, то к выводу RA0 (в данном случае) можно подключить низкоомный
выход источника аналогового сигнала.
Для подавляющего большинства таких источников, нагрузка в виде последовательной
цепочки, состоящей из резистора номиналом аж 8 Ком и конденсатора малой емкости
(120 пф) это "как для слона дробинка".
"Они даже и не почувствуют" такой нагрузки, и по этой причине, она (нагрузка) сколь
либо существенно не повлияет на режим работы оконечного каскада источника
аналогового сигнала.
Предположим, что выход источника аналогового сигнала, с Rвых. = 10 ом, подключен к
выводу RA0 (см. рисунок, расположенный ниже).

6
В данном случае, скорость заряда конденсатора Hold можно принять равной скорости
его разряда, так как пути прохождения токов заряда
и разряда совпадают.
Тогда расчетное время, необходимое для заряда
конденсатора Hold (Tc) будет равно 7,36 мкс.
Для сравнения: то же самое, но при Rвых. =
10 Ком, равно 16,47 мкс.
По сравнению с последним, при прочих, равных
условиях, время выборки можно уменьшить на
16,47 – 7,36 = 9,11 мкс.
То есть, длительность фиксированной задержки
можно "безбоязненно" уменьшить на 9 или 10 мкс.
При этом, значение интервала времени
преобразования не изменится (так как "царства –
государства" разные), а суммарный интервал времени "выборка + преобразование"
уменьшится на те же 9 или 10 мкс.
При этом, качество АЦП не изменится.
Вывод из сказанного: чем меньше выходное сопротивление источника аналогового
сигнала, тем меньший, суммарный интервал времени "выборка + преобразование"
можно обеспечить (за счет уменьшения интервала времени выборки). Нагрузочная
способность источника аналогового сигнала должна позволять качественно
работать на нагрузку Rвнутр/Hold (обеспечивается легко).
В комплексе с выбором наименьшего (в пределах дозволенного) значения Tad, можно
добиться минимальной продолжительности исполнения процедуры типа
"выборка + преобразование".
Как быть, если нагрузочная способность источника аналогового сигнала мала и
нагрузка Rвнутр/Hold является для него "непосильной ношей"?
В этом случае, нужно подключить выход источника аналогового сигнала, к аналоговому
входу ПИКа, через резистор расчитанного номинала.
Он "превратит непосильную ношу в посильную", но за это нужно будет
"расплачиваться" увеличением времени выборки.
Плюс, нужно проследить за тем, чтобы суммарное сопротивление этого резистора и
Rвых. источника аналогового сигнала не превышало 10 Ком.
Этот случай маловероятен, так как такая низкая нагрузочная способность является
редкостью, но объективности ради, и про этот случай нужно упомянуть.
Вопрос: "Имеется ли ограничение по минимально допустимому Rвых. источника
аналогового сигнала"?
Ответ: такого ограничения нет.
Можно применять источники аналогового сигнала с каким угодно низким Rвых.
Вопрос: "А можно ли, на рис. 1 предыдущего подраздела, "убить" резистор R2
номиналом 5,1 Ком"?
Ответ: можно. Нужно поставить вместо него перемычку.
После этого, можно смело уменьшить время фиксированной задержки на 9 или 10 мкс.
Этот резистор я ввел в схему только потому, что ранее была осуществлена "привязка"
к значению Rвых. источника аналогового сигнала = 5 Ком.
Что касается рис.1 этого подраздела, то зачимое Rвых. источника аналогового сигнала
(то есть, Rx), в данном случае, "гуляет" в диапазоне от 0 до 999 ом.
Если ориентироваться на максимум ("грубо" - 1 Ком), то он совсем небольшой, и
поэтому интервал времени фиксированной задержки (он расчитан под Rвых. источника
аналогового сигнала = 5 Ком) можно смело уменьшить микросекунд эдак на 7 … 9.
Можете это сделать самостоятельно и убедиться, что в работе измерителя
сопротивления ничего не изменится (кроме "микроскопического" уменьшения времени
полного цикла программы), если Вы, вместо константы .6, поставите константу .4 или
даже .3 (минус 9 мкс.).
Общий вывод: для обеспечения наименее "кровопролитной" и наиболее
эффективной минимизации значения суммарного интервала времени "выборка +
преобразование", нужно:
- выбрать минимально приемлемое время Tad (в "районе" 2 мкс.),

7
- использовать источник аналогового сигнала с малым Rвых и приемлемой
нагрузочной способностью, подключив этот выход "напрямую" (без
использования делителя напряжения или "развязывающего" резистора) к
активному, аналоговому входу.
Что еще можно "обкарнать" для того, чтобы уменьшить интервал времени между
двумя соседними выборками?
"Устремляю орлиный взор" на интервал времени от момента окончания текущего
преобразования и до момента начала следующей выборки.
Его длительность должна быть не менее 2Tad (требования разработчиков).
Если "привязаться" к расчету Tad, произведенному ранее (Tad = 2 мкс.), то от момента
окончания текущего преобразования и до момента начала следующей выборки, должно
пройти не менее 4 мкс.
Выполнение этого условия обеспечивается, как бы, "автоматически", так как время
исполнения обязательной процедуры "перегрузки" результата АЦП в регистры общего
назначения, занимает 6 м.ц.
Плюс, этот результат нужно как-то обработать (а иначе, ради чего затеян весь этот
"сыр – бор" с АЦП?).
И на это нужно время, и время "вполне приличное".
Здравый смысл подсказывает, что только после окончания этой обработки, можно
начинать новый цикл АЦП.
Таким образом, по-любому, получается, что указанная выше задержка в 2Tad
"перекрывается" с большим избытком, и ей можно просто "не забивать голову".
Если требуется высокая частота дискретизации, то на только что сказанное нужно
обратить самое пристальное внимание, так как значение частоты дискретизации
зависит не только от величины суммарного интервала времени выборки и
преобразования, но и от величины интервала времени между моментом окончания
текущего преобразования и моментом начала следующей выборки.
Таким образом, приведенная ранее (в подразделе 7/1), упрощенная формула
вычисления частоты дискретизации, принимает вид:
Fд = 1 / Тв + Тацп + Тпрогр
Тв - интервал времени выборки.
Тацп - интервал времени преобразования.
Тпрогр - интервал времени между моментом окончания текущего преобразования и
моментом начала следующей выборки.
Примечание: сокращение "прогр" намекает на то, что, в контексте процедуры АЦП
(если "глядеть с ее колокольни"), имеет место быть "досадная и обидная",
программная задержка, возникающая при отработке той части программы, которая
исполняется с момента "опущения" флага статуса модуля АЦП и до момента начала
следующей выборки.
Ей (процедуре АЦП), "дурёхе", бесполезно объяснять то, что и вне ее "территории"
могут "делаться всякие важные дела" ("эгоистка"…).
Хотя она и "дурёха", и "ремень по ней плачет", но, в данном случае, без нее никак
не обойтись ("важняк").
Вот и приходится бедному конструктору всячески "изворачиваться", чтобы "и волки
были сыты, и овцы были целы".
А раз это так, то, если поставлена задача минимизации интервала времени Тпрогр,
без "кровавой битвы с микросекундами" не обойтись.
Задача - как можно более "обкарнать" этот интервал времени, не "загубив" при этом
того, что ранее работало.
Эта задачка совсем не из легких, и качественно решат ее только те люди, которые
"дружат" с оптимизацией программных процедур (и функциональной, и покомандной).
В этом случае, "халтура", в виде групп команд неоптимальной "конструкции", "выйдет
боком" (плохой сон с кикиморами, синюшный фингалище под глазом и т.п.).
Имейте это ввиду.
Если высокая частота дискретизации не нужна, то все гораздо проще и бесхитростнее.

О точности и линейности аналого - цифрового преобразования.


В части касающейся этих наиважнейших параметров, разработчики поступили мудро.

8
С одной стороны, они, вроде как, гарантируют высокие точность и линейность АЦП, но
с другой стороны, намекают на ошибки, которые могут иметь место быть.
В этом отношении, я прекрасно их понимаю, так как "в деле оцифровки" того, что
имеет бесконечное количество "недисциплинированных, мгновенных" уровней,
существуют объективные и достаточно существенные трудности как "организационного",
так и технологического характера.
Любому человеку, который хотя бы "одним боком прислонился" к аналого – цифровому
преобразованию, должно быть понятно, что идеальная передаточная функция модуля
АЦП существует только на бумаге, а "в реальной жизни, это есть техническая утопия
(мираж), так как существует множество факторов, отклоняющих реальную передаточную
функцию модуля АЦП от идеальной (в даташитах они перечисляются).
Но "приблизиться" к ней можно.
Первое что нужно сделать, так это осуществить точную "привязку" ("наложение")
диапазона изменения уровней аналогового сигнала к диапазону квантования по уровню.
В противном случае, можно "закалиброваться вплоть до одури", но так и не достичь
желаемого ("голову вынул, хвост увяз" и наоборот).
Таким образом, диапазон квантования по уровню должен быть точно "наложен"
на диапазон изменения уровней аналогового сигнала.
Предположим, что диапазон изменения уровней аналогового сигнала такой:
от 0 в. до Ux.
В этом случае, -Uref должно быть = 0 в., а +Uref должно быть = Ux.
Именно к этому нужно всячески и упорно стремиться.
Отклонение от этого равенства ухудшает реальную линейность АЦП (по сравнению с
идеальной) тем больше, чем больше величина этого отклонения.
Так как знака равенства, между реальной передаточной функцией модуля АЦП и
идеальной передаточной функцией модуля АЦП, ставить нельзя, то будут и
погрешности АЦП, и линейность АЦП, отличающаяся от идеальной.
Задача конструктора состоит в минимизации этих "бяк".
В простейшем случае, реальную линейность АЦП можно оценить, сравнив величину
уровня напряжения, присутствующего на активном, аналоговом входе ПИКа, с
показаниями, выводимыми на индикацию.
В идеале, должно быть полное, числовое соответствие во всех точках замеров.
Если, по результатам нескольких замеров, имеются "накапливающиеся" расхождения, то
их можно попробовать уменьшить, изменив значение опорного напряжения, значение
Tad (со слов разработчиков, наиболее надежно и качественно модуль АЦП работает
при Tad = 4 мкс.) или время фиксированной задержки.
Это процесс достаточно кропотливый и изобилующий спецификой.
И все это "безобразие" "привязано" к конкретному ПИКу, так как имеет место быть
"разброс" параметров модуля АЦП.
Здесь я только "обозначил контуры проблемы", с надеждой на то, что, коллективными
усилиями, в дальнейшем, будет наработана, проверенная "в железе", информация,
которая поможет капитально разобраться в этом "точностно – линейном" вопросе.

О прерываниях.
В конце преобразования, одновременно со сбросом флага статуса модуля АЦП,
поднимается флаг прерывания от модуля АЦП.
Это бит №6 (ADIF) регистра флагов прерываний от периферийных модулей (модуль
АЦП является периферийным) с названием PIR1 (0-й банк, адрес 0Ch).
Для того чтобы разрешить прерывание от модуля АЦП, нужно сначала установить
единицы в битах №№6 и 7 регистра INTCON (разрешение прерываний от
периферийных модулей), а затем установить в единицу бит №6 регистра PIE1 (1-й
банк, адрес 8Сh).
"Уход" в прерывание от модуля АЦП выгоден тогда, когда нужно получить
малоинерционный отклик на событие поднятия флага статуса модуля АЦП.
Соответственно, "перегрузка" результата АЦП в "закрома" организуется в ПП
прерывания.
В ней же, можно сделать и какие-то другие "дела" (зависит от задумки).
Флаг ADIF отличается от других флагов периферийных модулей только своим
"хозяином".
9
О работе модуля АЦП в "связке" с модулем CCP.
Такую "связку" можно организовать в том случае, когда "оцифровывать" уровень
аналогового сигнала (например, с целью замера его уровня) нужно не часто, а через
достаточно продолжительные, калиброванные интервалы времени (периодически).
Соответственно, задействуется модуль ССP, работающий в режиме сравнения, с
использованием триггера специальных функций.
Как это делается, описано в подразделе 6/6/5, программа Sravn_1.asm.
Если "привязаться" к стратегии этой программы ("уход" в прерывание от модуля ССP),
то можно ее "трансформировать" следующим образом.
Одновременно с уходом в прерывание от модуля ССP, происходит поднятие флага
статуса модуля АЦП (модуль АЦП должен быть включен).
Это делается по управляющему сигналу, который аппаратно формирует триггер
специальных функций.
Проще говоря, в этом режиме работы модуля CCP, "уход" в прерывание и "запуск"
АЦП происходят одновременно.
А раз это так, то все, что относится непосредственно к АЦП и к обработке результата
АЦП, нужно разместить в ПП прерывания.
Необходимое условие нормальной работы: в ПП прерывания, все "дела" должны быть
сделаны за время меньшее, чем интервал времени между двумя соседними "уходами"
в прерывание.

"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

10

Оценить