Описание
В данном руководстве по применению описаны минимальные требования к аппаратному и программному обеспечению для получения измерения углового положения от электролитического датчика наклона Fredericks.
Базовая конструкция и сенсорное возбуждение
На рисунке 1 показаны основные компоненты, необходимые для создания функционирующего блока измерения угла наклона с помощью электролитического датчика угла наклона.

Как вы увидите позже, важно избегать подачи постоянного тока на датчик. Поэтому мы предлагаем использовать операционный усилитель с высоким входным импедансом, такой как LMC6482 от Texas Instruments. Это позволит ограничить утечку тока на землю и, в свою очередь, постоянный ток на датчик. На рисунке 2 показана схема, эквивалентная одноосному электролитическому датчику наклона.

Давайте продолжим с сигналом возбуждения для датчика. Сигнал возбуждения подается микропроцессором, самый простой случай - одноосный датчик. Для одноосевого датчика требуется два выходных порта микропроцессора, которые подключаются к внешним контактам датчика. Порты имеют 50% рабочий цикл и период от 200 до 1000 Гц. См. рис. 3.
Точная синхронизация в программном обеспечении необходима для поддержания 50% рабочего цикла для предотвращения асимметрии в сигнале возбуждения датчика. См. Рисунок 4. Асимметрия определяется как постоянный ток к датчику, который вызывает смещение и, в конечном счете, постоянное и необратимое повреждение датчика. Это можно объяснить химически; постоянный ток вызывает электролиз, что в конечном итоге делает датчик инертным.
Рассмотрим процесс создания возбуждающего сигнала в программном обеспечении для микропроцессора PIC18F с помощью CCS PCW C Compiler. Данные инструкции будут существенно отличаться в зависимости от конкретного микропроцессора и компилятора. Начнем с определения, какие контакты будут использоваться для вывода. Мы будем использовать PORTB для вывода, поэтому нам нужно будет определить его как таковой. Это достигается установкой 8-битного регистра направления данных, называемого TRISB. Бит в TRISB, установленный в 0, определит соответствующий вывод PORTB как выходной, поэтому мы будем использовать следующую строку кода для использования всех выводов PORTB для вывода:
set_tris_b(0b00000000); |
Для того, чтобы быстро изменить значения PORTB pin, нам понадобится доступ к нему в памяти. На данном микропроцессоре PORTB представляет собой специальный регистр функций (SFR), который располагается по адресу памяти 0xf81. Поэтому мы будем хранить расположение PORTB в переменной, чтобы обеспечить легкий доступ. Это выполняется следующей строкой кода:
#byte port_b = 0xf81; |
Каждый бит в port_b теперь соответствует булавке на микросхеме. Наиболее значимый бит - pin B8, а наименее значимый - pin B0. Предположим, что к контактам B0 и B1 подключен одноосевой датчик. См. рисунок 3. Если вы используете двухосевой датчик, то допустим, что он соединен с выводами B0, B1, B2 и B3.

Для одноосевого датчика существуют два состояния для сигнала возбуждения. См. рис. 4. Для имитации этой временной диаграммы эти два состояния могут быть сохранены в массиве из 8 битовых чисел. Для этого используется следующая строка кода:
int8 output_arr[2] = { 0b00000010, 0b00000001 }; |

Для двухосного датчика существует четыре состояния для сигнала возбуждения. См. рис. 5. Для имитации этой временной диаграммы четыре состояния могут быть сохранены в массиве из 8 битовых чисел. Для этого используется следующая строка кода:
int8 output_arr[4] = { 0b00000011, 0b00001100, 0b00001010, 0b00000101 }; |

Таймеры являются широко используемым инструментом для генерации прерываний с точными интервалами в программном обеспечении, и они могут быть использованы для легкой генерации сигнала возбуждения. Важно использовать высокоприоритетное прерывание, чтобы сигнал возбуждения поддерживал 50% рабочий цикл. Следующий код создает высокоприоритетное прерывание, которое переключает порты для генерирования сигнала возбуждения для двухосного датчика:
int isr_counter = 0; #int_timer1 HIGH void timer1_isr(void) { set_timer1(64535); port_b = output_arr[ (isr_counter++) % 4]; // this is for a dual axis sensor } |
В данном примере таймер1 - это 16-битный счетчик (от 0 до 65535). Это означает, что он будет отсчитываться от значения, установленного функцией set_timer(), и когда он переполнится (достигнет 65535), будет сгенерировано прерывание и выполнен код внутри функции timer1_isr(). Количество времени, которое требуется для переполнения, определяется различными факторами, в том числе тактовой частотой микропроцессора и параметрами настройки таймера1. Для обеспечения правильного возбуждения датчика важно поддерживать время прерывания в пределах от 1 до 5 миллисекунд. Обратитесь к руководству по эксплуатации вашего отдельного микропроцессора для получения этой информации.
Переключение портов работает с помощью функции модуля. Каждый раз при генерации прерывания инкрементируется isr_counter и на нем выполняется модуль 4. Это, в сущности, делает счетчик, который отсчитывает от 0 до 3, инкрементируя с каждым прерыванием. Этот счетчик обращается к каждому из четырех состояний, сохраненных в output_arr, которые составляют сигнал возбуждения.
Сенсорный выход
Теперь, когда мы создали сигнал возбуждения, давайте осмотрим выход датчика. Выход - это аналоговое напряжение, привязанное к напряжению возбуждения. Выход должен считываться по фазе с сигналом возбуждения. Предлагается взять несколько дискретов в каждом из четырех состояний (два состояния для одного осевого датчика).

