打印
[STM32F1]

求助 TIM1互补输出PWM波带有未知约1us宽的脉冲

[复制链接]
1930|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Acid|  楼主 | 2014-7-30 16:41 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
新手求助。。
刚开始使用STM32,使用的是STM32F103的板子,现在希望利用TIM1的互补输出功能输出两路互补的SPWM波,用以合成50Hz正弦波波形,控制开关管实现DC逆变。
现在的问题是:SPWM波能够输出了,是20kHz,利用SysTick_Config(3600)配置SysTick,在SysTick中断处理的函数里修改两路输出的CCR值,脉宽也确实在变化,是50Hz,但是在这些波形中基本上都存在着1us宽的一个脉冲,频率是20kHz,具体见后面的图。

第一张图中较窄的那个脉冲就是所说的“未知”脉冲,周期性出现,频率20kHz;

测量这些脉冲的脉宽,是1us;

上面是TIM1的CH1的输出,下面是CH1N,配置了死区时间。这里奇怪的就是CH1中没有这个脉冲但CH1N有,这是CH1输出低电平的情况;

另外一种情况是上面这样:CH1和CH1N都出现了这个脉冲,只是反相,宽度一致,为1us;

还是上上一张图的情况。
计数器采用的是中心对准的模式,CenterAligned1,但这个脉冲出现的位置与SPWM波的中心位置无关,出现位置是随机的。。
代码如下:
void SysTick_Handler(void)
{  
    if(count<200)
   {
           CCR1_Val=CCR1_DATA[count];
           CCR2_Val=CCR2_DATA[count];
   }
   if(count>=200&&count<400)
   {
           CCR1_Val=CCR2_DATA[count-200];
           CCR2_Val=CCR1_DATA[count-200];
   }

   count++;
   if(count>=399)                     //正弦波形取400点,对应占空比
   count=0;
   TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);       
   TIM1_OCInitStructure.TIM_Pulse =CCR1_Val;
   TIM_OC1Init(TIM1, &TIM1_OCInitStructure);

   TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);       
   TIM1_OCInitStructure.TIM_Pulse =CCR2_Val;
   TIM_OC2Init(TIM1, &TIM1_OCInitStructure);
}

以上是SysTick中断的,下面是配置定时器的;
=============================================
void time_ini(void){
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);                    //TIM1 时钟使能

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOE, &GPIO_InitStructure);

  /* TIM1复用功能开启*/
  GPIO_PinRemapConfig(GPIO_FullRemap_TIM1 , ENABLE);       

  /* Time Base configuration */

  TIM1_TimeBaseStructure.TIM_Prescaler = 2;                                               
  TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;               
  TIM1_TimeBaseStructure.TIM_Period =599;                                                            
  TIM1_TimeBaseStructure.TIM_ClockDivision = 0x0;                                       
  TIM1_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
  TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure);                                       

  TIM1_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2 ;                                 
  TIM1_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  TIM1_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM1_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM1_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;                       
  TIM1_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  

  TIM_OC1Init(TIM1, &TIM1_OCInitStructure);
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);


TIM1_OCInitStructure.TIM_Pulse = CCR2_Val;
  TIM_OC2Init(TIM1, &TIM1_OCInitStructure);
  TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);

  TIM_BDTRStructInit(&TIM1_BDTRInitStructure);
  TIM_BDTRConfig(TIM1,&TIM1_BDTRInitStructure);

  TIM_Cmd(TIM1,ENABLE);                                                                                       
  TIM_CtrlPWMOutputs(TIM1,ENABLE);                                               
}



沙发
icecut| | 2014-7-30 16:46 | 只看该作者
去找与代码的对应关系.肯定不是随机的

使用特权

评论回复
板凳
Acid|  楼主 | 2014-7-30 16:54 | 只看该作者
icecut 发表于 2014-7-30 16:46
去找与代码的对应关系.肯定不是随机的

是,我这里用“随机”想要表达的意思是这个脉冲出现的位置不确定。还不能描述它出现的规律。。

使用特权

评论回复
地板
icecut| | 2014-7-30 19:59 | 只看该作者
Acid 发表于 2014-7-30 16:54
是,我这里用“随机”想要表达的意思是这个脉冲出现的位置不确定。还不能描述它出现的规律。。 ...

你可以调整代码,让这个随机变的有规律.注意初始化寄存器方法.确认函数功能是你想要的.

使用特权

评论回复
5
icecut| | 2014-7-30 20:02 | 只看该作者
http://antriver.com/stm32#/src/t ... src/stm32f10x_tim.c
看297行.
你不觉得这个函数太复杂了吗.复杂到不应该在你第一个函数里调用吗?

使用特权

评论回复
6
Acid|  楼主 | 2014-7-30 21:42 | 只看该作者
icecut 发表于 2014-7-30 20:02
http://antriver.com/stm32#/src/template/STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph ...

确实。主要还是对寄存器的操作还比较陌生,我调用那个函数只是为了改变两个比较捕获寄存器的值。照您说的改了,直接对两个寄存器进行赋值操作,问题就解决了。
多谢!

使用特权

评论回复
7
icecut| | 2014-7-30 21:45 | 只看该作者
Acid 发表于 2014-7-30 21:42
确实。主要还是对寄存器的操作还比较陌生,我调用那个函数只是为了改变两个比较捕获寄存器的值。照您说的 ...

用开源的东西,要注意软件素养.
不该调用的调用了.死期就到了....

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