MEMS 가속도 센서와 자이로스코프의 셀프 테스트 기능은 PCB 조립 이후 센서가 제 기능을 하는 지 알아보기 위한 스마트 기능이다. 각 PCB마다 기계적인 테스트를 할 필요가 없어, 이 기능이 대량생산 제품에 필수적인 사항이 됐다.
글 | 제이 에스판디아리(Jay Esfandyari) 1
강 수(Gang Xu)
마르코 카포빌라(Marco Capovilla)
파올로 벤디스치올리(Paolo Bendiscioli)
마르코 비안코(Marco Bianco)
ST마이크로일렉트로닉스
요약 초기 MEMS 센서는 셀프 테스트 기능이 내장되어 있지 않았다. 그래서 엔지니어들은 센서를 장착한 PCB를 물리적으로 기울여보거나(가속도 센서의 경우) 회전시켜서(자이로스코프의 경우) 그 결과를 측정해 센서가 제품 사양대로 작동하는지 확인해야 했다. 움직임에 따라 결과가 변하면 센서가 제대로 작동하고 있다는 것을 의미하며, 그렇지 않으면 이 센서는 ‘실패’한 것으로 판단한다. 그러나 이런 절차는 대량 생산에는 적합하지 못했다. 최근 몇 년 동안 내장형 셀프 테스트는 MEMS 센서에서 필수적인 기능이 되었다. 여기에서의 셀프 테스트 개념은 센서의 기계식 센싱 요소에 정전기력을 가해서 외부의 움직임이나 회전이 가해지는 것과 같은 상황을 시뮬레이션하는 것이다. 셀프 테스트 기능이 있든 없든 센서의 결과에 변화가 생기면, 이것은 곧 센서가 제품 사양에 따라 정확하게 작동하고 있다는 의미이다. 엔지니어들은 MEMS 센서의 셀프 테스트 기능을 알고 있지만, 셀프 테스트의 정확한 사용법을 잘 모르는 경우도 많다. 이 글은 블록 다이어그램과 샘플 코드를 활용하여 디지털 MEMS 모션 센서(가속도 센서와 자이로스코프)에서 셀프 테스트 기능을 구현하는 방법을 설명한다. |
가속도 센서와 자이로스코프의 셀프 테스트 과정
가속도 센서
가속도 센서의 셀프 테스트를 수행하면 정전기력이 기계식 센싱 요소에 가해지고, 이에 따라 이동체가 원위치를 벗어나 입력된 가속의 정확한 정도만큼 움직인다. 셀프 테스트 모드의 결과치를 디바이스의 일반 모드, 즉 셀프 테스트가 작동하지 않는 상태에서의 결과 데이터와 비교한다. 이때의 결과차의 절댓값이 사전에 정해 두었던 전체 범위의 최소/최대 범위 내에 있다면 가속도 센서는 제대로 작동하는 것이다.
가속도 센서의 셀프 테스트를 더 깊이 이해하기 위해서는 다음 사항을 명확히 할 필요가 있다.
-셀프 테스트를 수행할 때와 수행하지 않을 때, 가속도 센서의 로우 데이터는 임의의 동일한 고정된 위치에서 수집되어야 한다.
-가속도 센서를 파워다운 모드에서 정상 모드로 변경 시, 데이터 확보 이전에 가속도 센서 데이터를 안정화하는 일정 시간 [1]이 필요하다.
-가속도 센서의 셀프 테스트는 다른 FS 범위에서도 수행 가능하다.
-셀프 테스트 수행 과정에서, 다른 모드들에서 5개나 10개의 샘플들을 수집한 후, 샘플들의 평균을 내어 최종 셀프 테스트 결과치를 계산해 낼 수 있다.
가속도 센서가 정상 모드(셀프 테스트를 수행하지 않는) 일 경우, “Data_no_ST”(그림 1 참조)는 다음을 의미한다.
동일한 고정 위치에서 가속도 센서가 셀프 테스트 모드 일 경우, “Data_ST”는 다음을 의미한다.
그리고 셀프 테스트 결과는 아래와 같다.
만일 {(minx < Δx < maxx)이고 (miny < Δy < maxy)이고 (minz < Δz < maxz)}라면, 이 센서는 셀프 테스트를 통과한 것이다. 그렇지 않으면 이 센서는 실패한 것이다.
여기에서 min x,y,z와 max x,y,z는 정수 LSB(최하위 비트) 단위이며 풀 스케일 범위에 대한 수치이다.
일반적으로는 셀프 테스트 0과 셀프 테스트 1이라는 두 개의 셀프 테스트 모드가 있다. 셀프 테스트 0과 셀프 테스트 1의 차이는 같은 크기의 검증 질량(proof mass)이 서로 다른 방향으로 움직인다는 점이다. 이는 셀프 테스트 0과 셀프 테스트 1은 부호만 다르고 결과치가 비슷하게 나와야 한다는 의미이다. 따라서 사용자들은 어느 고정 위치에서든 셀프 테스트 0이나 셀프 테스트 1 모드 중 하나만 선택하면 된다.
정상 모드(셀프 테스트를 수행하지 않는)에서의 가속도 센서 로우 데이터는 셀프 테스트 0의 로우 데이터와 셀프 테스트 1의 로우 데이터 자료를 합한 총합의 절반과 같다. 이는 셀프 테스트 0 모드와 셀프 테스트 1 모드에서의 Δ 값이 상쇄되기 때문이다. 말하자면 다음과 같이 나타낼 수 있다.
자이로스코프
자이로스코프가 셀프 테스트를 수행할 때는 정전기력을 큰 질량(seismic mass)에 가하여 움직이게 함으로써 정확한 코리올리스 힘(Coriolis force)을 시뮬레이션 한다. 셀프 테스트를 수행하지 않을 때 결과 값과 비교해 보면 그 결과 값이 변할 것이다. 이때 결과치의 변화 값이 사전에 정해 두었던 전체 범위의 최소/최대 범위 내에 있다면, 이 자이로스코프는 제대로 작동하고 있는 것이다.
자이로스코프의 셀프 테스트를 더 잘 이해하기 위해서는 다음 사항을 분명히 할 필요가 있다.
- 셀프 테스트를 수행하지 않을 때, 자이로스코프의 로우 데이터는 임의의 동일한 고정 위치에서 수집되어야 한다.
- 자이로스코프를 파워다운 모드에서 정상 모드로 변경할 때, 데이터 확보 이전에 자이로스코프 데이터를 안정화하는 일정 시간 [2]이 필요하다.
- 자이로스코프는 총 셀프 테스트 시간을 절약하기 위해 더 높은 ODR로 설정될 수 있다.
- 자이로스코프 셀프 테스트는 다른 FS 범위에서 수행될 수 있다. 그러면 dps 단위에서의 최소 및 최대 값은 새로운 FS 범위에서의 민감 인수(sensitivity parameters)에 따라 정수 LBS 단위의 min x,y,z와 max x,y,z로 변환되어야 한다.
가속도 센서가 정상 모드(셀프 테스트를 수행하지 않는)일 경우, “Data_no_ST”(그림 1 참조)는 다음을 의미한다.
동일한 고정 위치에서 가속도 센서가 셀프 테스트 모드일 경우, “Data_ST”는 다음을 의미한다.
그리고 셀프 테스트 결과는 아래와 같다.
만일 {(minx < Δx < maxx)이고 (miny < Δy < maxy)이고 (minz < Δz < maxz)}라면, 이 센서는 셀프 테스트를 통과한 것이다. 그렇지 않으면 이 센서는 실패한 것이다.
여기에서 min x,y,z와 max x,y,z는 정수 LSB(최하위 비트) 단위이며 풀 스케일 범위에 대한 수치이다.
셀프 테스트 0 선택 시 테스트 결과는 셀프 테스트 1 선택 시 셀프 테스트 1의 결과와 비슷해야 한다. 사용자는 어느 고정 위치에서든 셀프 테스트 0이나 셀프 테스트 1 모드 중 하나를 선택하면 된다. 그림 1은 디지털 가속도 센서나 디지털 자이로스코프의 예로써, 셀프 테스트 과정을 다이어그램으로 보여준다.
셀프 테스트 샘플 코드
가속도 센서
아래의 샘플 코드는 ST[1]의 LIS3DH 가속도 센서에 기초한 것이다.
Void ACC_self_test (void)
{
// ACC는 파워업 후 파워다운 모드임
// 제어 레지스터(23h)를 BDU(Block Data Update)과 HR(High Resolution) 비트 수행이 가능한 정상 모드의 ±2g FS로 설정
Write (0x23, 0x88);
// 제어 레지스터(20h)를 X/Y/Z 축이 가능한 50Hz ODR(Output Data Rate)로 설정
Write(0x20, 0x47);
가속도 센서가 안정화 [1] 되도록 (1/ODR+1ms) = 21mS 동안 대기
// 정상 모드에서 가속도 센서 데이터를 5번 읽기
for (i = 0; i < 5; i++)
{
Ax[i] = Read(ACC_X);
Ay[i] = Read(ACC_Y);
Az[i] = Read(ACC_Z);
}
// 로우 데이터의 평균을 구함
Ax_no_st = (Ax[0] + Ax[1] + ... + Ax[4]) / 5;
Ay_no_st = (Ay[0] + Ay[1] + ... + Ay[4]) / 5;
Az_no_st = (Az[0] + Az[1] + ... + Az[4]) / 5;
// 셀프 테스트 0은 BDU와 HR 비트를 수행하는 +/-2g FS에서 수행. 가속도 센서가 안정화 되도록 (1/ODR + 1) = 21mS 동안 대기
Write (0x23, 0x8A);
// 셀프 테스트 0 모드에서 가속도 센서 데이터를 5번 읽기
for (i = 0; i < 5; i++)
{
Ax’[i] = Read(ACC_X);
Ay’[i] = Read(ACC_Y);
Az’[i] = Read(ACC_Z);
}
// 로우 데이터의 평균을 구함
Ax_st = (Ax’[0] + Ax’[1] + ... + Ax’[4]) / 5;
Ay_st = (Ay’[0] + Ay’[1] + ... + Ay’[4]) / 5;
Az_st = (Az’[0] + Az’[1] + ... + Az’[4]) / 5;
// 셀프 테스트를 수행한 결과 값에서 셀프 테스트를 수행하지 않은 값을 빼서 셀프 테스트 절댓값을 산정함
ST_x = abs(Ax_st - Ax_no_st);
ST_y = abs(Ay_st - Ay_no_st);
ST_z = abs(Az_st - Az_no_st);
// 가속도 센서가 셀프 테스트를 통과했는지 실패했는지 결정
만일 ((min_x < = ST_x < = max_x) && (min_y < = ST_y < = max_y) && (min_z < = ST_z < = max_z))라면
{
가속도 센서는 셀프 테스트 통과;
}
그렇지 않다면
{
가속도 센서는 셀프 테스트 실패;
}
}
자이로스코프
아래의 샘플 코드는 ST [2]의 L3GD4200D / L3GD20 자이로스코프에 기초한 것이다.
Void GYRO_self_test (void)
{
// 자이로(GYRO)는 파워업 후 파워다운 모드임
// 제어 레지스터(24h)를 차단 주파수 = 50Hz로 설정
Write (0x24, 0x02);
// 제어 레지스터(23h)를 BDU 비트 수행이 가능한 셀프 테스트 0모드의 ±2000dps FS로 설정
Write (0x23, 0xA0);
// 제어 레지스터(20h)를 X/Y/Z 축이 가능한 200Hz ODR로 설정
Write (0x20, 0x6F);
자이로스코프가 안정화 [2] 되도록 800mS 동안 대기
// 셀프 테스트 0 모드에서 자이로스코프 데이터 5번 읽기
for (i = 0; i < 5; i++)
{
Gx[i] = Read(GYRO_X);
Gy[i] = Read(GYRO_Y);
Gz[i] = Read(GYRO_Z);
}
// 로우 데이터의 평균을 구함
Gx_no_st = (Gx[0] + Gx[1] + ... + Gx[4]) / 5;
Gy_no_st = (Ay[0] + Gy[1] + ... + Gy[4]) / 5;
Gz_no_st = (Az[0] + Gz[1] + ... + Gz[4]) / 5;
// 셀프 테스트 0은 BDU가 가능한 +/-2000dps FS에서 수행. 자이로스코프가 안정화 되도록 60mS 동안 대기
Write (0x23, 0xA2);
// 셀프 테스트 0 모드에서 자이로스코프 데이터 5번 읽기
for (i = 0; i < 5; i++)
{
Gx’[i] = Read(GYRO_X);
Gy’[i] = Read(GYRO_Y);
Gz’[i] = Read(GYRO _Z);
}
//로우 데이터의 평균 구함
Gx_st = (Gx’[0] + Gx’[1] + ... + Gx’[4]) / 5;
Gy_st = (Gy’[0] + Gy’[1] + ... + Gy’[4]) / 5;
Gz_st = (Gz’[0] + Gz’[1] + ... + Gz’[4]) / 5;
// 셀프 테스트를 수행한 결과 값에서 셀프 테스트를 수행하지 않은 값을 빼서 셀프 테스트 절댓값을 산정함
ST_x = abs(Gx_st - Gx_no_st);
ST_y = abs(Gy_st - Gy_no_st);
ST_z = abs(Gz_st - Gz_no_st);
만일 ((min_x < = ST_x < = max_x) && (min_y < = ST_y < = max_y) && (min_z < = ST_z < = max_z))라면
{
자이로스코프는 셀프 테스트 통과;
}
그렇지 않으면,
{
자이로스코프는 셀프 테스트 실패;
}
}
결론
MEMS 가속도 센서와 자이로스코프의 셀프 테스트 기능은 PCB 조립 이후 센서가 제 기능을 하는지 알아보기 위한 스마트 기능이다. 각 PCB마다 기계적인 테스트를 할 필요가 없어서, 이 기능이 대량생산 제품에 필수적인 사항이 됐다.
<저작권자(c)스마트앤컴퍼니. 무단전재-재배포금지>