AN 1000: 전해질 틸트 센서 여기

설명

이 애플리케이션 노트에서는 Fredericks 전해 기울기 센서로부터 각도 위치 측정을 얻기 위한 최소 하드웨어 및 소프트웨어 요구 사항을 설명합니다.

기본 설계 및 센서 여기

도 1은 전해질 틸트 센서를 사용하여 작동 기울기 측정 장치를 만드는 데 필요한 주요 구성 요소를 보여줍니다.

그림 1

 

나중에 볼 수 있듯이 센서에 직접 전류를 방지하는 것이 중요합니다. 따라서 텍사스 인스트루먼트의 LMC6482와 같은 높은 입력 임피던스를 사용하는 것이 좋습니다. 이렇게 하면 전류 누설이 지면으로 제한되고 센서에 직접 전류가 제한됩니다. 도 2는 단일 축 전분해 틸트 센서와 동등한 회로를 나타낸다.

 

그림 2

 

센서의 여기 신호를 계속 해 봅시다. 흥분 신호는 마이크로프로세서에 의해 단일 축 센서인 가장 간단한 케이스를 제공합니다. 단일 축 센서에는 센서의 외부 핀에 연결된 마이크로프로세서의 두 개의 출력 포트가 필요합니다. 항구는 50%의 관세 주기와 200~1000헤르츠 사이의 기간으로 전환됩니다. 그림 3을 참조하십시오.

센서 여기 신호의 비대칭을 방지하기 위해 50%의 듀티 사이클을 유지하려면 소프트웨어의 정확한 타이밍이 필요합니다. 그림 4를 참조하십시오. 비대칭은 센서의 직접 전류로 정의되어 드리프트를 일으키고 궁극적으로 센서에 영구적이고 돌이킬 수 없는 손상을 입힙니다. 이것은 화학적으로 설명 될 수있다; 직접 전류로 인해 전기 분해가 발생하여 센서가 불활성상태로 변합니다.

CCS PCW C 컴파일러를 사용하여 PIC18F 마이크로프로세서용 소프트웨어에서 여기 신호를 만드는 과정을 살펴보겠습니다. 이러한 지침은 특정 마이크로프로세서 및 컴파일러에 따라 크게 다릅니다. 먼저 출력에 사용할 핀을 정의합니다. 우리는 출력에 대한 PORTB를 사용하므로 우리는 그렇게 정의해야합니다. 이는 TRISB라고 하는 8비트 데이터 방향 레지스터를 설정하여 수행됩니다. TRISB의 비트가 0으로 설정되면 해당 PORTB 핀을 출력으로 정의하므로 다음 코드 줄을 사용하여 출력에 대한 모든 PORTB 핀을 사용합니다.

set_tris_b(0b00000000);

PORTB 핀 값을 빠르게 변경하려면 메모리에 액세스해야 합니다. 이 특정 마이크로프로세서에서 PORTB는 메모리 주소 0xf81에 있는 특수 기능 레지스터(SFR)입니다. 따라서 쉽게 액세스할 수 있도록 PORTB의 위치를 변수에 저장합니다. 이 작업은 다음 코드 줄에서 수행됩니다.

#byte port_b = 0xf81;

이제 port_b 각 비트는 칩의 핀에 해당합니다. 가장 중요한 비트는 핀 B8이고 가장 중요한 비트는 핀 B0입니다. 단일 축 센서가 핀 B0 및 B1에 연결되어 있다고 가정해 보겠습니다. 그림 3을 참조하십시오. 이중 축 센서를 사용하는 경우 핀 B0, B1, B2 및 B3에 연결되어 있다고 가정해 보겠습니다.

 

그림 3

 

단일 축 센서의 경우 여기 신호에 대한 두 가지 상태가 있습니다. 그림 4를 참조하십시오. 이 타이밍 다이어그램을 모방하려면 두 상태를 8비트 숫자의 배열에 저장할 수 있습니다. 이 작업은 다음 코드 줄에서 수행됩니다.

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

 

그림 4

 

이중 축 센서의 경우 여기 신호에 대한 4개의 상태가 있습니다. 그림 5를 참조하십시오. 이 타이밍 다이어그램을 모방하려면 4개의 상태를 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
}

이 예제에서 timer1은 16비트 카운터(0 ~ 65535)입니다. 즉, set_timer() 설정된 값과 오버플로(65535에 도달하면)에서 카운트업하고 인터럽트가 생성되고 timer1_isr() 함수 내의 코드가 실행됩니다. 오버플로하는 데 걸리는 시간은 마이크로프로세서 클럭 속도와 타이머1 설정 파라미터 등 다양한 요인에 의해 정의됩니다. 센서의 적절한 흥분을 보장하기 위해 1~5밀리초 사이의 인터럽트 시간을 유지하는 것이 중요합니다. 이 정보는 개별 마이크로프로세서 의 설명서를 참조하십시오.

