LM3S8962 ADC 테스트

[TI]/LM3S8962 | 2011.11.14 15:15
Posted by nexp

LM3S8962 ADC 테스트


Sample rate of 500 thousand samples/second

Converter uses an internal 3-V reference



LM3S8962 ADC블록도





LM3S8962 ADC초기화 함수

//ADC Initialize

void AdcInit(void)

{

SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC);      //ADC enable   


//ADCProcessorTrigger()에서 ADC 시작. 프로세서 트리거가 일어날때 작동한다.   

ADCSequenceConfigure(ADC_BASE, 0, ADC_TRIGGER_PROCESSOR, 0);   

//ADC0의 sequence를 구성한다.sequence number 0인 ADC를 single ended mode로 setting   

ADCSequenceStepConfigure(ADC_BASE, 0, 0, ADC_CTL_IE | ADC_CTL_END | ADC_CTL_CH0);   

//ADC를 사용 가능하게 해준다.   

ADCSequenceEnable(ADC_BASE, 0);  

}



LM3S8962 ADC Read 함수

//Read ADC Value

unsigned int AdcRead(unsigned char port)

{

unsigned long cnt;

unsigned long adc_result = 0;

ADCProcessorTrigger(ADC_BASE, 0);   


//sample sequence 가 완료될때 까지 대기한다.   

while(!ADCIntStatus(ADC_BASE, 0, false)){}  

ADCSequenceDataGet(ADC_BASE, port, &adc_result);


return adc_result;

}





LM3S8962 ADC Test 예제 소스코드


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

int main(void)

{

    unsigned long adc_result;

//시스템 초기화

SystemInit();

//LED포트 초기화

Led1Init();

Led1On();


DebugInit(BAUD_115200);

DebugPrint("LM3S8962 EVM ADC Test Program.\r\n");

//ADC 초기화

AdcInit();

while(1)

{

adc_result = AdcRead(0);

                DebugPrint("%ld\r\n", adc_result);

Delay(100);

}

}

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









LM3S8962 Internal Temperature Sensor

SENSO = 2.7 - ((T + 55) / 75)

Luminary Micro Cortex-M3 CAN 통신

[TI]/LuminaryMicro | 2010.06.17 18:05
Posted by nexp
Luminary Micro Cortex-M3 CAN 통신

■ CAN protocol version 2.0 part A/B
■ Bit rates up to 1 Mbps
32 message objects with individual identifier masks
■ Maskable interrupt
■ Disable Automatic Retransmission mode for Time-Triggered CAN (TTCAN) applications
■ Programmable Loopback mode for self-test operation
■ Programmable FIFO mode enables storage of multiple message objects
■ Gluelessly attaches to an external CAN interface through the CANnTX and CANnRX signals

CAN 블록도



CAN 핀맵
Luminary Micro에서 출시되는 Cortex-M3시리즈는 동일한 핀맵을 가지고 있는것 같다. PD0(CANrx), PD1(CANtx)로 할당되어 있다.
아래 그림은 64핀 패키지의 LM3S5732의 핀맵이다. LM3S2965도 동일하지만 100핀이므로 핀번호는 다르다.



CAN 메세지 전송하기
CAN데이터를 전송하려면 먼저 CAN Message Object를 초기화하고 전송해야 한다.
tCANMsgObject g_MsgObjectRx;

//메세지 오브젝트 초기화
void CANConfigureNetwork(void)
{
    //TX용 CAN 메시제 오프젝트 초기화
    g_MsgObjectTx.ulMsgID = 0x02;   //CAN ID
    g_MsgObjectTx.ulMsgIDMask = 0;

    //인터럽트 설정
    g_MsgObjectTx.ulFlags = MSG_OBJ_TX_INT_ENABLE;

    //메세지 크기
    g_MsgObjectTx.ulMsgLen = MAX_CAN_MSG_SIZE;
    //메시지 버퍼 설정
    g_MsgObjectTx.pucMsgData = g_CanTxMsgBuffer;
}

//CAN 메세지 전송
void SendCanMsg(unsigned char MsgId, unsigned char ucEvent, unsigned char Data)
{
    //MsgId : Message Object의 번호(수신측에서는 의미없는 값이다.)
 
    g_MsgObjectTx.pucMsgData[0] = ucEvent;
    g_MsgObjectTx.pucMsgData[1] = Data;

 /*
    //필요에 따라서 설정
    g_MsgObjectTx.pucMsgData[2] = 0;
    g_MsgObjectTx.pucMsgData[3] = 0;
 
    g_MsgObjectTx.pucMsgData[4] = 0;
    g_MsgObjectTx.pucMsgData[5] = 0;
    g_MsgObjectTx.pucMsgData[6] = 0;
    g_MsgObjectTx.pucMsgData[7] = 0;
 */ 
 
    CANMessageSet(CAN0_BASE, MsgId, &g_MsgObjectTx, MSG_OBJ_TYPE_TX);
}



