반응형

이번에 새롭게 분석하고 검토하기 시작한 가속도 센서!

ADI사에서 생산하고 있는 가속도 센서인데, 지금 검토하고 있는 BOSCH의 BMA150, BMA250보다 데이터시트상의 전기적 스펙은 ADI사에서 만든 ADXL346 가속도 센서가 더 우수하게 나오고 있다.

지금 데이터시트까지만 검토를 해보았고, 내일 STM32 MCU 보드에다 Sensor Board에 탑재를 시키거나 와이어를 연결해서 특성 검토 및 비교 분석을 진행해보아야겠다.

이것말고도 자이로 센서도 검토를 해보아야하는데, 얼른 하나씩 하나씩 차근차근 일을 함세~~


반응형
반응형



요즘 지자기 센서를 다량 평가를 하기 위해서, 다수의 핀이 들어가는 커넥터를 알아보는 과정 중에서 괜찮은 소켓을 발견한거 같아서 이렇게 한번 정보를 공유하려고 한다.

지금까지 2.54mm pitch, 2.0mm pitch, 1.27mm pitch, IDE 커넥터 등을 사용해왔는데, 이거보다 더 작고 깔끔하게 다량의 핀들을 모듈화할 수 있는 커넥터를 사용하게 되었다.

아무튼 전자 관련 엔지니어들이여, 열심히 일함세~~~~~ ^^

[1mm Pitch Double Rows Low Profile Board-to-Cable connectors]


반응형
반응형
요즘 다루고 있는 가속도 센서-

원래 우리팀 내부적으로 VTI 가속도 센서를 사용하고 있었는데,

지난 주에 상무님께서 갑자기 던져주신 가속도 센서-


처음에는 I2C Slave Address를 문제를 발견 못해서, 2일이나 까먹었다~ -.-;

진짜 별것도 아닌 문제를 가지고.. ㅜ.ㅜ

(Slave Address : 38h 에서 왼쪽으로 LSB 1bit만큼 Shift 해야한다는... ㅜ.ㅜ 그래서 결국 70h로 하니까 되더구만!)

내가 가지고 있는 STM32 Library 소스에서 다르게 받아 들여야 한다는 것을 체감했다는.. ^^;

아무튼 지금은 뭐,

BMA150 가속도 센서 그 자체의 데이터가 예쁘게 잘 나오고 있어서,

기분좋은 주말을 맞이하며 퇴근을 할 수가 있다는.. ㅋㅋ




다음주에는 Titl 보정을 통해서, 우리가 개발하고 있는 지자기 센서랑 융합하여 6축 센서를 구현해봐야겠다~

지금은 아무것도 모르지만, 하다보면 잘 되겠지??

아무튼 화이팅!!!




p.s. BOSCH BMA150 가속도 센서 데이트시트 첨부!

반응형
반응형

STM32 내부 Flash Memory 는 파일 시스템으로 구현하거나 복잡한 메모리 맵핑을 구현해야하는 관계로,

간단한 메모리 기능을 활용하기 위해 별도로 EEPROM와 같은 외부 메모리를 STM32 보드에 실장을 해서,

메모리 Read / Write 기능을 구현하면 어떨까 해서 개발을 해봤다.

그래서 적용할 외부 메모리를 찾다가, Atmel사의 AT24C128/256 EEPROM 메모리를 사용하였고,

모델명에서 128은 128k bits, 256은 256k bits만큼 메모리에 저장을 할 수 있다는 의미이다.

이 EEPROM을 I2C 데이터 통신 라이브러리를 사용하여 소스 구현을 하였는데, 그 소스는 아래와 같다.


void AT24CXXX_EEPROM_Write(uint8_t Address, uint16_t addr, uint8_t* pBuffer,  uint16_t NumByteToWrite)
{
 /* Send START condition */
 I2C_GenerateSTART(I2C1, ENABLE);

 /* Test on EV5 and clear it */
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

 /* Send slave address for write */
 I2C_Send7bitAddress(I2C1,Address, I2C_Direction_Transmitter);

 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 I2C_SendData(I2C1, addr >> 8);

 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, addr & 0x00FF);

 /* Test on EV6 and clear it */
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, *pBuffer);
 pBuffer++;
 NumByteToWrite--;

 /* While there is data to be written */
 while (NumByteToWrite--)
 {
  while ((I2C_GetLastEvent(I2C1) & 0x04) != 0x04);  /* Poll on BTF */
 
  /* Send the current byte */
  I2C_SendData(I2C1, *pBuffer);

  /* Point to the next byte to be written */
  pBuffer++;
 }
 
 /* Test on EV8_2 and clear it, BTF = TxE = 1, DR and shift registers are empty */
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

 /* Send STOP condition */
 I2C_GenerateSTOP(I2C1, ENABLE);
}

void AT24CXXX_EEPROM_Read(uint8_t Address, uint16_t addr, uint8_t* pBuffer,  uint16_t NumByteToWrite)
{
 __IO uint32_t temp;
  
 /* Send START condition */
 I2C_GenerateSTART(I2C1, ENABLE);

 /* Test on EV5 and clear it */
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

 /* Send slave address for write */
 I2C_Send7bitAddress(I2C1,Address, I2C_Direction_Transmitter);

 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
 I2C_SendData(I2C1, addr >> 8);

 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_SendData(I2C1, addr & 0x00FF);

 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
 I2C_AcknowledgeConfig(I2C1, DISABLE);
 
 /* Send START condition */
 I2C_GenerateSTART(I2C1, ENABLE);

 /* Test on EV5 and clear it */
 while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

 /* Send EEPROM address for read */
 I2C_Send7bitAddress(I2C1,Address, I2C_Direction_Receiver);

 /* Wait until ADDR is set */
 while (!I2C_GetFlagStatus(I2C1, I2C_FLAG_ADDR));

 /* Clear ACK */
 I2C_AcknowledgeConfig(I2C1, DISABLE);
 __disable_irq();

 /* Clear ADDR flag */
 temp = I2C1->SR2;

 /* Program the STOP */
 I2C_GenerateSTOP(I2C1, ENABLE);
 __enable_irq();

 while ((I2C_GetLastEvent(I2C1) & 0x0040) != 0x000040); /* Poll on RxNE */

 /* Read the data */
 *pBuffer = I2C_ReceiveData(I2C1);
    
 /* Make sure that the STOP bit is cleared by Hardware before CR1 write access */
 while ((I2C1->CR1&0x200) == 0x200);

 /* Enable Acknowledgement to be ready for another reception */
 I2C_AcknowledgeConfig(I2C1, ENABLE);
}



I2C 라이브러리는 STM32 공식 라이브러리를 사용하였으니, STM32 홈페이지에서 참조를 하시면 될테다.

찾는 수고를 덜어드리기 위해, 라이브러리를 첨부하였으니 참조하시길 바랍니다!

그리고 AT24C128/256 데이터시트와 함께 첨부를 하니 참조를 하시길 바란다! (데이터시트내 I2C 통신 방법 참조)

궁금하신 사항이 있다면, 댓글을~

invalid-file

AT24C128/256

invalid-file

STM32-M3 / Libraries


반응형

+ Recent posts