[MyProject]/20082009. 11. 6. 04:13

[SensorMat] Wifi로 로드셀 메트릭스 센서 데이터 전송 시스템

[SensorMat] Wifi로 로드셀 메트릭스 센서 데이터 전송 시스템




다수의 12x12의 멤브레인 스위치와 로드셀이 장착된 센서 매트의 데이터를 Wifi로 전송해 주는 DAQ 보드를 제작 제작 했다.


Sensor Board는 센서 수량이 많기 때문에 CAN통신을 이용하여 각 셀의 데이터를 전송하도록 했다. Master 보드는 CAN으로 받은 데이터를 Wifi 또는 USB로 전송한다. 이를 위해 CAN2USB 를 구현 했다.





Master Board

CAN 데이터를 수신하고 수신된 데이터를 WIFI 또는 USB로 전송 해야 한다.

MCU는 USB, CAN을 지원하는 칩으로 선정해야 하는데 처음에 STM32를 사용하려고 했지만 STM32는 CAN과 USB를 동시에 사용 할수 없어 LuminaryMicro사의 LM3S5732 로 선정했다. [LM3S5732-SM] USB2CAN 테스트 참고.




Wifi 모듈은 Wiznet사의 Wifi210을 선정했고 교체를 위해 WiFi 모듈로 제작 했다.




Sensor Board

센서보드는 12x12 의 멤브레인 스위치로 구성되고 무게 측정을 위해 로드셀을 사용 하였다.



무게를 측정하는 로드셀 센서는 24bit ADC중 저렴하고 성능도 좋은 ADS1216 을 이용하여 ADC변환하고 있다.  







Posted by nexp

댓글을 달아 주세요

[MODULE]/AD/DA2008. 11. 18. 09:54

[개발일지] ADS1216 테스트

[개발일지] ADS1216 테스트


로드셀 데이터를 읽어 무게값을 측정하기 위해 SensorMat 프로젝트에 적용한 ADS1216 를 테스트 중이다.


데이터 시트 보고 진행하고 있는데... 정상적으로 동작을 하지 않는다. 

설계전에 데이터시트 꼼꼼히 봐야 하는데...
Vref 는 AVDD를 5V로 입력시 2.5V, 3.3V로 입력시 1.25V까지 가능하다고 한다.



레지스터 읽고 부분은 정상 동작하는것 같다.
반드시 두바이트를 읽어야 하고 두번째 바이트가 의미 있는 값이된다.
이부분이 이상하다. 1바이트만 읽으면 다음 클럭에서 정상 값이 출력된다.

unsigned int ADS1216_ReadReg(unsigned char Reg)
{
    unsigned char h=0, l=0;
   
    ADS1216_CS_ASSERT();

    ADS1216_SPI_READ(0x10|(0x0F&Reg));
    ADS1216_SPI_READ(1);
   
    Delay_us(4);
        
    h = ADS1216_SPI_READ(0);
    l = ADS1216_SPI_READ(0);    
    
    ADS1216_CS_DEASSERT(); 
  
    return l;
}


일단 0~15레지스터 값을 읽어보면 데이터시트의 값과 동일하게 출력되는것을 볼 수 있다.
reg[0]=008E
reg[1]=0001
reg[2]=0000
reg[3]=0000
reg[4]=0000
reg[5]=0000
reg[6]=0000
reg[7]=00FF
reg[8]=0080
reg[9]=0007
reg[10]=0000
reg[11]=0000
reg[12]=0000
reg[13]=0024
reg[14]=0090
reg[15]=0067


계속되는 실험으로 동작은 하긴 하지만 데이터 시트 내용과 좀 다른 부분이 있다.
레지스터 쓰기는 1바이트가 가능하다.
void ADS1216_WriteReg(unsigned char Reg, unsigned int Data)
{
    unsigned char h=0, l=0;
   
    ADS1216_CS_ASSERT();

    ADS1216_SPI_READ(0x50|(0x0F&Reg));
    ADS1216_SPI_READ(0);
   
    Delay_us(4);
   //ADS1216_SPI_READ(Data>>8);
    ADS1216_SPI_READ(Data&0xFF);    
     
    ADS1216_CS_DEASSERT();
}


ADC 데이터값는 이상하게 올라온다.
DRDY를 찍어보니 계속 High가 나온다.  데이터시트를 다시한번 확인해 봐야 할것 같다.



The DRDY output is used as a status signal to indicate when data is ready to be read from the ADS1216. DRDY goes low when new data is available. It is reset high when a read operation from the data register is complete. It also goes high prior to the updating of the output register to indicate when not to read from the device to ensure that a data read is not attempted while the register is being updated.

DSYNC is used to provide for synchronization of the A/D conversion with an external event. Synchronization can be achieved either through the DSYNC pin or the DSYNC command. When the DSYNC pin is used, the filter counter is reset on the falling edge of DSYNC. The modulator is held in reset until DSYNC is taken high. Synchronization occurs on the next rising edge of the system clock after DSYNC is taken high.

/DSYNC 핀이 High 일때 DRDY신호가 출력 된다고 한다. Low이면


한채널에 대해서는 정상 동작 했는데...
채널 바꾸니 좀 이상하다.. 채널 바꾸고 레지스터 값을 읽어보면 이상한 값들이 읽혀진다.
래자스터값 읽거나 쓸때 딜레이값을 주니 정상동작한다. 한바이트씩 읽고 쓰는것이 가능하다.

Ref 변경하고 또 정상적인 값이 들어오지 않아 코드를 살펴보니 Setup레지스터의 값을 잘못 설정했다.
ByteOder을 변경하고 말았네..
//ADS1216_WriteReg(ADS1216_SETUP, 0x8B); 
-> ADS1216_WriteReg(ADS1216_SETUP, 0x8A);

수정 후 정상 동작한다.

0~Vref까지 값이 잘 들어온다.


그런데 채널 변경시 변경 시간이 오래 거리는것 같다.
현재 보드가 없어 테스트를 진행하지 못하는데... 정확한 원인을 파악해 봐야 할것 같다.


Posted by nexp

댓글을 달아 주세요