한번의 실패 (불타버림) 두번째에는 성공...
모듈 완성이다.....
스텝모터 드라이버 회로도.
이번에 작성한 소스는 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)
{
}
}