打印

stm32高级定时器产生互补的占空比不同的波形,但会有毛刺

[复制链接]
4127|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TIM1_TimeBaseStructure.TIM_Prescaler =71;
  TIM1_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM1_TimeBaseStructure.TIM_Period = 1999;
  TIM1_TimeBaseStructure.TIM_ClockDivision = 0x0;
  TIM1_TimeBaseStructure.TIM_RepetitionCounter = 0x0;

  TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure);

  /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  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_Low;
  TIM1_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;         
  TIM1_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM1_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;         
  
  TIM_OC1Init(TIM1,&TIM1_OCInitStructure);



  /* Automatic Output enable, Break, dead time and lock configuration*/
  TIM1_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM1_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM1_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  TIM1_BDTRInitStructure.TIM_DeadTime = 0x75;
  TIM1_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
  TIM1_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM1_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

  TIM_BDTRConfig(TIM1,&TIM1_BDTRInitStructure);

  /* TIM1 counter enable */
  TIM_Cmd(TIM1,DISABLE);

  /* Main Output Enable */
  TIM_CtrlPWMOutputs(TIM1,DISABLE);
  TIM_ARRPreloadConfig(TIM1, ENABLE);
  while(1)
  {
    TIM_Cmd(TIM1,DISABLE);
       
        CCR1_Val=VAL[0];
    TIM1_OCInitStructure.TIM_Pulse = CCR1_Val;
       
        TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
                TIM_Cmd(TIM1,ENABLE);
                TIM_CtrlPWMOutputs(TIM1,ENABLE);
                   Delay(2);
        TIM_Cmd(TIM1,DISABLE);

        CCR1_Val=VAL[1];
    TIM1_OCInitStructure.TIM_Pulse = CCR1_Val;
        TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
        TIM_Cmd(TIM1,ENABLE);
        TIM_CtrlPWMOutputs(TIM1,ENABLE);
          Delay(2);
        TIM_Cmd(TIM1,DISABLE);

        CCR1_Val=VAL[2];
    TIM1_OCInitStructure.TIM_Pulse = CCR1_Val;
        TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
        TIM_Cmd(TIM1,ENABLE);
        TIM_CtrlPWMOutputs(TIM1,ENABLE);
          Delay(2);
        TIM_Cmd(TIM1,DISABLE);
       
        CCR1_Val=VAL[3];
    TIM1_OCInitStructure.TIM_Pulse = CCR1_Val;
        TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
        TIM_Cmd(TIM1,ENABLE);
        TIM_CtrlPWMOutputs(TIM1,ENABLE);
          Delay(2);
        TIM_Cmd(TIM1,DISABLE);
               
        CCR1_Val=VAL[4];
    TIM1_OCInitStructure.TIM_Pulse = CCR1_Val;
        TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
        TIM_Cmd(TIM1,ENABLE);
        TIM_CtrlPWMOutputs(TIM1,ENABLE);
          Delay(2);
        TIM_Cmd(TIM1,DISABLE);
   

  }   
u16 VAL[5]={500,800,1000,1500,1600};
沙发
airwill| | 2011-11-2 16:07 | 只看该作者
不知道你这么毛刺是什么样子的? 能不能描述清楚一些, 正常情况不是应该的.

使用特权

评论回复
板凳
香水城| | 2011-11-2 16:29 | 只看该作者
什么样的毛刺?在哪里?什么时候出现?

使用特权

评论回复
地板
xiongxingzhi|  楼主 | 2011-11-3 09:58 | 只看该作者
就是在运行完第一个数组,delay(2)后,运行下一数组之前会有一个小毛刺,每次都在两个连接处有毛刺 2# airwill

使用特权

评论回复
5
xiongxingzhi|  楼主 | 2011-11-3 10:00 | 只看该作者
3# 香水城
就是在运行完第一个数组,delay(2)后,运行下一数组之前会有一个小毛刺,每次都在两个连接处有毛刺 2# airwill

使用特权

评论回复
6
xiongxingzhi|  楼主 | 2011-11-3 10:01 | 只看该作者
[/img][/url][img][/img]

QQ截图20111103102023.png (3.48 KB )

QQ截图20111103102023.png

使用特权

评论回复
7
xiongxingzhi|  楼主 | 2011-11-3 10:01 | 只看该作者

使用特权

评论回复
8
xiongxingzhi|  楼主 | 2011-11-3 10:03 | 只看该作者
5# xiongxingzhi
上面第二个波形粗的那一小段,下面的那个图我放大之后出现的一个毛刺。。。。

使用特权

评论回复
9
airwill| | 2011-11-3 10:17 | 只看该作者
抱歉, 没有细看你的程序, 看样子是 TIM_Cmd(TIM1,DISABLE); 导致的.
要想 PWM 正常工作, 不能中途关闭定时器.
其实后面, 你只要 TIM1->CCR1 = CCR1_Val;  就行了.  
不需要
TIM1_OCInitStructure.TIM_Pulse = CCR1_Val;
        
        TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
                TIM_Cmd(TIM1,ENABLE);
                TIM_CtrlPWMOutputs(TIM1,ENABLE);

另外, 你用 delay(2) 方式来等待更换 CCR 的时间也不好.
可以使用 CCR 影子锁存特性. 这样当你改变了 CCR 寄存器, 会等发生更新事件后, 你写于 CCR 寄存器的值才真正起作用.

使用特权

评论回复
10
lost1421| | 2011-11-3 11:10 | 只看该作者
这是什么型号的示波器,竟然抓到的信号这么工整?连毛刺都这么方方正正!

使用特权

评论回复
11
suse-lj| | 2011-11-3 11:49 | 只看该作者
:lol  应该是自己画得吧

使用特权

评论回复
12
airwill| | 2011-11-3 12:22 | 只看该作者
To:上面两楼  
这是软件仿真里的波形

使用特权

评论回复
13
xiongxingzhi|  楼主 | 2011-11-3 14:07 | 只看该作者
12# airwill

使用特权

评论回复
14
xiongxingzhi|  楼主 | 2011-11-3 14:07 | 只看该作者
12# airwill
不胜感激,经过你的修改不出现那种问题了,但我用的是delay。你说的那种CCR影子锁存的特性怎么在代码上用?

使用特权

评论回复
15
airwill| | 2011-11-3 14:30 | 只看该作者
关于CCR影子锁存的特性, 我建议你好好地看看数据手册吧.

使用特权

评论回复
16
xiongxingzhi|  楼主 | 2011-11-3 14:57 | 只看该作者
16# airwill
ok,谢谢你。。。。

使用特权

评论回复
17
香水城| | 2011-11-3 21:04 | 只看该作者
呵呵,LZ的分数应该给到9楼而不是2楼,好在都是同一个人,:kiss:

使用特权

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

本版积分规则

0

主题

12

帖子

1

粉丝