3200产生pwm
你好,我使用下面的代码产生38kHz的pwm 发现每3个下降沿就会有一个低于38kHz的脉冲存在,
#define TIMER_INTERVAL_RELOAD 2105 #define DUTYCYCLE_GRANULARITY 1052 while(1) { MAP_UtilsDelay(8000); MAP_TimerDisable(TIMERA2_BASE,TIMER_B); MAP_UtilsDelay(80000); MAP_TimerLoadSet(TIMERA2_BASE,TIMER_B,TIMER_INTERVAL_RELOAD);/*TIMER_INTERVAL_RELOAD = 80Mhz/38khz = 2105*/ MAP_TimerMatchSet(TIMERA2_BASE,TIMER_B,DUTYCYCLE_GRANULARITY);/*DUTYCYCLE_GRANULARITY = 1052 占空比50%*/ MAP_TimerEnable(TIMERA2_BASE,TIMER_B); }
下面是我用逻辑分析仪得到的结果:每3组下降沿就会有一个不是38Khz的脉冲存在,请问是我的程序有什么问题吗?
1、参考TI的\examples\CC32xx_PWM的例子进行验证PWM的配置,关于PWM例程中需要注意的几点我列在下面,在你的程序中会不会有CC3200进入低功耗模式的情况?
2、在PWM的例子中需要注意以下几点:
SetupTimerPWMMode()函数中
MAP_TimerControlLevel(ulBase,ulTimer,ucInvert);
//输出高低电平 1=ture-低电平 0=False-高电平
//当LoadSet=MatchSet值时,PWM输出的电平是高电平还是低电平
// 1=ture-低电平 当LoadSet≥MatchSet 时PWM输出低电平 ---Green/Yellow LED
// 当LoadSet<MatchSet 是PWM输出高电平
// 0=False-高电平
// 当LoadSet≥MatchSet 时PWM输出高电平 ---RED LED
// 当LoadSet<MatchSet 是PWM输出低电平
// 修改自己的PWM引脚可以通过以下步骤-(1)先用PinMux-PWM -->PIN_02 for TimerPWM7 GT_PWM07
// (2)通过PWM_OUT7--在TRM中Table 9-1. Available CCP Pins and PWM Outputs/Signals Pins 找到对应的定时器 --- Timer3->Timer B
// (3)配置TIMERA3_BASE TIMER_B TIMER_CFG_SPLIT_PAIR/TIMER_CFG_B_PWM 及默认PWM输出电平 ---测试OK
// 注意:如果PWM_OUT6和PWM_OUT7同时使用的话必须在在最后一个TIMER_B配置中打开TIMER_CFG_A_PWM配置,否则会将TIMER_A的配置清除!
// TIMER_CFG_A_PWM 0x0000000A
// TIMER_CFG_B_PWM 0x00000A00 ---最终的配置如下:
// HWREG(ulBase + TIMER_O_TAMR) = ulConfig & 255; //取低八位
// HWREG(ulBase + TIMER_O_TBMR) = (ulConfig >> 8) & 255; //取低八位的前八位 ---可以加个判断来避免这个问题
SetupTimerPWMMode(TIMERA3_BASE, TIMER_B, (TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_PWM | TIMER_CFG_B_PWM), 1); //保留低八位数据 并配置--TIMER_B --测试OK
在PWM程序中并未使用分频功能,如果使用分频功能注意
// 设置分频,记得一定要修改这个寄存器,这个寄存器包含了比较值的高 8bit,请记住 CC3200 的 PWM 的计数器其实 24bit的。不是 16bit 的。
// 下面给出修改这个寄存器的库函数
// TimerPrescaleMatchSet(ulBase,ulTimer,n);