CAN메세지 수신하기
CAN데이터를 전송하려면 먼저 CAN Message Object를 초기화 해야 수신할 수 있다. 수신하고 싶은 ID를 msg.ulMsgID 에 정의 하고 CANMessageSet()함수로 설정 할 수 있다. 물론 message object개수(1~32)만큼 설정 가능하다.

//메세지 오브젝트 초기화
void CANConfigureNetwork(void)
{
 tCANMsgObject msg;

    //수신할 CAN ID
    msg.ulMsgID = 0x02;
    msg.ulMsgIDMask = 0;//0xFF;

    //인터럽트 사용
    msg.ulFlags = MSG_OBJ_RX_INT_ENABLE;

    //수신할 버퍼와 크기
    msg.ulMsgLen = MAX_CAN_MSG_SIZE;
    msg.pucMsgData = g_CanTxMsgBuffer;

    //수신할 message object 초기화 (message object : 1~32)
    CANMessageSet(CAN0_BASE, 1, &msg, MSG_OBJ_TYPE_RX);
}


CAN 인터럽트 핸들러
void CANHandler(void)
{
    unsigned long rx_id_status;

    //CAN 인터럽트의 상태값을 읽어온다
    rx_id_status = CANIntStatus(CAN0_BASE, CAN_INT_STS_CAUSE);
   
     //읽은후 지운다
    CANIntClear(CAN0_BASE, rx_id_status); 
     
 //CAN 인터럽트 처리
 if(rx_id_status)
 {
  //message object 깂을 읽어온다 - 읽어오면 지워진다
  CANMessageGet(CAN0_BASE, rx_id_status, &g_MsgObjectRx, 1);
  
  DebugPrint("[ID%02X %02X:%02x:%02x] : ",
        rx_id_status,    //message object 번호
     g_MsgObjectRx.ulMsgID,  //수신한 CAN ID
     g_MsgObjectRx.ulMsgIDMask,
     g_MsgObjectRx.ulMsgLen 
     );

  //수신한 데이터 출력
  DebugPrint("%02x %02x %02x %02x | %02x %02x %02x %02x\r\n",
    g_MsgObjectRx.pucMsgData[0],
    g_MsgObjectRx.pucMsgData[1],
    g_MsgObjectRx.pucMsgData[2],
    g_MsgObjectRx.pucMsgData[3],
    g_MsgObjectRx.pucMsgData[4],
    g_MsgObjectRx.pucMsgData[5],
    g_MsgObjectRx.pucMsgData[6],
    g_MsgObjectRx.pucMsgData[7]    
    ); 
 }
}


LM3S2965 -> LM3S5732 CAN테스트 결과
message object 번호 1의 내용은 CAN ID 2를 8바이트 수신해서 출력하고 있다.
[ID01 02:00:08] : 01 9d 00 00 | 00 00 00 00
[ID01 02:00:08] : 01 9e 00 00 | 00 00 00 00
[ID01 02:00:08] : 01 9f 00 00 | 00 00 00 00
[ID01 02:00:08] : 01 a0 00 00 | 00 00 00 00

[LM3S5732-SM] USB2CAN 테스트

[TI]/LM3S5xxx | 2009.12.05 16:43
Posted by nexp
[LM3S5732-SM] USB2CAN 테스트


USB 및 CAN통신 기능이 있는 LM3S5732를 이용하여 CAN2USB 테스트를 진행 했다.
모터 제어용으로 만들었던 확장 보드를 이용 하였는데 CAN드라이버가 있고 LM3S2965보드와 호환 쉽게 된다.



USB2CAN 테스트 프로그램
LM3S5732는 USB기능이 있기 때문에 PC와 고속 인터페이스가 쉽다. USB Bulk모드로 통신하도록 프로그램을 작성하였다.



LM3S5732 USB2CAN테스트 동영상
CAN2USB 테스트를 위해 CAN디바이스(LM3S2265)에서 스위치를 누를때 마다 전송되는 CAN 데이터를 LM3S5732 USB인터페이를 이용하여 데이터를 PC로 출력하는 예제를 작성해 보았다.



