[LM3S2965] PWM 제어
Luminary Micro Cortex-M3 LM3S2965 PWM
예제소스코드
pwmgen.zip
PWM초기화 함수
void PwmInit(void)
{
// Enable the peripherals used by this example.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
//
// Set GPIO D0 and D1 as PWM pins. They are used to output the PWM0 and
// PWM1 signals.
//
GPIOPinTypePWM(GPIO_PORTG_BASE, GPIO_PIN_2 | GPIO_PIN_3);
//
// Compute the PWM period based on the system clock.
//
ulPeriod = SysCtlClockGet() / 50000;
//
// Set the PWM period to 50 kHz.
//
PWMGenConfigure(PWM_BASE, PWM_GEN_0, PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);
PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, ulPeriod);
//
// Set PWM0 to a duty cycle of 25% and PWM1 to a duty cycle of 75%.
//
PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, ulPeriod/4);
PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, ulPeriod * 3 / 4);
//
// Enable the PWM0 and PWM1 output signals.
//
PWMOutputState(PWM_BASE, PWM_OUT_0_BIT | PWM_OUT_1_BIT, true);
//
// Enable the PWM generator.
//
PWMGenEnable(PWM_BASE, PWM_GEN_0);
}
PWM출력 함수
void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, unsigned long ulWidth)
{
unsigned long ulGenBase, ulReg;
//
// Check the arguments.
//
ASSERT(ulBase == PWM_BASE);
ASSERT(PWMOutValid(ulPWMOut));
//
// Compute the generator's base address.
//
ulGenBase = PWM_OUT_BADDR(ulBase, ulPWMOut);
//
// If the counter is in up/down count mode, divide the width by two.
//
if(HWREG(ulGenBase + PWM_O_X_CTL) & PWM_X_CTL_MODE)
{
ulWidth /= 2;
}
//
// Get the period.
//
ulReg = HWREG(ulGenBase + PWM_O_X_LOAD);
//
// Make sure the width is not too large.
//
ASSERT(ulWidth < ulReg);
//
// Compute the compare value.
//
ulReg = ulReg - ulWidth;
//
// Write to the appropriate registers.
//
if(PWM_IS_OUTPUT_ODD(ulPWMOut))
{
HWREG(ulGenBase + PWM_O_X_CMPB) = ulReg;
}
else
{
HWREG(ulGenBase + PWM_O_X_CMPA) = ulReg;
}
}
Luminary Micro에서 제공하는 함수는 상당히 복잡하다. 범용으로 사용하기 쉽게 제작하긴 했지만... 쉽다는 장점으로 속도에서는 상당한 문제가 있다.
특히나 모터제어와 같이 PWM출력을 주기적으로 변경해야 하는 루틴이 많을경우 AVR보다 더 느려질 수도 있다.
그래서 PWM 제어 함수를 따로 만들었다.
void PwmSet(unsigned int Speed)
{
HWREG(PWM_OUT_BADDR(PWM_BASE, PWM_OUT_0) + PWM_O_X_CMPA) = PWM_MAX_VALUE - Speed;
}
테스트 동영상