'LM3S2616'에 해당되는 글 3건

  1. 2010.07.27 [LM3S2616 EVM] GLCD(ST7516) 테스트
  2. 2010.07.18 [LM3S2616 EVM] 보드제작
  3. 2009.03.26 [DC 모터 제어] RDK-BDC Kit 예제 분석
[TI]/LM3S2xxx2010. 7. 27. 23:00

[LM3S2616 EVM] GLCD(ST7516) 테스트

[LM3S2616 EVM] GLCD(ST7516) 테스트


LM3S2616을 이용하여 GLCD 모듈을 테스트 하는데 CS핀이 PC3으로 JTAG핀과 공용으로 사용된다.
Lunmiary Micro Cortex-M3는 JTAG핀을 GPIO로 사용할수 있지만 GPIO로 사용할 경우 JTAG을 사용할 수 없기 때문에 JTAG로 개발하거나 디버딩할 때 상당히 힘들다.

특정 핀을 이용해 JTAG모드로 사용할것인지 GPIO로 설정할 것인지를 선택할 수 있도록 하거나 리셋직후 일정 시간후 JTAG모드에서 GPIO모드로 전환하도록 하는 방법이 있겠지만... 아무튼 신경 쓰지 않으면 문제가 있을 수 있다.

시리즈마다 설정이 조금씩 다른것 같다. LM8962에서 잘 사용했던 코드를 LM3S2616보드에 그대로 적용해서 테스트 했는데 잘 안되서 예제 코드를 살펴 보니 아래와 같이 다르게 설정이 되어 있었다. 아무래도 최신 Dust Devil제품이라 좀 다른것 같다.
GPIO_LOCK_KEY_DD 로 설정하니 문제 없이 동작한다.

#define LCD_DAT      BIT4
#define LCD_DAT1()      Sbi(PORTA, LCD_DAT)
#define LCD_DAT0()      Cbi(PORTA, LCD_DAT)

#define LCD_DI      BIT6
#define LCD_RSON()     Sbi(PORTC, LCD_DI) 
#define LCD_RSOFF()     Cbi(PORTC, LCD_DI)

#define LCD_CLK      BIT2
#define LCD_CLKON()     Sbi(PORTA, LCD_CLK)
#define LCD_CLKOFF()     Cbi(PORTA, LCD_CLK)

#define LCD_CS1      BIT3
#define LCD_CS1ON()     Sbi(PORTC, LCD_CS1) 
#define LCD_CS1OFF()    Cbi(PORTC, LCD_CS1)

#define GLCD_PORT_INIT()   SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);\
         SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);\
         SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);\
        HWREG(GPIO_PORTC_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD;\
        HWREG(GPIO_PORTC_BASE + GPIO_O_CR) = 0x08;\
        HWREG(GPIO_PORTC_BASE + GPIO_O_AFSEL) &= 0xf7;\
         GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, BIT2|BIT4);\
         GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, BIT3|BIT6);\
         GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, BIT0|BIT1);


ST7516 Glcd 출력 테스트
Posted by nexp

댓글을 달아 주세요

[TI]/LM3S2xxx2010. 7. 18. 22:09

[LM3S2616 EVM] 보드제작

[LM3S2616 EVM] 보드제작


Luminary Micro Coretex-M3 코어의 LM3S2616 테스트 보드를 제작 했다.
64핀 LQFP패키지의 소형으로 CAN, QEI, PWM 기능으로 모터 제어 하기에 최적화되어 있다. 128k Flash, 16Ram에 저렴한 가격? (3.4$, 1k)으로 소형의 모터용으로 제작해 보았다.




LM3S2616 EVM 확장 테스트 보드

Posted by nexp
TAG LM3S2616

댓글을 달아 주세요

[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

댓글을 달아 주세요