[SENSOR]/기타센서2009. 6. 9. 12:41

[HMC6352] Compass센서 테스트 - MyUSB-Sensor Board

[HMC6352] Compass센서 테스트 - MyUSB-Sensor Board

myCompass 가 myMCU-EXP보드에서는 잘 동작하지만 myUSB에서 정상동작하지 않는 현상이 발생
상당히 오래동안 고생했는데 알고 보니 myUSB의 확장보드쪽 전원 3.3V가 회로적으로 잘못 기입하여 공급이 않되고 있었다.
myUSB의 3.3V를 Main보드와 연결해서 전원해결.
동작은 잘한다.
 
하지만 이상하게 반응속도가 너무 느리다. 값이 변하지 않는것은 아닌데... 업데이트 속도가 상당히 느린 현상 발생
Read시 2개의 데이터를 가져오는데 처음에는 ACK를 보내야 하고 두번째 바이트는 ACK를 보내지 않아야 하한다.




보통 I2C메모리의 Read 타이밍 - ACK는 DATA Low이다.




myCompass.c 의 함수 수정
unsigned int myCompassRead(unsigned char reg)
{
    :
 
 //data = i2c_readNak()<<8;                 // i2c Data Read
 //data |= i2c_readNak();                      // i2c Data Read 
 data = i2c_readAck()<<8;
 data |= i2c_readNak();
 
}
 
 
STM32에서는 ACK를 보내기 위해 아래와 같이 수정
unsigned char i2c_readAck(void)
{
 unsigned char data = 0;
 
    I2C_AcknowledgeConfig(I2C_ID, ENABLE);
    while(1) 
    {
        //Test on EV7 and clear it
        if(I2C_CheckEvent(I2C_ID, I2C_EVENT_MASTER_BYTE_RECEIVED)) 
        {     
            data = I2C_ReceiveData(I2C_ID);
            break;
        }  
    }
    I2C_AcknowledgeConfig(I2C_ID, DISABLE);  
   
    return data;
}
 
unsigned char i2c_readNak(void)
{
 unsigned char data = 0;
    while(1) 
    {
        //Test on EV7 and clear it
        if(I2C_CheckEvent(I2C_ID, I2C_EVENT_MASTER_BYTE_RECEIVED)) 
        {     
            data = I2C_ReceiveData(I2C_ID);
            break;
        }  
    }
  
    return data;
}
Posted by nexp

댓글을 달아 주세요

[INTERFACE]/USB2009. 6. 3. 12:38

[USB HID] 디바이스 드라이버 초기화 않되는 문제 발생


[myUSB-Sensor]
어떤 PC(HP)에서 디바이스 드라이버 초기화 않되는 문제 발생
HID_FindTheHID()함수에서 Create()함수 옵션 설정수정(GENERIC_WRITE만으로 설정) 하니 정상 동작한다.
 
   //Open a handle to the device.
   m_DeviceHandle=CreateFile  (m_detailData->DevicePath,
    GENERIC_WRITE, //GENERIC_READ
    FILE_SHARE_READ|FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    0,
    NULL);
Posted by nexp

댓글을 달아 주세요

[Microchip]/PIC18F2009. 5. 8. 12:19

[PIC18F4x EVM] USB Bulk Transfer테스트시 에러발생

[PIC18F4x EVM] USB Bulk Transfer테스트시 에러발생

2009-05-08 14:56:26 금요일
 
USB로 연결했을때 동작하지 않는 현상 발생
PICkit2로 동작하면 정상동작함
 
PIC18F4455는 5V용이고 4.7V 이하로 공급하면 정상동작하지 않는다. (브라운아웃 리셋 설정의 문제일 수도 있겠다.)
USB로 연결하면 역전압 방지 다이오드 4148을 통해 들어가는데 드롭이 0.7V정도 생겨서 4.3V가 공급되니 정상동작하지 않았다.
그래서 다이오드를 드롭이 적은 MBR0540으로 교체하니 정상 동작한다.
 
Bulk USB 드라이버 설정 완료
Posted by nexp

댓글을 달아 주세요

[SENSOR]/Gyro2009. 5. 7. 12:10

[.IDG500] GyroSensor Y축 에러문제

[.IDG500] GyroSensor Y축 에러문제
MSP430에서 3축 가속도를 측정하기 위해서 외부에 Vdd/2의 Ref신호에 대한 차이값을 측정하는 형태로 진행해야 겠다.
 
