[STM32F1] STM32 TIM1 HALL模式

[复制链接]
10243|12
 楼主| sunismyself 发表于 2014-5-22 16:55 | 显示全部楼层 |阅读模式
参考网上的程序,在使用STM32hall模式过程中,发现,没有霍尔信号变化,也会进入捕获中断,捕获溢出。并且也会进入COM中断。这样正常吗。。。手册上的不是这样写的哈。求解释
K5K3A7N{S][6FTU8R(307A6.jpg
 楼主| sunismyself 发表于 2014-5-22 17:46 | 显示全部楼层
自己顶一下,不是要霍尔信号触发,计数器才工作,开始捕获吗?是不是我理解有问题。为什么没有霍尔信号触发,就直接开始捕获,并且溢出,进入COM中断
 楼主| sunismyself 发表于 2014-5-22 17:48 | 显示全部楼层
本帖最后由 sunismyself 于 2014-5-22 17:49 编辑
  1. void PwmIgbtInit(void)
  2. {
  3.         uint16_t temp = 0;
  4.         uint16_t a = 0;
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA |
  6.                              RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  7.         PwmIgbtGpioInit();
  8.         /* TIM1 Configuration ---------------------------------------------------
  9.         Generates 7 PWM signals with 4 different duty cycles:
  10.         TIM1CLK = 72 MHz, Prescaler = 0, TIM1 counter clock = 72 MHz
  11.         TIM1 frequency = TIM1CLK/(TIM1_Period + 1) = 17.57 KHz
  12.         - TIM1 Channel1 & Channel1N duty cycle = TIM1->CCR1 / (TIM1_Period + 1) = 50%
  13.         - TIM1 Channel2 & Channel2N duty cycle = TIM1->CCR2 / (TIM1_Period + 1) = 37.5%
  14.         - TIM1 Channel3 & Channel3N duty cycle = TIM1->CCR3 / (TIM1_Period + 1) = 25%
  15.         - TIM1 Channel4 duty cycle = TIM1->CCR4 / (TIM1_Period + 1) = 12.5%
  16.         ----------------------------------------------------------------------- */
  17.        
  18.         /* Time Base configuration */
  19.         TIM_TimeBaseStructure.TIM_Prescaler = 4 - 1;
  20.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  21.         TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
  22.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  23.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  24.        
  25.         TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  26.        
  27.         /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  28.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  29.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  30.         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  31.         TIM_OCInitStructure.TIM_Pulse = 1000;
  32.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  33.         TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  34.         TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  35.         TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;
  36.        
  37.         TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  38.        
  39.         TIM_OCInitStructure.TIM_Pulse = 500;
  40.         TIM_OC2Init(TIM1, &TIM_OCInitStructure);
  41.        
  42.         TIM_OCInitStructure.TIM_Pulse = 500;
  43.         TIM_OC3Init(TIM1, &TIM_OCInitStructure);
  44.        
  45. //        TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
  46. //        TIM_OC4Init(TIM1, &TIM_OCInitStructure);
  47.        
  48.        
  49.         TIM1_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  50.         TIM1_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  51.         TIM1_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  52.         TIM1_BDTRInitStructure.TIM_DeadTime = 0xa0;        /* 3.55us */
  53.         TIM1_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  54.         TIM1_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  55.         TIM1_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  56.         TIM_BDTRConfig(TIM1,&TIM1_BDTRInitStructure);

  57.         TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //使能捕获比较寄存器预装载(通道1)
  58.        
  59.         TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);         //使能捕获比较寄存器预装载(通道2)
  60.        
  61.         TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);         //使能捕获比较寄存器预装载(通道3)

  62.         TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);        //输入触发源选择TIM3   

  63.         TIM_CtrlPWMOutputs(TIM1, ENABLE);
  64.         TIM_ClearITPendingBit( TIM1, TIM_IT_COM);
  65.         TIM_ITConfig(TIM1, TIM_IT_COM ,ENABLE);

  66.         /* TIM1 counter enable */
  67.         TIM_Cmd(TIM1, ENABLE);
  68.         /* TIM1 Main Output Enable */
  69.    TIM1->SMCR|=0x0006;        //开TIM1的输入触发       
  70.    TIM1->DIER=0x0040;         //开TIM1的触发中断
  71. //        TIM1->CCER &= ~(1<<9);  //OC3高极性
  72. //        TIM1->CCER &= ~(1<<11);  //OC3N高极性
  73. //
  74. //        TIM1->CCER &= ~(1<<1);  //OC1高极性
  75. //        TIM1->CCER &= ~(1<<3);  //OC1N高极性
  76. //
  77. //        TIM1->CCER &= ~(1<<5);  //OC2高极性
  78. //        TIM1->CCER &= ~(1<<7);  //OC2N高极性
  79. //
  80. //        TIM1->CCR1 = 1000;
  81. //        TIM1->CCR2 = 1000;
  82. //        TIM1->CCR3 = 1000;
  83. //        temp = 500;
  84. //        while(temp)
  85. //        {
  86. //                for(a=50;a>0;a--);
  87. //                temp --;
  88. //        }
  89. }

  90. void BldcHallTimeInit(void)
  91. {
  92.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                           //基本结构体变量定义
  93.         TIM_ICInitTypeDef TIM_ICInitStructure;                      //定义结构体变量
  94.         TIM_OCInitTypeDef  TIM_OCInitStructure;                     //输出结构体变量定义
  95.         BldcGpioInit();   
  96.         TIM_DeInit(TIM3);
  97.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  98.         TIM_TimeBaseStructure.TIM_Prescaler = 71;                                   //TIM基本初始化
  99.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  100.         TIM_TimeBaseStructure.TIM_Period =65535;
  101.         TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  102.         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  103.        
  104.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);     
  105.           
  106.         TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;            //选择通道1
  107.         TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获  
  108.         TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;  //配置通道为输入,并映射到哪里
  109.         TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;       //输入捕获预分频值
  110.         TIM_ICInitStructure.TIM_ICFilter = 10;                      //输入滤波器带宽设置
  111.        
  112.         TIM_ICInit(TIM3, &TIM_ICInitStructure);                     //输入通道配置
  113.        
  114.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                     //TIM输出通道初始化
  115.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;            
  116.         TIM_OCInitStructure.TIM_Pulse =1023;
  117.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  118.        
  119.         TIM_OC2Init(TIM3,&TIM_OCInitStructure);
  120.        
  121.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;                     //TIM输出通道初始化
  122.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;            
  123.         TIM_OCInitStructure.TIM_Pulse =65535;
  124.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      
  125.        
  126.         TIM_OC4Init(TIM3,&TIM_OCInitStructure);
  127.        
  128.         TIM_SelectHallSensor(TIM3,ENABLE);                          //使能TIMx的霍尔传感器接口
  129.         TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED);               //输入触发源选择   
  130.        
  131.         TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);             //从模式选择
  132.        
  133.         TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//主从模式选择        
  134.        
  135.         TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref);       //选择输出触发模式(TRGO端)
  136.        

  137.         TIM_ITConfig(TIM3, TIM_IT_Trigger|TIM_IT_CC4, ENABLE);      //开定时器中断


  138.         TIM_Cmd(TIM3,ENABLE);

  139.    TIM3->CR1|=0x0001;                  //开TIM3
  140.    TIM3->DIER|=0x0050;                  //开TIM3中断  
  141. }

