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

查看: 2235|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版