수정사항
모터 제어 확장보드는 여러가지 테스트에 활용할 수 있도록 제작하였지만 주로 LM3S2965를 타겟으로 제작되었기 때문에 LM3S5732를 사용할때는 약간의 수정 사항이 필요하다. -> 다음 추가 제작시에는  이부분을 반영해야 겠다.
1) SM-Type보드(LM3S5732)를 이용할때 CAN인터페이스를 위해서는 점퍼가 있어야 한다.



2)모터제어 확장보드의 스위치도 연결이 안되어 있으므로 점퍼가 필요하다.
 - 확장보드의 위쪽 스위치(SW7) 을 LM3S5732의 CN11_14P(PC6)으로 연결 하였다.

[LM3S3748 EVM] LuminaryMicro Cortex-M3 USB 테스트



USB OTG기능이 있는 Luminary Micro사의 Cortex-M3 LM3S3748 의 USB기능을 테스트 했다.


PC Host 테스트 프로그램
Visual Studio 2008을 이용하여 데이터 송수신을 테스트 할 수 있는 예제를 작성하였다.



테스트 동영상



[LM3S3748 EVM] USB Host Module




LM3S3748 USB회로 구성시 주의 사항
USB블럭으로 인가되는 전원 포트가 PB1과 공유하도록 되어 있다.
자세하게 보지 않으면 실수 할 수 있는데... PB1/USB0VBUS 핀을 USB전원으로 연결해야 한다.
연결되지 않으면 USB동작을 하지 하지 않는다.
메뉴얼에 블록도로 좀 자세하게 나와 있으면 좋을것 같은데... 아쉬운 부분이다.
[LM3S2965] 모터제어 - PID제어 테스트



Luminary Cortex-M3 LM3S2965 Motor Driver Test보드를 이용하여 PID제어 테스트를 진행했다.

홀센서 엔코더 결선도


테스트 동영상

[LM3S3748 EVM] USB Host Controller 보드 제작



Luminary Micro Cortex-M3 LM3S3748 USB Host Controller 보드를 제작했다. [M-Type EVM] 형태로 제작해 동일 핀맵으로 테스트 가능하도록 했다.



확장 테스트 보드 연결



USB Host테스트

[LM3S2965] QEI 테스트

[TI]/LM3S2xxx | 2009.04.13 08:00
Posted by nexp
[LM3S2965] QEI 테스트


Lunminary Micro QEI특징
Position integrator that tracks the encoder position
Velocity capture using built-in timer
QEISPEED, QEIPOS레지스터가 각각 독립적으로 구동할 수 있다. (QEIPOS는 QEISPEED보다 먼저 Enable해야 함)

인터럽트 소스
- Index pulse
- Velocity-timer expiration
- Direction change
- Quadrature error detection





QEI모듈은   quadrature phase 모드와 clock/direction 모드를 지원한다.
quadrature phase모드
엔코더는 90도 위상을 가진 두개의 2개의 클럭을 생성한다. 각 에지를 이용해 회전 방향을 결정한다.

clock/direction 모드

엔코더는 클럭신호를 생성한다. direction 신호가 엔코더의 방향을 결정한다.
 
QEI Control (QEICTL) 레지스터의 SigMode bit비트로 모드를 설정할 수 있다.
Luminary 제공함수 QEIConfigure 함수로 설정 가능하다.
 
QEIConfigure(QEI0_BASE, QEI_CONFIG_QUADRATURE |QEI_CONFIG_CAPTURE_A, 1000);

QEI Control (QEICTL)
#define QEI_CONFIG_CAPTURE_A    0x00000000  // Count on ChA edges only
#define QEI_CONFIG_CAPTURE_A_B  0x00000008  // Count on ChA and ChB edges
#define QEI_CONFIG_NO_RESET     0x00000000  // Do not reset on index pulse
#define QEI_CONFIG_RESET_IDX    0x00000010  // Reset position on index pulse
#define QEI_CONFIG_QUADRATURE    0x00000000  // ChA and ChB are quadrature
#define QEI_CONFIG_CLOCK_DIR    0x00000004  // ChA and ChB are clock and dir
#define QEI_CONFIG_NO_SWAP      0x00000000  // Do not swap ChA and ChB
#define QEI_CONFIG_SWAP         0x00000002  // Swap ChA and ChB
 
