uint8 HalPwmInit(void)
{
P0 = 0;
P0DIR |= (1<<3);//P0_3 Output
//PERCFG &= ~(1<<6);//TIMER1 ALT 1
PERCFG |= (1<<0);//USART0 ALT 2
PERCFG |= (1<<1);//USART1 ALT 2
//APCFG = 0;//P0.0-P0.7 Analog disable
P0SEL |= (1<<3);//selct P0_3 as Peripheral function
P2SEL |= (1<<3);//P2SEL PORT1复用功能优先级设置
//P2DIR &= ~(3<<6); //PORT0复用功能优先级设置,上电复位为0
P2DIR |= (2<<6);//1st priority TIME1 CHL0-1
//P0INP = 0;//P0上下拉
//P2INP &= ~(1<<5);//P0上拉
T1CTL = 2 | (2<<2);//10自动重载计数至T1CC0,10 32分频
T1CCTL0 = 0 | (1<<2) | (0<<3);//CHL0 00 关闭捕获,1 CHL0为比较模式,000set on compare
T1CC0L = 0x20;
T1CC0H = 0x4E;//CC0-20000 CC1-10000 50hz
T1CCTL1 = 0 | (1<<2) | (6<<3);//CHL1 00 关闭捕获,1 CHL0为比较模式,110clear when equal T1CC1
T1CC1L = 0x10;
T1CC1H = 0x27;//CC0-20000 CC1-10000 50hz
CLKCONCMD = CLKCONCMD & 0x80;
while ( (CLKCONSTA & ~0x80) != 0);//Timer时钟32M
T1STAT = 0;
T1CNTL = 0;// Reset timer to 0;
T1CNTH = 0;
//T1CCTL0 |= (1<<6);//使能通道0中断
//TIMIF |= (1<<6);//使能Timer1溢出中断
//IEN0 &= ~(1<<7);//关闭总中断
IEN1 &= ~(1<<1);//关闭Timer1中断
return TRUE;
}
编写PWM修改函数,通过手机APP将发送0-180,作为转角的参数。
程序中 对0-180度进行转换得到T1CC1L/T1CC1H比较寄存器值。
uint8 SetAngle(uint8 angleValue)
{
float val = 0;
if(angleValue > 180)
return FALSE;
val = (2000.0/180)*angleValue + 500;
T1CC1L = (uint16)val & 0xff;
T1CC1H = ((uint16)val >> 8) & 0xff;
return TRUE;
}
在应用层初始化函数SimpleBLEPeripheral_Init末尾调用PWM初始化函数
在特征值改变回调函数里增加PWM修改函数。
下载并运行BLE程序,然后打开手机APP进行连接
接着通过手机修改特征值3对舵机角度进行控制
波形观测:
输入0,舵机转角0,控制波形为0.025%占空比,20ms周期PWM波
控制效果,请看视频
输入2d,舵机转角45,控制波形为0.05%占空比,20ms周期PWM波
控制效果,请看视频
输入2d,舵机转角45,控制波形为0.1%占空比,20ms周期PWM波
控制效果,请看视频
视频演示:
http://v.youku.com/v_show/id_XMzUyMjk5MDU0MA==.html?spm=a2h3j.8428770.3416059.1