На рисунке 6 показан пример выхода аналого-цифрового преобразователя, подключенного к выходу двухосного датчика. Этот конкретный выход указывает положительный угол наклона как для оси x, так и для оси y. Выход, указывающий отрицательный угол наклона, показан на рисунке 7.

Для считывания выходных данных нам потребуется использовать аналого-цифровой преобразователь (АЦП) от микропроцессора. Глядя на рисунок 3, нам нужно будет установить контакт A0 в качестве входа АЦП, а затем установить текущий порт АЦП на контакт A0. После этого можно выполнить следующий код для считывания выхода с двухосного датчика в фазе с сигналом возбуждения:
int samples = 0; int index = 0; int xpos[8], xneg[8], ypos[8], yneg[8] = {0,0,0,0,0,0,0,0}; while(true) { while( (isr_counter % 4) != 0 ); while( (isr_counter % 4) == 0 ) { // loop to read x positive state delay_us(100); if(index <= 7) xpos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 1 ); while( (isr_counter % 4) == 1 ) { // loop to read x negative state delay_us(100); if(index <= 7) xneg[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 2 ); while( (isr_counter % 4) == 2 ) { // loop to read y positive state delay_us(100); if(index <= 7) ypos[index] = Read_ADC(); index++; } index = 0; while( (isr_counter % 4) != 3 ); while( (isr_counter % 4) == 3 ) { // loop to read y negative state delay_us(100); if(index <= 7) yneg[index] = Read_ADC(); index++; } index = 0; // data processing and analysis would then be done here } |
Как вы можете видеть, в пределах каждого состояния сигнала возбуждения мы собираем 8 образцов с задержкой 0,1 мс между образцами. Затем эти образцы могут быть усреднены в коде анализа данных для получения более стабильного и точного результата. Ссылаясь на счетчик isr_counter, мы можем гарантировать, что показания снимаются в фазе с сигналом возбуждения.
Погружение под наклоном
Угол наклона датчика можно вычислить, сравнивая разность напряжений для каждого состояния возбуждения:
Ось Х наклон = (X+) - (X-)
Ось Y наклон = (Y+) - (Y-)
Допустим, у нас есть 16-битный (от 0 до 65535 отсчётов) аналого-цифровой преобразователь, считывающий выход с двухосного ±20° датчика. Это означает, что наш диапазон выхода составляет ±65535 отсчётов с использованием определений наклона оси X и Y, приведённых выше. Рассмотрим следующий выход для одного цикла:
X+ = 45535
X- = 20000
Y+ = 30000
Y- = 35535
Тогда мы можем заключить следующее:
наклон по оси Х = +25535
Наклон по оси Y = -5535
Теперь, чтобы преобразовать это в измерение угла:
±65535 отсчётов = 131070 отсчётов диапазона
±20° = 40° диапазон
131070 отсчетов / 40° = ~3277 отсчетов / °
25535 отсчет / (3277 отсчетов/°) = ~+7,79° наклон оси x
-5535 отсчет / (3277 отсчетов/°) = ~-1.69° наклон оси y
Механические аспекты при определении угла наклона
Все датчики имеют механические допуски, а их эксплуатационные характеристики часто указывают только на часть их общего диапазона. Кроме того, приведенные выше расчеты предполагают линейный, симметричный и центрированный выход датчика, что обычно не так. Поэтому важно охарактеризовать конкретный тип датчика, который вы используете в своей области применения, чтобы вычислить истинное положение наклона.
Рассмотрим, например, электролитический датчик с одной осью ±25°. На рисунке 8 показаны механические характеристики этого датчика наклона:

Допустим, на этот раз у нас есть 12-битный (от 0 до 4095 отсчетов) аналого-цифровой преобразователь, считывающий выход с датчика. Это означает, что наш диапазон выхода составляет ±4095 отсчетов с использованием определения наклона оси X в предыдущем разделе. Для индивидуальной характеристики матрицы мы сначала наклоняем ее на -25° и считываем показания. Рассмотрим следующий выход для одного цикла при наклоне на -25°:
X+ = 400
X- = 3700
Наклон по оси Х при -25° = 400 - 3700 = -3300
Затем мы наклоняем датчик до +25° и снова снимаем показания. Рассмотрим следующий выход для одного цикла при наклоне +25°:
X+ = 3700
X- = 400
Наклон по оси Х при +25° = 3700-400 = 3300
Затем мы можем сделать следующие вычисления:
3300 - (-3300) = 6600 диапазон отсчёта
±25° = 50° диапазон
6600 отсчетов / 50° = 132 отсчета/°
Знание количества отсчетов на градус позволяет легко конвертировать показания аналого-цифрового преобразователя в угловое положение. Дальнейшая компенсация линейности, симметрии и нулевого положения значительно повысит точность угловых вычислений.
Соображения для программного обеспечения
Как и в любом другом программном обеспечении, существует множество различных способов достижения одной и той же цели. В этом документе просто представлен один пример того, как электролитическая обработка сигнала датчика наклона может быть достигнута с помощью специального микропроцессора и компилятора.