PhA의 에지(혹은 PhA, PhB두 에지)에서 QEIPOS레지스터 값을 업데이트 한다.
PhA후 PhB가 오는 정방향일 경우 QEIPOS값은 증가되고 PhB후 PhA가 오는 역방향일 경우 QEIPOS값은 감소된다.

QEI 타이밍도



QEI 초기화 함수
static void InitQEI(void)
{
   //Set Clock
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI);
   
    // Configure the QEI pins.
    GPIOPinTypeQEI(QEI_PHA_PORT, QEI_PHA_PIN);
    GPIOPinTypeQEI(QEI_PHB_PORT, QEI_PHB_PIN);
    GPIOPinTypeQEI(QEI_IDX_PORT, QEI_IDX_PIN);
 
    // Configure the QEI module.
    QEIConfigure(QEI0_BASE, QEI_CONFIG_QUADRATURE|QEI_CONFIG_CAPTURE_A, 1000);
   
    // Initialize the QEI position to zero.
    QEIPositionSet(QEI0_BASE, 0);
    // Enable the QEI module.
    QEIEnable(QEI0_BASE);
}

QEI POS값 출력
각 Edge마다 1씩 증가 하므로 엔코더 1클릭당 2펄스씩 증가한다.
   pos = QEIPositionGet(QEI0_BASE);
   dir = QEIDirectionGet(QEI0_BASE);
   DebugPrint("pos=%d %ld\r\n", dir, pos);

출력결과
pos=-1 262
pos=-1 266
pos=-1 265
pos=-1 264
pos=-1 264
pos=-1 262


Motor Driver 보드의 LM3S2965 QEI핀맵



QEI1 모듈 사용할때 주의 사항
QEI SysCtlPeripheralEnable() 함수를 호출하지 않으면 홀딩되는 현상이 발생한다. <- QEI인자 확인할것
    //----------------------------------------------------------------------------- 
    //QEI 1 Config

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_QEI1); 
 
    // Configure the QEI pins.
    GPIOPinTypeQEI(QEI1_PHA_PORT, QEI1_PHA_PIN);
    GPIOPinTypeQEI(QEI1_PHB_PORT, QEI1_PHB_PIN);
    GPIOPinTypeQEI(QEI1_IDX_PORT, QEI1_IDX_PIN);
 
    // Configure the QEI module.
    QEIConfigure(QEI1_BASE, QEI_CONFIG_QUADRATURE | QEI_CONFIG_CAPTURE_A, 0xffffffff);//ENCODER_MAX_POS); 
    // Initialize the QEI position to zero.
    QEIPositionSet(QEI1_BASE, 0);
    // Enable the QEI module.
    QEIEnable(QEI1_BASE);
    //----------------------------------------------------------------------------- 

[LM3S608] 센서 테스트 보드 제작

[TI]/LM3S8xx | 2009.03.27 21:56
Posted by nexp
[LM3S608] 센서 테스트 보드 제작



LM3S608 보드를 이용하여 가속도, 자이로등의 각종 센서를 테스트 할수 있는 보드 제작.



3축 가속도 및 자이로 센서 테스트




회로도
LM3S608 Module







[LM3S2965] 모터 드라이버 보드 테스트 - 모터 정역, PWM 테스트



LuminaryMicro사의 LM3S2965를 이용하여 모터 드라이버 보드 제어 테스트를 진행 했다.
드라이버 스펙상 30A까지 가능하다고 하는데.. 부하를 걸어봐야 알겠지만 일단 간단한 모터 제어먼저 시작.


Pinmap

INA1 – PB.4

INB1 – PB.5

PWM1 – PG.2(pwm : 10Khz)


테스트 동영상
PWM 으로 모터 속도 제어 및 정역제어 테스트




Mobie Robot Body Test

")//]]>


[LM3S2965] 모터 드라이버 베이스 보드 제작


Luminary Micro사의 Cortex-M3코어 LM3S2965 보드를 이용한 모터제어 베이스 보드를 제작 했다.
LM3S2965는 2채널 Encoder, PWM 6, ADC, CAN 이터페이스를 내장하여 모터 제어용으로 사용하기 좋아 모터 드라이버 테스트 용으로 만들어 보았다.


Motor Driver 보드의 LM3S2965 QEI핀맵



Motor PWM 핀맵
Motor2 -> PWM2, PB3, PG4
Motor3 -> PWM3, PF5, PF6






블로그 이미지

nexp

카테고리

분류 전체보기 (1560)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (140)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (213)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (129)
[SENSOR] (41)
[DATA] (21)
[FPGA] (32)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)