포트 토글링은 계수 함수를 사용하여 작동합니다. 인터럽트를 생성할 때마다 isr_counter 증분되고 변둘루스 4가 수행됩니다. 이것은 본질적으로 0에서 3까지 계산카운터를 만들고 각 인터럽트마다 증가합니다. 이것은 여기 신호를 포함하는 output_arr 저장된 4개의 상태의 각각에 접근합니다.

센서 출력

이제 여기 신호를 만들었으니 센서의 출력을 살펴보겠습니다. 출력은 흥분 전압에 참조되는 아날로그 전압입니다. 출력은 여기 신호와 함께 단계적으로 읽어야 합니다. 4개 상태(단일 축 센서에 대한 2개 상태)에서 여러 샘플을 채취하는 것이 좋습니다.

 

그림 6

 

도 6의 파형은 이중 축 센서의 출력에 연결된 아날로그에서 디지털 컨버터로의 예 출력을 나타낸다. 이 특정 출력은 x축과 y축 모두에 대한 양수 기울기 각도를 나타냅니다. 음수 기울기 각도를 나타내는 출력은 그림 7을 참조하십시오.

 

그림 7

 

출력을 읽으려면 마이크로프로세서의 아날로그에서 디지털 컨버터(ADC)에 사용해야 합니다. 그림 3을 살펴보면 핀 A0을 ADC 입력으로 설정한 다음 현재 ADC 포트를 설정하여 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
}

당신이 볼 수 있듯이, 여기 신호의 각 상태 내에서 우리는 샘플 사이에 0.1 ms 지연8 샘플을 수집하고 있습니다. 그런 다음 이러한 샘플을 데이터 분석 코드에서 평균화하여 보다 안정적이고 정확한 결과를 제공할 수 있습니다. isr_counter 참조함으로써 우리는 판독값이 여기 신호와 함께 단계적으로 촬영되도록 할 수 있습니다.

기울기 각도 를 유도

센서의 기울기 각도는 각 흥분 상태에 대한 전압 간의 차이를 비교하여 파생될 수 있습니다.

X 축 기울기 = (X+) – (X-)
Y 축 기울기 = (Y+) – (Y-)

디지털 컨버터에 대한 16비트(0~65535개)의 아날로그를 사용하여 ±20° 듀얼 축 센서에서 출력을 읽는다고 가정해 봅시다. 즉, 위의 X 축 기울기의 정의를 사용하여 출력 범위가 ±65535 개수입니다. 한 주기에 대해 다음 출력을 살펴보겠습니다.

X+ = 45535
X- = 20000
Y+ = 30000
Y-= 35535

그런 다음 다음을 결론을 내릴 수 있습니다.

X 축 기울기 = +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개) 아날로그를 가지고 있다고 가정해 보겠습니다. 즉, 이전 섹션에서 X 축 기울기의 정의를 사용하여 출력 범위가 ±4095개입니다. 개별적으로 센서의 특성화하기 위해 먼저 센서를 -25°로 기울여 읽기를 합니다. -25° 기울기에서 한 사이클에 대해 다음 출력을 살펴보겠습니다.

X+ = 400

X- = 3700

X 축 기울기 -25° = 400 – 3700 = -3300

그런 다음 센서를 +25°로 기울인 다음 다시 판독합니다. +25° 기울기에서 한 사이클에 대해 다음 출력을 살펴보겠습니다.

X+ = 3700
X- = 400

X 축 기울기 +25° = 3700-400 = 3300

그런 다음 다음 계산을 수행할 수 있습니다.

3300 – (-3300) = 6600 카운트 범위
±25° = 50° 범위
6600 카운트 / 50 ° = 132 카운트 / °

도당 개수를 알면 아날로그에서 디지털 컨버터로 읽기를 각도 위치로 쉽게 변환할 수 있습니다. 선형성, 대칭 및 0 위치에 대한 추가 보상은 각 계산의 정확도를 크게 향상시립니다.

소프트웨어 고려 사항

모든 소프트웨어와 마찬가지로 동일한 목표를 달성하는 방법에는 여러 가지가 있습니다. 이 문서는 단순히 특정 마이크로 프로세서와 컴파일러를 사용하여 전기 틸트 센서 신호 컨디셔닝을 달성 할 수있는 방법의 한 가지 예를 제공합니다.