(一)定时器TA输出PWM介绍
首先查看下TI的usermanual,支持PWM输出的定时器只有TAx定时器,Timer32是不支持直接PWM输出,所以采用TA输出PWM,首先查看一下他的寄存器和说明:
这里指出使用输出比较来输出PWM波,主要需要注意的就是PWM的频率配置,最大比较计数值,连续模式使能即可
(二)配置PWM输出
在这里我们使用连续模式进行输出比较来输出PWM波,参照TI的driver lib进行直接配置,使用TA0输出一路PWM信号驱动5V舵机MG996R,输出引脚为P2.4,注意SMCLK总线频率是已经配置好为12M,配置PWM的周期为20ms,以一个0.5~2.5ms的高电平方波来控制舵机角度:
(1)初始化定时器:
/* Timer_A PWM Configuration Parameter */
Timer_A_PWMConfig pwmConfig =
{
TIMER_A_CLOCKSOURCE_SMCLK,
TIMER_A_CLOCKSOURCE_DIVIDER_24,//12M / 24 = 500K 1000clk = 0.002s 10000 = 0.02s 0.0015s = 750
10000,//all duty = 20ms
TIMER_A_CAPTURECOMPARE_REGISTER_1,
TIMER_A_OUTPUTMODE_RESET_SET,
750//now duty
};
//TA0 init
void Servo_Timer_Init(void)
{
//配置 TA0 channel_1
GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN4,
GPIO_PRIMARY_MODULE_FUNCTION);
Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig);
}
(2)舵机控制角度:
//TA0 CH1 控制角度
void Servo1_Angle(uint16 x)
{
uint32 ta0ch1val = 0;
//0.0015s = 750
//0.0005s = 250
//0.0025s = 1250
//0.0005s ~ 0.0025s 250 ~ 1250
ta0ch1val = x * 1000 / 180 + 250;
x > 180 ? (x = 180):(x);
Timer_A_setCompareValue(TIMER_A0_BASE,TIMER_A_CAPTURECOMPARE_REGISTER_1,(uint16)ta0ch1val);
}
(三)结语
正常接线后,舵机可以根据函数调用进行运动;