[ST_MICRO]/STM32F103-Mtype2009. 5. 28. 18:48

[STM32 M-Type EVM] 가속도 센서 테스트



3축 가속도 센서 myAccel3LV02 를 이용하여 가속도 센서 테스트. STM32를 이용하여 가속도 센서 데이터를 PC프로그램(C# 예제)으로 전송하는 실험



핀맵
myMCU-EXP 보드의 가속도 센서는 CTL2 -> PC11에 연결되어 있다.




테스트 코드
//-----------------------------------------------------------------------------
int main(void)
{
    unsigned short data;
 //System Init
 SystemInit();
 
    //LED Init
 Led1Init();
 Led1On();
 
 //Serial Init
 DebugInit(BAUD_115200);
 DebugPrint("myMCU-EXP myAccel3LV02 SPI Test Program.\r\n");

 myAccel3lvInit();
 myAccel3lvWrite(CTRL_REG1, 0xC7);  //1000.0111 Power on, enable all axis, self test off
 
 while (1)
 {
  switch(U0_GetByte())
  {
  case '0':
     Led1Off();
   DebugPrint("LED OFF\r\n");
     break;

  case '1':
   Led1On();

   DebugPrint("LED ON\r\n");   
     break;
  
  case 'r':
   GetAccelValue(AXIS_X, &data);

   DebugPrint("%d\r\n", data);  
   break; 
  }  
 }
}
//-----------------------------------------------------------------------------

Posted by nexp

댓글을 달아 주세요

  1. 백준구

    관리자의 승인을 기다리고 있는 댓글입니다

    2010.11.16 06:46 [ ADDR : EDIT/ DEL : REPLY ]

[DSP]/DSP283352009. 5. 28. 02:05

[DSP28335 EVM] TMS320F28335 SPI테스트 - 3축 가속도 센서 테스트

[DSP28335 EVM] TMS320F28335 SPI테스트 - 3축 가속도 센서 테스트


DSP2808335 SPI테스트를 위해 Code Composer Studio에 SPI관련 소스 및 가속도 센서 코드 추가



TMS320F28335 SPI블럭도






SPI Mode설정
LIS3LV02제어를 위해서는 SPI Mode0로 설정해야한다. SPICCR, SPICTL레지스터에서 설정할 수 있다.




SPI 설정


SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;   //SPI MODE0

 //SPI 초기화
 SpiaRegs.SPICCR.bit.SPISWRESET = 0;
 SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
 SpiaRegs.SPICCR.bit.SPILBK = 0;  //루프백 비사용
 SpiaRegs.SPICCR.bit.SPICHAR = 7;  //8비트 모드 
 SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Ready to transmit

 SpiaRegs.SPICTL.bit.SPIINTENA = 0; //인터럽트 비사용
 SpiaRegs.SPICTL.bit.TALK = 1;   // Transmit enable
 SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //SPI마스터 모드
 SpiaRegs.SPICTL.bit.CLK_PHASE = 0;   //SPI MODE0
 SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0; //Overrun interrupt disable

 SpiaRegs.SPIPRI.bit.FREE = 1;       // Set so breakpoints don't disturb xmission


SPI클럭 속도 설정
SpiaRegs.SPIBRR 레지스터에서 설정 가능하다. TMS320F28335는 최대 10Mhz까지 가능하다.(좀 아쉽다.)

 //SPI 클럭속도 설정
 SPI0_SetSpeed(SPI_SPEED_4MHZ);



 //SPI GPIO초기화
 EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;   // Enable pull-up on GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;   // Enable pull-up on GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;   // Enable pull-up on GPIO18 (SPICLKA)
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;   // Enable pull-up on GPIO19 (SPISTEA)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
   
    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
    EDIS;
 
 //SPI FIFO 초기화
    SpiaRegs.SPIFFTX.all=0xE040;
    SpiaRegs.SPIFFRX.all=0x204f;
    SpiaRegs.SPIFFCT.all=0x0;


TMS320F280335  3축 가속도 센서 테스트 소스코드
void main(void)
{
 short data = 0;
 unsigned int flag = 0;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 DebugInit(BAUD_115200);
 DebugPrint("TMS320F28335 SPI Test\r\n");

 myAccel3lvInit();
 myAccel3lvWrite(CTRL_REG1, 0xD7);  //1000.0111 Power on, enable all axis, self test off
 myAccel3lvWrite(CTRL_REG2, 0x40);

 while(1)
 {
  if(DebugIsByte())
  {
   switch(U0_GetByte())
   {
   case 'h':
    DebugPrint(("device_id=%02X\r\n", myAccel3lvRead(WHO_AM_I));
    break;

 case 'r':
    GetAccelValue(AXIS_X, &data);
    DebugPrint("Accel:%d\\n", data);  
    break;
}
}
Posted by nexp

댓글을 달아 주세요

[SENSOR]/Accel2008. 11. 4. 20:36

가속도 센서를 이용하여 기울기 측정에 관련 자료

가속도 센서를 이용하여 기울기 측정에 관련 자료


1축 센서를 이용하면 -45 도 에서 45도 까지는 사용 가능하나 그이상은 Sensitivity가 떨어지고 중앙 기준의 기울어진 방방향을 알수가 없다. 2축 이상을 이용하면 두개축이 기울어진 각도를 조합하여 Sensitivity가 일정하며 각도의 방향성도 알수 있다.

Posted by nexp

댓글을 달아 주세요

[SENSOR]/Accel2008. 9. 5. 06:56

[LIS3LV02DL] 3축 가속도 센서 관련 자료

[LIS3LV02DL] 3축 가속도 센서 관련 자료

LIS3LV02DL은 디지털 인터페이스 SPI와 I2C를 선택 할 수 있는 3축 가속도 센서이다. 센서의 가동부는 MEMS 기술로 실리콘을 가공, 제작되었다. 회로 부분은 CMOS 기술로 제작 되었으며 고집적, 저소비전류이다. 또 센서의 특성에 맞춰 내부 트리밍되어 있어 고정밀도 센서 출력을 쉽게 얻을 수 있다.
측정 가능한 가속도의 풀 스케일은 ±2g와 ±6g를 선택할 수 있고, 응답주파수는 640Hz로 고속이므로 폭넓은 분야에서 사용 할 수 있다.

특징
■ 2.16V TO 3.6V SINGLE SUPPLYOPERATION
■ 1.8V COMPATIBLE IOs
■ I2C/SPI DIGITAL OUTPUT INTERFACES
■ PROGRAMMABLE 12 or 16 BIT DATA REPRESENTATION
■ INTERRUPT ACTIVATED BY MOTION
■ PROGRAMMABLE INTERRUPT THRESHOLD
■ EMBEDDED SELF TEST
■ HIGH SHOCK SURVIVABILITY
■ ECO-PACK COMPLIANT

data sheet

 

응용회로






블록 다이어그램
센서부는 그림과 같이 콘덴서가 하프 브리지 상태로 되어 있다. 센서에 가속도가 가해지면 액추에이터가 이동하여 정전용량이 변화하고, 브리지가 비평형상태로 된다. 센서에 인가된 전압 펄스를 차지앰프로 적분하고, 정전용량의 변화를 출력한다. 센서의 정전용량은 평형 상태일 때 수pF, 최대 가속도가 가해졌을 때의 변화는 100pF 정도이다. 차지 앰프가 한 개이므로 센서부의 출력은 다중화(멀티플렉스)되지만 차지 앰프 출력은 역다중화(디멀티플렉스)되므로 각 축의 센서 출력을 독립적으로 얻을 수 있다. 차지 앰프의 클록은 61.5kHz이다.
센서로부터의 전압 출력은 3개의 ΔΣ 변환기(클록 주파수 20.5kHz)에 의해 비트 스트림으로 변환한다. 그 후 필터에서 디 지털 데이터로 변환하고 내부 레지스터에 저장한다. 이 데이터 는 SPI/I2C 인터페이스에 의해 마이컴에서 판독할 수 있다.


레지스터
센서의 설정과 제어는 CTRL_REG1, 2, 3에서 실행한다. 각축의 가속도 측정 데이터의 상태값은 STATUS_REG를 이용한다.

레지스터명 Address 초기값  
WHO_AM_I 0F 111010 물리 어드레스=3Ah
OFFSET_X 16 교정값 X축의 오프셋 교정값
OFFSET_Y 17 교정값 Y축의 오프셋 교정값
OFFSET_Z 18 교정값 Z축의 오프셋 교정값
GAIN_X 19 교정값 X축의 게인 교정값
GAIN_Y 1A 교정값 Y축의 게인 교정값
GAIN_Z 1B 교정값 Z축의 게인 교정값
CTRL_REG1 20 111 필터의 계수와 각 축 동작의 가부, 셀프 테스트 ON/OFF 설정 등
CTRL_REG2 21 0 풀 스케일 ±2g/±6g 선택, 출력 데이터 형식 선택 등
CTRL_REG3 22 1000 방향 검지와 자유 낙하 등의 HPF 설정 등
HP_FILTER RESET 23 더미 판독에 따라 HP_FILTER를 리셋
STATUS_REG 27 0 각 축의 데이터 재기록 상태와 유효/무효 판단
OUTX_L 28 출력값 X축의 가속도 데이터 (LSB)
OUTX_H 29 출력값 X축의 가속도 데이터 (MSB)
OUTY_L 2A 출력값 Y축의 가속도 데이터 (LSB)
OUTY_H 2B 출력값 Y축의 가속도 데이터 (MSB)
OUTZ_L 2C 출력값 Z축의 가속도 데이터 (LSB)
OUTZ_H 2D 출력값 Z축의 가속도 데이터 (MSB)
FF_WU_CFG 30 0 인터럽트 설정용
FF_WU_SRC 31 0 인터럽트 플러그
FF_WU_ACK 32 더미 더미 레지스터
FF_WU_THS_L 34 0 자유 낙하 검지 임계값 (LSB)
FF_WU_THS_H 35 0 자유 낙하 검지 임계값 (MSB)
FF_WU_DURATION 36 0 자유 낙하/웨이크업 이벤트의 최소 주기
DD_CFG 38 0 인터럽트 설정용
DD_SRC 39 0 인터럽트 플러그
DD_ACK 3A 더미 더미 레지스터
DD_THSI_L 3C 0 방향 검지 임계값 (LSB)
DD_THSI_H 3D 0 방향 검지 임계값 (MSB)
DD_THSE_L 3E 0 방향 검지 외부 임계값 (LSB)
DD_THSE_H 3F 0 방향 검지 외부 임계값 (MSB)



주요 레지스터
CTL_REG1


PD1, PD0 : 파워다운 모드 설정
 PD1, PD0 = “00” -> 파워다운 모드 (default value after boot).
 PD1, PD0 = "x1", "1x" -> 일반 동작 모드.

DF1,
DF0 : data rate(필터 설정으로 민감도를 설정할 수 있다. 높을수록 노이즈하지만 감도가 높아진다.)
 default "00" data-rate = 40Hz. By changing the content of DF1,
 “01”, “10” “11” ->160Hz, 640Hz, 2560Hz.

ST : self test function
 0 : 일반 동작 모드, 1: self test모드

Zen : enables Z-axis (The default value is 1)
Yen : enables Y-axis (The default value is 1)
Xen : enables X-axis (The default value is 1)

-> 따라서 초기화시 1100 0111(0xC7)로 설정하면 정상동작 한다.


CTL_REG2



FS Scale 설정.
 0 : +/-2g (default)
 1 : +/-6g

BDU bit is used to inhibit output registers update until both upper and lower register parts are
read. In default mode (BDU= ‘0’) the output register values are updated continuously. If for any
reason it is not sure to read faster than output data rate it is recommended to set BDU bit to
‘1’. In this way the content of output registers is not updated until both MSB and LSB are read
avoiding to read values related to different sample time.

BLE Big Endian, Little Endian 설정
 1 : Big Endian MSB->28h (X-axis), LSB ->29h (X-axis)
 0 : Little Endian

BOOT bit is used to refresh the content of internal registers stored in the flash memory block.
At the device power up the content of the flash memory block is transferred to the internal registers
related to trimming functions to permit a good behavior of the device itself. If for any reason
the content of trimming registers was changed it is sufficient to use this bit to restore
correct values. When BOOT bit is set to ‘1’ the content of internal flash is copied inside corresponding
internal registers and it is used to calibrate the device. These values are factory
trimmed and they are different for every accelerometer. They permit a good behavior of the
device and normally they have not to be changed.
At the end of the boot process the BOOT bit is set again to ‘0’.

IEN bit is used to switch the value present on data-ready pad between Data-ready signal and
Interrupt signal. At power up the Data-ready signal is chosen. It is however necessary to modify

DRDY bit to enable Data-ready signal generation.
DRDY bit is used to enable DataReady pad activation. If DRDY bit is ‘0’ (default value) on DataReady
pad a ‘0’ value is present. If a DataReady signal is desired it is necessary to set to ‘1’
DRDY bit. DataReady signal goes to ‘1’ whenever a new data is available for all the enabled
axes. For example if Z-axis is disabled, DataReady signal goes to ‘1’ when new values are
available for both X and Y axes. DataReady signal comes back to ‘0’ when all the registers
containing values of the enabled axes are read. To be sure not to loose any data coming from
the accelerometer data registers must be read before a new DataReady rising edge is generated.
In this case DataReady signal will have the same frequency of the data rate chosen.

SIM
 SPI모드 설정
 0 : (default value) the 4-wire interface
 1 : 3-wire interface

DAS 12 bit, 16 bit 모드 설정, 최상의 비트는 부호비트 이다.





ECK bit selects whether the clock used in the core comes from internal oscillator or from external
pad OSC_IN. In the latter case internal oscillator is switched off and the pin Pull-Down
is disabled thus reducing power consumption. External clock must be in the range of 1.045
MHz +/- 10% and must have a duty cycle of 50%.
HPDD bit permits to select either filtered or not filtered data to feed the Signal Processing (Direction
Detection) block as described in Figure 10. When HPDD is set to ‘0’ (default mode) the
data used to generate DD interrupt come directly from digital block or temperature compensation
block while if HPDD is set to ‘1’ the interrupt signals are based on High-Pass filtered data.
For additional details about the data flow, please refer to Figure 10.
HPFF bit allows to select between filtered or not filtered data to be processed by the Signal
Processing (WakeUp or FreeFall) block as described in Figure 15. If HPFF is set ‘0’ (default
mode) data used to generate WU or FF interrupt come directly from digital block or temperature
compensation block while if HPFF is set ‘1’ the interrupt signals are based on High-Pass
filtered data. For additional details about the data flow, please refer to Figure 10.
FDS bit decides whether data stored in output registers are High Pass filtered or not. In default
mode (FDS bit set to ‘0’) signal are not filtered while it is possible to access data coming from
HP filter setting FDS bit to ‘1’. For additional details about the data flow, please refer to Figure
10.
CFS<1:0> bit select High-pass filter Cut-off Frequency coefficient. Increasing this number
makes Cut-off Frequency (@-3dB) move to lower values.
The Cut-off Frequency behavior is described by the following equation:
Where HPc = 512, 1024, 2048, 4096 when CFS<1:0>= 00, 01, 10, 11 respectively and ODR
represents the Output Data Rate selectable through the DF1, DF0 bits in CTRL_REG1.
The figure below gives a representation of the possible transfer functions obtained modifying
Output Data Rate and High Pass Filter coefficient (HPc).





가속도센서 출력 데이터
가속도 센서의 출력은 -2(6)g ~ +2(6)g까지 나오며 디지털 값으로 0~11비트(0~2047)까지 표현된다. 비트12 ~ 비트15는 부호를 나타낸다.
예로 1g라면 아래 표와 같이 0x0400(1024) 으로 출력되며, -1g라면 0xFC00 (-1024)로 출력된다.




SPI제어
CS핀이 0일 경우 SPI모드로 동작(1일 경우 I2C모드)
 
- Data Read

bit 0: READ bit. Read일경우 항상 1로 셋팅해야 함.
bit 1: MS bit. When 0 do not increment address, when 1 increment address in multiple reading.
bit 2-7: address AD(5:0). 레시스터의 주소 설정.
bit 8-15: data DO(7:0) (read mode). This is the data that will be read from the device (MSb
first).
bit 16-... : data DO(...-8). Further data in multiple byte reading.




bit 0: WRITE bit. Write동작시 0으로 설정되어야 함.
bit 1: MS bit. When 0 do not increment address, when 1 increment address in multiple writing.
bit 2 -7: address AD(5:0). This is the address field of the indexed register.
bit 8-15: data DI(7:0) (write mode). This is the data that will be written inside the device (MSb
first).
bit 16-... : data DI(...-8). Further data in multiple byte writing.
Posted by nexp

댓글을 달아 주세요

  1. Dennis

    안면도 없는 상태에서 조금 무례합니다만,

    상기 3축 가속도 센서와 관련하여,
    고수님께 간절히 여쭙고 싶은 부분이 있습니다.

    혹시, 가능하시면,
    하기 Mail 주소로 연락주시기 바랍니다.

    dennis.sky@gmail.com

    2008.10.23 15:56 [ ADDR : EDIT/ DEL : REPLY ]
  2. 송광식

    가속도 센서에 2가지 질문 있습니다.

    1. application note(AN2041)에 보면 Table 7.에 FS=2g로 선택 되었을 때의 값들이 보여지는데
    FS=6g로 했을 때 했갈립니다. FS = 6g , Big Endian(BLE=1), DAS =1로 하면 최대 6g는 1_1000_0000_0000_xxxx 이어서 13 bit(17bit)가 되는데 그럼 DAS=1 모드에서 6g를 표현 할 수 없나요?

    2. 화면에 보면 가만둬도 Noise가 끼는 것이 보이는데, 칩안에 내장된 디지털 low pass 필터를 켜도 심한가요?
    심하다면 외부에 디지털 필터를 써서 노이즈를 줄여야 하는데 혹시 사용하시는 필터가 있으신지 궁금합니다. (Ex, only digital low pass filter, low pass fiilter + high pass filter, average filter ...

    2009.02.06 10:07 [ ADDR : EDIT/ DEL : REPLY ]
  3. grumgold

    안녕하세요 위드로봇을 통해서 여기에 오게되었는데...

    저역시 myaccel3lv02로 구현을 할려고 하는데...

    잘않되네요

    혹시 여유가 된다면...

    제 질문 좀 봐주시면 감사하겠습니다.

    밑에 코드는 withrobot에서 제공해주는 avrstudio 버전을 codevision에 맞게 변형했는데

    맞는지 잘모르겠습니다

    참고로 결선은 J1-1 J1-2 => 3.3V
    J1-3 => N.C
    J1-4 => GND

    J2-1 : PB0
    J2-2 : PB1
    J2-3 : PB2
    J2-4 : PB3

    하였습니다

    그리고 결과는

    x 축 => 255
    y 축 => 255
    z 축 => 255
    Who Am I => 0xff로 나오고 있습니다 .

    혹시 뭐가 잘 못되었는지 아시는 분은 확인좀 부탁드리겠습니다



    #include <mega128.h>
    #include <stdio.h>
    #include <math.h>
    #include <spi.h>


    // SPI 통신에 사용되는 핀 설정.
    #define SPI_PORT_DIR_R DDRB
    #define SPI_PORT_R PORTB
    #define SPI_CS_DIR DDRB.0
    #define SPI_CS PORTB.0
    #define SPI_SCLK_DIR DDRB.1
    #define SPI_SCLK PORTB.1
    #define SPI_TX_DIR DDRB.2
    #define SPI_TX PORTB.2
    #define SPI_RX_DIR DDRB.3
    #define SPI_RX PORTB.3


    #define AXIS_X 0
    #define AXIS_Y 1
    #define AXIS_Z 2

    //myAccel3LV02 레지스터 주소 정의
    #define WHO_AM_I (0x000f)
    #define OFFSET_X (0x0016)
    #define OFFSET_Y (0x0017)
    #define OFFSET_Z (0x0018)
    #define GAIN_X (0x0019)
    #define GAIN_Y (0x001a)
    #define GAIN_Z (0x001b)
    #define CTRL_REG1 (0x0020)
    #define CTRL_REG2 (0x0021)
    #define CTRL_REG3 (0x0022)
    #define HP_FILTER RESET (0x0023)
    #define STATUS_REG (0x0027)
    #define OUTX_L (0x0028)
    #define OUTX_H (0x0029)
    #define OUTY_L (0x002a)
    #define OUTY_H (0x002b)
    #define OUTZ_L (0x002c)
    #define OUTZ_H (0x002d)
    #define FF_WU_CFG (0x0030)
    #define FF_WU_SRC (0x0031)
    #define FF_WU_ACK (0x0032)
    #define FF_WU_THS_L (0x0034)
    #define FF_WU_THS_H (0x0035)
    #define FF_WU_DURATION (0x0036)
    #define DD_CFG (0x0038)
    #define DD_SRC (0x0039)
    #define DD_ACK (0x003a)
    #define DD_THSI_L (0x003c)
    #define DD_THSI_H (0x003d)
    #define DD_THSE_L (0x003e)
    #define DD_THSE_H (0x003f)

    // bit mask macro
    #define BM(n) (1 << n)

    void UART_PutCh(char);
    unsigned char UART_GetCh(void);

    void Rs232_init(void)
    {
    UBRR0H=0;
    UBRR0L=103;
    UCSR0A=0x00;
    UCSR0B=0x18;
    UCSR0C=0x06;
    }

    // 1 byte 송신
    void UART_PutCh(char data)
    {
    while ((UCSR0A &0x20)==0x00);
    UDR0=data;
    }
    // 1 byte 수신
    unsigned char UART_GetCh(void)
    {
    while((UCSR0A &0x80)==0x00);
    return UDR0;
    }
    //-----------------------------------------------------------------------------
    #define SPI_CS_ASSERT() SPI_PORT_R &= ~BM(SPI_CS)
    #define SPI_CS_DEASSERT() SPI_PORT_R |= BM(SPI_CS)

    void SPI_Init(void)
    {
    // CS, SCLK, TX - output, RX - input
    SPI_PORT_DIR_R = 0xF7;
    SPI_PORT_R = 0xFF;

    // CS 핀을 high로 설정한다 -> mygyro300SPI의 SPI 모듈 초기화.
    SPI_CS_DEASSERT();

    // SPI enable with master mode, CPOL=1, CPHA=0, clk=Fosc/16=1MHz
    SPCR = 0x59;

    // clk=Fosc/16
    SPSR = 0x00;
    }

    //-----------------------------------------------------------------------------


    //-----------------------------------------------------------------------------
    //myAccel3LV02의 특정 레지스터에서 데이터를 읽어옴
    unsigned char Accel_ReadReg(unsigned char reg)
    {
    unsigned char ret = 0;
    SPI_CS_ASSERT(); // CS를 low로 떨어트려서 SPI 통신 시작.

    SPDR = 0x80|reg; // register address를 송신. Read일 경우 최상의 비트는 High
    while(!(SPSR & 0x80)); // 송신 완료될때까지 대기.
    ret = SPDR; // 수신된 데이터를 저장. 이 데이터는 더미데이터 이다.

    SPDR = 0; // 더미 데이터를 송신.
    while(!(SPSR & 0x80)); // 송신 완료될때까지 대기.
    ret = SPDR; // 수신된 data byte를 저장.

    SPI_CS_DEASSERT(); // CS를 high로 올려주면서 SPI 통신 종료.

    return ret;
    }

    //myAccel3LV02의 특정 레지스터에 데이터를 기록
    void Accel_WriteReg(unsigned char reg, unsigned char data)
    {
    SPI_CS_ASSERT(); // CS를 low로 떨어트려서 SPI 통신 시작.

    SPDR = reg; // register address를 송신.
    while(!(SPSR & 0x80)); // 송신 완료될때까지 대기.

    SPDR = data; // data 송신.
    while(!(SPSR & 0x80)); // 송신 완료될때까지 대기.

    SPI_CS_DEASSERT(); // CS를 high로 올려주면서 SPI 통신 종료.
    }

    //myAccel3LV02의 각축의 가속도 값을 읽어옴
    void GetAccelValue(unsigned char Axis, unsigned short *data)
    {
    unsigned char ret;

    while(1)
    {
    ret = Accel_ReadReg(STATUS_REG);
    if ((ret & 0x8) != 0)break;
    }

    switch(Axis)
    {
    case AXIS_X:

    *data = Accel_ReadReg(OUTX_L);
    *data |= Accel_ReadReg(OUTX_H)<<8;
    break;

    case AXIS_Y:
    *data = Accel_ReadReg(OUTY_L);
    *data |= Accel_ReadReg(OUTY_H)<<8;
    break;

    case AXIS_Z:
    *data = Accel_ReadReg(OUTZ_L);
    *data |= (Accel_ReadReg(OUTZ_H)<<8);
    break;

    default:
    *data = 0;
    break;
    }
    }
    //-----------------------------------------------------------------------------


    //-----------------------------------------------------------------------------
    int main(void)
    {
    char c;
    unsigned short data;

    Rs232_init(); // UART 초기화.
    SPI_Init(); // SPI 모듈 초기화.

    Accel_WriteReg(CTRL_REG1, 0xC7); //myAccel3LV02 초기화 1000.0111 Power on, enable all axis, self test off
    //Accel_WriteReg(CTRL_REG2, 0x80); //6g 로 설정

    while(1)
    {
    c = UART_GetCh(); // PC에서 명령이 들어올 때 까지 대기.
    if (c == 'r') // 수신된 명령이 'r'이면
    {
    GetAccelValue(AXIS_X, &data); // myAccel3LV02에서 X축 값을 읽어온다.

    printf("%d\r\n", 0x0FFF&data);
    }
    else if (c == 'y') // 수신된 명령이 'y'이면
    {
    GetAccelValue(AXIS_Y, &data); // myAccel3LV02에서 X축 값을 읽어온다.

    printf("%d\r\n", 0x0FFF&data);
    }
    else if (c == 'z') // 수신된 명령이 'z'이면
    {
    GetAccelValue(AXIS_Z, &data); // myAccel3LV02에서 X축 값을 읽어온다.

    printf("%d\r\n", 0x0FFF&data);
    }
    else if(c == 't')
    {
    data = Accel_ReadReg(WHO_AM_I); // myAccel3lv02의 ID값을 읽어온다. 0x3A 값이되어야 정상

    printf("WHO_AM_I : 0x%x\r\n", data);
    }
    }
    }
    //-----------------------------------------------------------------------------

    2009.08.01 22:12 [ ADDR : EDIT/ DEL : REPLY ]
  4. 김진석

    죄송합니다만
    제가 이 가속도 센서를 spi통신을 통해
    받아서 초기 설정만 해주고 값을 받았는데
    값의 범위가 -2g ~ 2g 까지 되어 있는데요~ 여기서 adc 값이 0이면 -2g를 뜻하고
    2047이 중력 가속도 0를 뜻하고, 4095 이면 2g를 뜻하는게 맞나요?

    2009.11.14 14:09 [ ADDR : EDIT/ DEL : REPLY ]

[MyProject]/20072007. 2. 10. 00:02

휴대용 헬스케어 장치 개발


 휴대용 헬스케어 장치 개발

     - 회로설계 및 펌웨어 작성
     - 블루투스 통신부 및 호스트 프로그램 작성
     - 맥박계/운동량 측정


  • CPU : TI MSP430F157
  • 디지털/아날로그 회로 설계
  • 펌웨어작성
  • 블루투스 인터페이스 호스트 프로그램 작성



블럭도




테스트 보드

센서는 맥박 측정용 압력센서와 운동량 측정을 위한 2축 가속도 센서(Adxl311)를 사용하였다.



프로토 보드 제작 및 테스트

소형으로 제작하다 보니 테스트는 프로토 보드를 제작해서 각 기능별로 테스트 했다.
MSP430을 이용하여 밧데리로 구동할수 있는 저전력을 구현할 수있었다. 가격 문제로 MSP430F135를 선정하여 구현 하였지만 테스트 중 알고리즘이 많아지고 메모리가 크져서 MSP430F169로 테스트 하였고 최종으로 MSP430F157을 적용하였다.




케이스 작업용


케이스 조립



루투스 모듈 테스트 및 PC호스트 프로그램 작성




호스트용 테스트 프로그램




압력센서 데이터 수집



Posted by nexp

댓글을 달아 주세요