'모터'에 해당되는 글 2건

  1. 스텝모터 드라이버 납땜 완성.. 2009.07.15
  2. Timer 와 PWM 2 2008.07.10
월요일날 빵판에 테스트한거 성공한거..

한번의 실패 (불타버림) 두번째에는 성공...

모듈 완성이다.....




스텝모터 드라이버 회로도.
,

Timer 와 PWM

from HardWare 2008. 7. 10. 23:18


이번에 작성한 소스는 Timer 와 PWM을 이용하여 이용한 두개의 모터를 각각 하나는 점점 약했다가 강하게 .

다른 하는 반대로 점점 강했다가 약하게 진동을 준 실험이다.

이번 실험해서 주의점은.. 저번 램프와 같이 딜레이를 줘서 PWM과 같은 효과 만든다면 시스템 전체가

그 loop에 걸리기때문에  매우 비효율적이다. 그래서 PWM을 사용하면 그때 실행시키는 명령어도

실행하면서 다른 일도 수행가능하다.

PWMGenConfigure(PWM_BASE,PWM_GEN_1,PWM_GEN_MODE_DOWN);  함수의 모드가

UP_DOWN모드 일때 카운터의 zero 값과 Load 값과 Comporator가 일치할경우 그 값을 무시한다.

실험결과 UP_DOWN 모드에서. 주기 400과 폭 397~400까지의 값을 설정할 경우 그 부분에서 모터가 동작하지 않

는 경우가 생겼다.



-_- 주절이 주절이 본인만 알아볼수 있게 ㅡㅡ; 적었는데.. 으흠.. 보는사람이 있을라나?

#include "../../../hw_memmap.h"
#include "../../../hw_types.h"
#include "../../../src/debug.h"
#include "../../../src/interrupt.h"
#include "../../../src/sysctl.h"
#include "../../../src/timer.h"
#include "../../../src/gpio.h"
#include "../rit128x96x4.h"
#include "../../../src/gpio.h"
#include "../../../src/pwm.h"
#include "../../../utils/diag.h"

unsigned long g_ulFlags;
volatile unsigned long ulLoop=0;
volatile unsigned long width=100;
volatile unsigned long width2=100;
volatile unsigned long width3=400;
volatile unsigned long width4=400;

#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif


void
Timer0IntHandler(void)
{


  if(width>51)
   {
    PWMPulseWidthSet(PWM_BASE,PWM_OUT_0,width);
  
    width = width - 50;
   }
   else
   {
    PWMPulseWidthSet(PWM_BASE,PWM_OUT_0,width2);
    width2 = width2 +50;
    if(width2==400)
    {
     width=width2;
     width2 = 100;
    }
   }
 
  if(width3<400)
  {
    PWMPulseWidthSet(PWM_BASE,PWM_OUT_1,width3);
    width3=width3+50;
  }
 
  else
  {
     PWMPulseWidthSet(PWM_BASE,PWM_OUT_1,width4);
    
     width4 = width4 -50;
       
  }
  if(width4==100)
  {
   width3 = width4;
   width4= 400;
  }
   
 
 

 TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
}


int
main(void)
{
 

 extern void Timer0IntHandler(void);
 
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
      SYSCTL_XTAL_8MHZ);

   
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
    GPIOPinTypeGPIOOutput(GPIO_PORTG_BASE, GPIO_PIN_0);
   

   
    TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);
   
    TimerLoadSet(TIMER0_BASE, TIMER_A, 0x007a1200);
   

    // J4 output
      SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);    //PWM 장치 사용가능
      SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);   //GPIO port F 사용가능
      GPIOPinTypePWM(GPIO_PORTF_BASE, GPIO_PIN_0);   // GPIO port F를 PWM 으로 변경
      SysCtlPWMClockSet(SYSCTL_PWMDIV_1);    // PWM의 클럭을 세팅
    
       PWMGenConfigure(PWM_BASE,PWM_GEN_0,PWM_GEN_MODE_DOWN);  //PWM 구성
       PWMGenPeriodSet(PWM_BASE,PWM_GEN_0,400);  // PWM 주기 설정
     
       PWMGenEnable(PWM_BASE,PWM_GEN_0); // PWM generator 사용 가능.
       PWMOutputState(PWM_BASE,PWM_OUT_0_BIT,true); // PWM 출력 상태 활성화
   
      
      
       SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);    
       SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);  
       GPIOPinTypePWM(GPIO_PORTG_BASE, GPIO_PIN_1);  
       SysCtlPWMClockSet(SYSCTL_PWMDIV_1);          
        PWMGenConfigure(PWM_BASE,PWM_GEN_1,PWM_GEN_MODE_DOWN);
        PWMGenPeriodSet(PWM_BASE,PWM_GEN_1,400);  
       
        PWMGenEnable(PWM_BASE,PWM_GEN_1);
        PWMOutputState(PWM_BASE,PWM_OUT_1_BIT,true);
       
   
    TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0IntHandler);
    TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
   

   
   
   
 
    TimerEnable(TIMER0_BASE, TIMER_A);

  
    while(1)
    {
    }
}



 
,