OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5860|回复: 5

【求助】定时器输出比较模式方面的问题,谢谢!

[复制链接]

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2013-8-22
在线时间
1 小时
发表于 2014-4-10 16:39:04 | 显示全部楼层 |阅读模式
我想用stm32f030定时器输出比较模式实现PWM波,一帧PWM波形的周期是固定的,里面包含8个通道的信号(低电平)输出,我的思路是:计数器1微秒加一次  ARR是固定的  然后就是通过改变CCR1来 达到这种效果  当然高电平是固定的为400微秒  每次CNT 与CCR 比较匹配后 都会翻转电平 并且产生中断来改变CCR的值  然后再这样
可是输出的波形 与所想的完全是两码事情  请大神们与我一起来看看这怎么回事


下面是代码:
uint32_t CONVERTER_CCR = 400;
uint32_t CONVERTER_ARR = 700;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef        TIM_OCInitStructure;


//??????timer3×÷???¨?±?÷????
void  TIM3_Init_OC1(void)
{
        GPIO_InitTypeDef         GPIO_InitStructure;
        NVIC_InitTypeDef         NVIC_InitStructure; 

        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);         
        
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource6,GPIO_AF_1);
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF ;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3 ;
  GPIO_Init(GPIOA,&GPIO_InitStructure);        
        
        NVIC_InitStructure.NVIC_IRQChannel         = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd      = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        TIM_TimeBaseStructure.TIM_Prescaler = 48-1;
        TIM_TimeBaseStructure.TIM_Period    = 22000-1;
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_Timing;
        TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;
        //TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        //TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        //TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
        TIM_OCInitStructure.TIM_Pulse       = CONVERTER_CCR ;
        TIM_OC1Init(TIM3,&TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

        TIM_ITConfig(TIM3,TIM_IT_CC1|TIM_IT_Update,ENABLE);
        TIM_Cmd(TIM3, ENABLE);        
        
}


void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
                {
                        All_counter = 0 ;
                        Channel_counter = 0 ;
                        CONVERTER_CCR = 400 ;
                        TIM_SetCompare1(TIM3,CONVERTER_CCR);
                        TIM_ClearITPendingBit (TIM3,TIM_IT_Update);
                        
    }
        
        if(TIM_GetITStatus(TIM3,TIM_IT_CC1)==SET)
          {
      All_counter++;
                        
      //if(Converter_channelbankFlag==0)
                        // {
                                Converter_Channel1_8();
                  // }
                         
      //if(Converter_channelbankFlag==1)
                        // {
                        //        Converter_Channel9_16();
                   //}
                         
      TIM_SetCompare1(TIM3,CONVERTER_CCR);
                        TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
    }
        
        
                      
}

void  Converter_Channel1_8()
{
  if(All_counter>=15)
          { }
        else if(All_counter%2==1)
               {
                                        Channel_counter++ ;
          //CONVERTER_CCR += Receiver_to_Servo_data.CH[Channel_counter] ;        
          CONVERTER_CCR += 1000 ;                                                
         }
                                else CONVERTER_CCR += 400 ;

}

爱我所爱!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-11 00:08:06 | 显示全部楼层
楼主可以仿真看下,匹配中断是不是有进入?
另外,你的结果是什么样子的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2013-8-22
在线时间
1 小时
 楼主| 发表于 2014-4-11 15:05:28 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
//??????timer3×÷???¨?±?÷????
void  TIM3_Init_OC1(void)
{
GPIO_InitTypeDef         GPIO_InitStructure;
NVIC_InitTypeDef         NVIC_InitStructure; 



RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);


GPIO_PinAFConfig(GPIOA, GPIO_PinSource6,GPIO_AF_1);
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF ;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3 ;
  GPIO_Init(GPIOA,&GPIO_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel         = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd      = ENABLE;
NVIC_Init(&NVIC_InitStructure);


TIM_TimeBaseStructure.TIM_Prescaler = 48-1;       //?????????? ??????  ?¨????????????±?
TIM_TimeBaseStructure.TIM_Period    = 22000-1;
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

  TIM_OCInitStructure.TIM_OCMode       = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OCPolarity   = TIM_OCPolarity_High;
//TIM_OCInitStructure.TIM_OCNPolarity  = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OutputState  = TIM_OutputState_Enable;
//TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
//TIM_OCInitStructure.TIM_OCIdleState  = TIM_OCIdleState_Set;
  //TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse        =400;

TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Disable);
//TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
//TIM_ARRPreloadConfig (TIM3,ENABLE);

TIM_OC1Init(TIM3,&TIM_OCInitStructure);

TIM_ITConfig(TIM3,TIM_IT_CC1|TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3, ENABLE);

}

void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
{
// All_counter = 0 ;
//Channel_counter = 0 ;
//CONVERTER_CCR = 400 ;
// TIM_SetCompare1(TIM3,CONVERTER_CCR);
TIM_ClearITPendingBit (TIM3,TIM_IT_Update);

    }

if(TIM_GetITStatus(TIM3,TIM_IT_CC1)==SET)
  {
      //All_counter++;

      //if(Converter_channelbankFlag==0)
// {
//Converter_Channel1_8();
// CONVERTER_CCR += 1000 ;
  // }
 
      //if(Converter_channelbankFlag==1)
// {
// Converter_Channel9_16();
   //}
 
     // TIM_SetCompare1(TIM3,CONVERTER_CCR);
TIM_ClearITPendingBit(TIM3,TIM_IT_CC1);
    }
              
}




1.   波形是这样的 占空比为50%的波形  高电平为1.38ms  低电平也是1.38ms这样的 ;
2.   而且修改TIM_TimeBaseStructure.TIM_Prescaler = 48-1;      这里面的psc的值 波形是一样的 不改变
爱我所爱!
回复 支持 反对

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2013-8-22
在线时间
1 小时
 楼主| 发表于 2014-4-11 15:53:26 | 显示全部楼层



爱我所爱!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2014-4-11 16:35:33 | 显示全部楼层
还是要仿真解决。
仿真看看寄存器值,到底是不是你设置的那样。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2013-8-22
在线时间
1 小时
 楼主| 发表于 2014-4-11 17:49:59 | 显示全部楼层
原子哥,谢谢啊 ,我知道问题了TIM_TimeBaseStructure.TIM_Prescaler = 48-1;       //?????????? ??????  ?¨????????????±? 
TIM_TimeBaseStructure.TIM_Period    = 22000-1; 
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); 



应该是TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = 48-1;
TIM_TimeBaseStructure.TIM_Period    = 22000 -1 ;                          //CONVERTER_ARR ;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
爱我所爱!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-12 14:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表