你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2192|回复: 0

STM32-M3的 I2C和TIM PWM的矛盾,求解!

[复制链接]

1

主题

0

回帖

0

蝴蝶豆

新手上路

最后登录
2020-10-31
发表于 2013-6-28 12:57:51 | 显示全部楼层 |阅读模式
 TIM2是产生4路的PWM信号,改变TIM_OCInitStructure.TIM_Pulse的值(CCRx)即改变占空比
G_SetAxis本质是对I2C读写的操作(详细见附件L3GD20_driver.*,sourcecode实际是ST的库代码)。
奇怪的是:如果注释掉下面while中的语句1、2、3(即不操作I2C)或用其它延时、加减乘除等语句替换,运行程序,测得TIM2(PA02)输出的PWM波形如附件1_good.jpg,非常的完美。
           如果不注释掉下面while中的语句1、2、3(即操作I2C),运行程序,测得TIM2(PA02)输出的PWM波形如附件2_error.jpg,波形用示波器看时总跳动(移动),非常糟糕,
不知道为什么?
请知者支招,多谢!
 
main()
{
  .....
  TIM2_Output_PWM_Init();
  .....
 
 while(1)        /* only for test*/
  {      
     Delay_Nms(20);
     G_SetAxis(G_X_ENABLE | G_Y_ENABLE | G_Z_ENABLE);            //-----1     I2C 操作
     G_SetAxis(G_X_ENABLE | G_Y_ENABLE | G_Z_ENABLE);            //-----2
     G_SetAxis(G_X_ENABLE | G_Y_ENABLE | G_Z_ENABLE);            //-----3
 
  }
}
//-------------------------------4路PWM输出----------------------------------------------
void TIM2_Output_PWM_Init(void)
  {   
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
 
    // PA0(T2_CH1)--Motor1; PA1(T2_CH2)--Motor2; PA2(T2_CH3)--Motor3; PA3(T2_CH4)--Motor4
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);                          
   //**************************************************************************
   //     定时器2设置: 720分频,频率50Hz,向上计数
   //**************************************************************************
    TIM_TimeBaseStructure.TIM_Period = 19999;   //20ms
    TIM_TimeBaseStructure.TIM_Prescaler = 71;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    
      // 主定时器T2为 PWM1 模式 
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    
    TIM_OCInitStructure.TIM_Pulse = 100;        //default value, no meaning
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);    
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能的预装载寄存器
    
    TIM_OCInitStructure.TIM_Pulse = 100;        //default value, no meaning
    TIM_OC2Init(TIM2, &TIM_OCInitStructure); 
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能的预装载寄存器
    
    TIM_OCInitStructure.TIM_Pulse = 100;        //default value, no meaning
    TIM_OC3Init(TIM2, &TIM_OCInitStructure); 
    TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能的预装载寄存器
    
    TIM_OCInitStructure.TIM_Pulse = 100;        //default value, no meaning
    TIM_OC4Init(TIM2, &TIM_OCInitStructure); 
    TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能的预装载寄存器
    
    TIM_ARRPreloadConfig(TIM2, ENABLE);
    //使能定时器
    TIM_Cmd(TIM2, ENABLE);
 }



 TIM2是产生4路的PWM信号,改变TIM_OCInitStructure.TIM_Pulse的值(CCRx)即改变占空比
G_SetAxis本质是对I2C读写的操作(详细见附件L3GD20_driver.*,sourcecode实际是ST的库代码)。
奇怪的是:如果注释掉下面while中的语句1、2、3(即不操作I2C)或用其它延时、加减乘除等语句替换,运行程序,测得TIM2(PA02)输出的PWM波形如附件1_good.jpg,非常的完美。
           如果不注释掉下面while中的语句1、2、3(即操作I2C),运行程序,测得TIM2(PA02)输出的PWM波形如附件2_error.jpg,波形用示波器看时总跳动(移动),非常糟糕,
不知道为什么?
谢谢!
main()
{
  .....
  TIM2_Output_PWM_Init();
  .....
 
 while(1)        /* only for test*/
  {      
     G_SetAxis(G_X_ENABLE | G_Y_ENABLE | G_Z_ENABLE);            //-----1     I2C 操作
     G_SetAxis(G_X_ENABLE | G_Y_ENABLE | G_Z_ENABLE);            //-----2
     G_SetAxis(G_X_ENABLE | G_Y_ENABLE | G_Z_ENABLE);            //-----3
 
  }
}
//-------------------------------4路PWM输出----------------------------------------------
void TIM2_Output_PWM_Init(void)
  {   
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure ;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
 
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
 
    // PA0(T2_CH1)--Motor1; PA1(T2_CH2)--Motor2; PA2(T2_CH3)--Motor3; PA3(T2_CH4)--Motor4
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);                          
   //**************************************************************************
   //     定时器2设置: 720分频,频率50Hz,向上计数
   //**************************************************************************
    TIM_TimeBaseStructure.TIM_Period = 19999;   //20ms
    TIM_TimeBaseStructure.TIM_Prescaler = 71;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    
      // 主定时器T2为 PWM1 模式 
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    
    TIM_OCInitStructure.TIM_Pulse = 100;        //default value, no meaning
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);    
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能的预装载寄存器
    
    TIM_OCInitStructure.TIM_Pulse = 100;        //default value, no meaning
    TIM_OC2Init(TIM2, &TIM_OCInitStructure); 
    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能的预装载寄存器
    
    TIM_OCInitStructure.TIM_Pulse = 100;        //default value, no meaning
    TIM_OC3Init(TIM2, &TIM_OCInitStructure); 
    TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能的预装载寄存器
    
    TIM_OCInitStructure.TIM_Pulse = 100;        //default value, no meaning
    TIM_OC4Init(TIM2, &TIM_OCInitStructure); 
    TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);//使能的预装载寄存器
    
    TIM_ARRPreloadConfig(TIM2, ENABLE);
    //使能定时器
    TIM_Cmd(TIM2, ENABLE);
 }



 
2_error.JPG
1_good.jpg
回复

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版