airwill 发表于 2014-5-22 18:06 | 显示全部楼层
理解有问题。
这个地方却是有些让人犯迷糊.
其实这个功能只用 CCR1 触发的. 上一个手册的框图
1.png
看看图上最左边那个 XOR框, 就是 HALL 功能的.

评分

参与人数 1威望 +3 收起 理由
sunismyself + 3

查看全部评分

 楼主| sunismyself 发表于 2014-5-22 19:45 | 显示全部楼层
airwill 发表于 2014-5-22 18:06
理解有问题。
这个地方却是有些让人犯迷糊.
其实这个功能只用 CCR1 触发的. 上一个手册的框图

额,我还是不太明白。那个异或门,是可以让霍尔有变化,则有电平转换。但是,我现在的问题是,为何一直进入捕获中断(在没有霍尔状态变换情况下),进捕获中断结果是计数器溢出,并且也进入了COM中断。麻烦斑竹解答下,谢了:)
20120703 发表于 2014-5-23 08:33 来自手机 | 显示全部楼层
sunismyself 发表于 2014-5-22 19:45
额,我还是不太明白。那个异或门,是可以让霍尔有变化,则有电平转换。但是,我现在的问题是,为何一直进 ...

电路怎么搞的有没有上拉电阻,估计你的是误触发

评分

参与人数 1威望 +1 收起 理由
sunismyself + 1

查看全部评分

 楼主| sunismyself 发表于 2014-5-23 10:56 | 显示全部楼层
20120703 发表于 2014-5-23 08:33
电路怎么搞的有没有上拉电阻,估计你的是误触发

嗯,有上拉电阻的,滤波也加了的
 楼主| sunismyself 发表于 2014-5-23 13:16 | 显示全部楼层
20120703 发表于 2014-5-23 08:33
电路怎么搞的有没有上拉电阻,估计你的是误触发

大哥有没有这段程序,分享下:lol
 楼主| sunismyself 发表于 2014-5-23 22:26 | 显示全部楼层
经过试验,我发现现在我程序的COM中断是OC2REF触发的,但是这个OC2REF暂时是不可控的。还没找到原因。貌似通道2配置了后,就独立的输出。输出就促使COM中断产生。我一直以为是只有捕获才会导致通道2的输出。大伙有经验的讨论下哈
zhengrongfan 发表于 2015-3-16 19:34 | 显示全部楼层
LZ问题搞定了吗?我现在好像也碰到这样的问题,想请教一下你最后是怎么解决的
SkyYe 发表于 2017-4-1 15:02 | 显示全部楼层
LZ问题搞定了吗?
SkyYe 发表于 2017-4-13 18:13 | 显示全部楼层
LZ问题搞定了吗?能否交流下,遇到同样的问题
wyl316063758 发表于 2019-6-30 08:29 | 显示全部楼层
有问题咨询  希望指点    我先做用XOR功能  没有办法读取到电机hall信号   有没有相关例程  hal库的  简单一点的 好学习的   邮箱316063758@qq.com   qq 316063758
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:追求简单的纯粹,放下、放下。

17

主题

113

帖子

2

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