LIS344 가속도 센서의 측정범위
Vdd/5 = 3.3/5 = 660mV 로 ADC측정 범위 600mV를 넘어서 3V로 하면 어느정도 될것 같다.
Vdd/5 = 3/5 = 600mV
좀더 여유를 가지려면 2.8/5 = 560mV 로 하면 될것 같다.
 
일단 3V입력으로 테스트 진행해 보자.


[2009-05-07 09:44:28 목요일]
IDG500 Y축 데이터값이 플로팅 된는 현상이 발생하고 있다.



코드의 문제 인지 하드웨어 자체의 특성인지 파악 안되고 있음




->뭔가 문제가 있을때 블로그에 적으면서 정리 하는데... 이렇게 적다보면 문제가 하나씩 해결되는것 같다.
 
센서를 다른 센서로 교체한 결과


아무래도 칩에 문제가 있었던것 같다.
칩의 특성으로 기인한것이던지... 조립할때 문제가 된것인지 알 수 없지만...
지금까지 IDG-500사용하면서 느꼈던것으로는 칩이 좀 불안한 느낌이 든다.
 
백업
MSP430 코드 수정 -> 좀더 심플하게...
Posted by nexp

댓글을 달아 주세요

[MODULE]/MOTOR2009. 3. 26. 12:26

[DC 모터 제어] RDK-BDC Kit 예제 분석

[DC 모터 제어] RDK-BDC Kit 예제 분석



[2009-03-26 11:56:56]
RDK-BDC 데모키트
LM3S2616을 이용한 모터 드라이버 보드이다.



전체 코드는 PWM2 Timer 인터럽트를 이용해서 1ms 로 전체 하드웨어를 제어하고 있다. <- 1ms로 CAN, Swith등을 제어한다. if, switch의 분가 좀 있는데 큰 무리가 없나보다.
ControllerIntHandler(void) 함수가 인터럽트 핸들러이다.
 
인터럽트 핸들러 안에
ControllerSpeedMode()
ControllerPositionMode()
등등 모터 제어를 하고 있다.
 
속도제어
우선 스피드 제어쪽을 보면...
ControllerSpeedMode()
{
        // 엔코더의 속도값을 읽어와서
        lTemp = EncoderVelocityGet();
 
        // 에러값을 구함 -> 목표 속도와 비교한다.
        lTemp = g_lSpeedTarget - lTemp;

        //PID제어기를 돌려 값을 설정한다.
        lTemp = PIDUpdate(&g_sSpeedPID, lTemp) / 256;

        // Limit 설정
        if(lTemp < -32768)
        {
            lTemp = -32768;
        }
        if(lTemp > 32767)
        {
            lTemp = 32767;
        }

        // 새로운 모터 출력값 설정
        g_lVoltage = lTemp;
    }
 
    // 모터 전압 설정 -> PWM출력
    HBridgeVoltageSet(g_lVoltage);
}
 
encoder.c 파일의 속도값 읽어오는 함수
long EncoderVelocityGet(void)
{
    return(MathDiv16x16(SYSCLK * 60, g_ulEncoderClocks * g_ulEncoderLines));
}
 
 
속도는 외부 인터럽트를 이용하여 펄스의 시간을 측정하도록 되어 있다.
 
startup.c 외부 인터럽트 핸들러 설정
    EncoderIntHandler,                      // GPIO Port C
 
EncoderIntHandler()
{
    // Save the time.
    ulNow = ROM_SysTickValueGet();

    // Clear the encoder interrupt.
    ROM_GPIOPinIntClear(QEI_PHA_PORT, QEI_PHA_PIN);

    //이전 타이머 값에서 형재의 타이머 값을 빼서 펄스의 시간을 측정한다.
    if(g_ulEncoderPrevious > ulNow)
    {
        g_ulEncoderClocks = g_ulEncoderPrevious - ulNow;
    }
    else
    {
        g_ulEncoderClocks = (16777216 - ulNow) + g_ulEncoderPrevious;
    }

    //이전값 저장
    g_ulEncoderPrevious = ulNow;
}

코드 자체는 별것 아닌데... 상당히 복잡하게 작성해놨다. 좀더 쉽고 간단하게 프로그램 짜면 쉽게 가져다 쓰기 편할텐데..
"가장 좋은 코드는 가장 쉽게 이해하는 코드다!"라는 말이 생각난다.
Posted by nexp

댓글을 달아 주세요