[STM32F1] TIM4 PWM输出波形不正常

[复制链接]
1621|8
 楼主| wape271 发表于 2019-11-26 15:30 | 显示全部楼层 |阅读模式
PWM周期为20us,间隔两个周期再打开,
在间隔周期内将PWM脉宽设为0(TIM4->CCR1=0;)
关键的几条PWM配置为:
  1. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  2. TIM_ARRPreloadConfig(TIM4,ENABLE);
  3. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  4. TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Disable);

波形如下图,不清楚为什么在一个周期内会有两个高电平,当间隔周期内不加TIM4->CCR1=0;则波形正常,希望得到各位的帮助,谢谢了
微信图片_20191126151935.jpg
 楼主| wape271 发表于 2019-11-26 15:34 | 显示全部楼层
本帖最后由 wape271 于 2019-11-26 15:36 编辑

全部定时器设置如下
 楼主| wape271 发表于 2019-11-26 15:37 | 显示全部楼层
  1. void TIM4_GPIO_Config(void)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStructure;

  4.         /* TIM2 clock enable */
  5.         //PCLK1经过2倍频后作为TIM3的时钟源等于72MHz
  6.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  7.   /* GPIOA and GPIOB clock enable */
  8.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);

  9.   /*GPIOA Configuration: TIM2 channel 1 and 2 as alternate function push-pull */
  10.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  12.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  13.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  14. }

  15. void TIM4_Mode_Config(void)
  16. {
  17.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  18.   TIM_OCInitTypeDef  TIM_OCInitStructure;
  19.         NVIC_InitTypeDef NVIC_InitStructure;
  20.        
  21.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
  22.        
  23.         TIM_DeInit(TIM4);//Use TIM_DeInit () function to set Timer as the default value;
  24.   TIM_TimeBaseStructure.TIM_Prescaler = 1-1;//预分频 To set the prescaler coefficient
  25.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
  26.   TIM_TimeBaseStructure.TIM_Period = Fcount;//
  27.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//
  28.   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//
  29.   TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//
  30.        
  31.         TIM_ARRPreloadConfig(TIM4,ENABLE);                          
  32.   
  33.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  34.   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  35.   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
  36.   TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//不反相输出
  37.   TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  38.   TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  39.   TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  40.                
  41. ////////////////////////////////////////////////////////////////////////////////////
  42.   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  43.   TIM_OCInitStructure.TIM_Pulse = 0;
  44.   TIM_OC1Init(TIM4,&TIM_OCInitStructure);
  45.   TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Disable);
  46.        
  47.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  48.   TIM_OCInitStructure.TIM_Pulse = 0;
  49.   TIM_OC2Init(TIM4,&TIM_OCInitStructure);
  50.   TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Disable);

  51.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  52.   TIM_OCInitStructure.TIM_Pulse = 0;
  53.   TIM_OC3Init(TIM4,&TIM_OCInitStructure);
  54.   TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Disable);

  55.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  56.   TIM_OCInitStructure.TIM_Pulse = 0;        //设置通道4的电平跳变值,输出另外一个占空比的PWM
  57.   TIM_OC4Init(TIM4, &TIM_OCInitStructure);        //使能通道4
  58.   TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Disable);

  59.         TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断
  60.         //中断优先级NVIC设置
  61.         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM4中断
  62.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级0级
  63.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级3级
  64.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  65.         NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

  66.   TIM_Cmd(TIM4,ENABLE);
  67. }
 楼主| wape271 发表于 2019-11-26 15:40 | 显示全部楼层
想实现的功能是定时器4的3路PWM成三相输出,利用PWM定时中断在不同周期内打开或关闭某个PWM
现在只是试了其中一路PWM
香水城 发表于 2019-11-26 16:14 | 显示全部楼层
本帖最后由 香水城 于 2019-11-26 16:15 编辑

你关闭PWM是通过什么方式实现的? 修改CCR寄存器的值吗?
我看你已经关闭了CCR的预装功能,修改CCR的话,可以立即生效的。

怀疑你中断处理太啰嗦,在修改CCR时PWM已经切换到下一个周期了,这样可能导致窄脉冲出来。

也不知你进的是什么定时器事件的中断。
 楼主| wape271 发表于 2019-11-26 16:53 | 显示全部楼层
本帖最后由 wape271 于 2019-11-26 16:59 编辑
香水城 发表于 2019-11-26 16:14
你关闭PWM是通过什么方式实现的? 修改CCR寄存器的值吗?
我看你已经关闭了CCR的预装功能,修改CCR的话,可 ...

关闭PWM是将CCR的值修改为0;
但是从波形上看像是在同一周期内产生的一个窄脉冲,
定时器中断设置为TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );
定时器中断函数为void TIM4_IRQHandler(void)   //20us中断一次
{
static u8 ThreePhase=0;        
        if(TIM4->SR&0X0001)//溢出中断
        {
                TIM4->SR&=~(1<<0);//清除中断标志位
                switch(ThreePhase)
                {
                    case 0:
                    TIM4->CCR1=500;
                    ThreePhase=1;
                    break;
                    case 1:
                    TIM4->CCR1=0;
                    ThreePhase=2;
                    break;
                    case 2:
                    TIM4->CCR1=0;
                    ThreePhase=0;
                    break;
              }
       }
}


评论

PWM与定时中断同为TIM4  发表于 2019-11-26 16:54
labasi 发表于 2019-12-11 13:11 | 显示全部楼层
关闭一部分功能 排除一下问题原因
keaibukelian 发表于 2019-12-11 13:13 | 显示全部楼层
楼主找到问题的原因了吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

166

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部