中级会员
 
- 积分
- 283
- 金钱
- 283
- 注册时间
- 2015-11-12
- 在线时间
- 54 小时
|
10金钱
背景是这样的:
我使用的TIM8,CH3和CH4因要输出频率可调的方波,所以使用了翻转模式配置。
目前情况是这样的(只看通道3):
配置好后因通道输出电平不变化,我加了句 TIM_CtrlPWMOutputs(TIM8, ENABLE);然后就正常产生了方波,可是发现示波器显示的频率与我要求的2KHZ(CCR3的值为 (计数频率/1000)-1)差别很大(示波器显示的才不到100HZ)。我改变CCR3的值让其产生4KHZ的方波时,示波器显示的频率还是上次的值(小与100HZ)。我单步调试时,执行完定时器使能后就直接产生了方波,而不是进入CC中断函数才改变电平状态的。我觉着我的翻转模式未生效啊。使用PWM模式可正常输出匹配频率的方波。
以上情况就是这样,哪位朋友知道忽略了哪个地方么(问题出在用的是高级定时器这里)????????
#if TIMER8_EN
/* TIM8 clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8 | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
PrescalerValue = (u16) (SystemCoreClock / 12000000) - 1;
Channel3Pulse = (12000000/1000)-1;
Channel4Pulse = (12000000/1000)-1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel3 */
/* Channel 1, 2,3 and 4 Configuration in PWM mode */
//TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; //工作与翻转模式,当CCRx的值等于CNT的值时,电平翻转以此产生PWM波
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC3Init(TIM8, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;
TIM_OC4Init(TIM8, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_Pulse = 12;
TIM_OC1Init(TIM8, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Disable);
TIM_OCInitStructure.TIM_Pulse = 10;
TIM_OC2Init(TIM8, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Disable);
//TIM_ClearITPendingBit(TIM3,TIM_IT_CC3|TIM_IT_CC4); //清除中断Pending位,避免使能中断后立即进入中断
Drv_NVIC_IntPrioSet(TIM8_CC_IRQn,TIM8_PRIO);
Drv_NVIC_IRQSet(TIM8_CC_IRQn,&Drv_Time8_IntHandler);
#endif /* TIM8_EN */
#if TIMER2_EN
Drv_Time2_Close();
#endif /* TIM2_EN */
#if TIMER3_EN
Drv_Time3_Close();
#endif /* TIM3_EN */
#if TIMER8_EN
TIM_ITConfig(TIM8,TIM_IT_CC3|TIM_IT_CC4,ENABLE);
/* TIM8 Main Output Enable */
TIM_CtrlPWMOutputs(TIM8, ENABLE);
TIM8->CNT = 0;
/* TIM8 enable counter */
TIM_Cmd(TIM8, ENABLE);
#endif /* TIM8_EN */
|
|