AN 1000: Электролитическое возбуждение датчика наклона

Описание

В данном руководстве по применению описаны минимальные требования к аппаратному и программному обеспечению для получения измерения углового положения от электролитического датчика наклона Fredericks.

Базовая конструкция и сенсорное возбуждение

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

рис. 1

 

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

 

рисунок 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.

 

рис. 3

 

Для одноосевого датчика существуют два состояния для сигнала возбуждения. См. рис. 4. Для имитации этой временной диаграммы эти два состояния могут быть сохранены в массиве из 8 битовых чисел. Для этого используется следующая строка кода:

int8 output_arr[2] = { 0b00000010, 0b00000001 };

 

рис. 4

 

Для двухосного датчика существует четыре состояния для сигнала возбуждения. См. рис. 5. Для имитации этой временной диаграммы четыре состояния могут быть сохранены в массиве из 8 битовых чисел. Для этого используется следующая строка кода:

int8 output_arr[4] = { 0b00000011, 0b00001100, 0b00001010, 0b00000101 };

 

рис. 5

Таймеры являются широко используемым инструментом для генерации прерываний с точными интервалами в программном обеспечении, и они могут быть использованы для легкой генерации сигнала возбуждения. Важно использовать высокоприоритетное прерывание, чтобы сигнал возбуждения поддерживал 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

 

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

 

рис. 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 показаны механические характеристики этого датчика наклона:

 

рис. 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 отсчета/°

Знание количества отсчетов на градус позволяет легко конвертировать показания аналого-цифрового преобразователя в угловое положение. Дальнейшая компенсация линейности, симметрии и нулевого положения значительно повысит точность угловых вычислений.

Соображения для программного обеспечения

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