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

stm32 电机控制低速测速问题  

[复制链接]
chxb1987 提问时间:2016-10-19 09:19 /
“定时器配置为编码器接口模式时,会提供传感器当前位置的相关信息。使用另一个配置为捕获模式的定时器测量两个编码器事件之间的周期,可获得动态信息(速度、加速度和减速度)。”
请问使用这个模式测速时,捕获模式怎么配置啊?还有人配置过啊?
收藏 3 评论32 发布时间:2016-10-19 09:19

举报

32个回答
dear祝子 回答时间:2016-11-10 11:55:30
两种方案:第一种就时STM32每个IO口都用按键中断,你可以牺牲一个定时器,当一个中断过来就计数,等待下一个中断进来后两者的差就得出了一个与速度相关的值,说句实话编码器没用过,我用的是HALL接口。这种方法是比较简单的,
第二种方法就是楼主所说的,定时器里面有hall接口,同时可以捕获定时器的值,还是以HALL为例,配置好后会每60度(电角度)进入中断一次,同事进入后捕获开始,也就是定时器开始计数。计数出来的值就是电机转过60度的时间(电角度)。配置我会截图给你,其实还可以计数跑了多少个PWM周期。在PWM中断里计数。通常他们是这莫做的,应为在FOC中可以简化运算。不知道你的编码器是咋样回事了,但是都应该通用的。
配置如下:
  //GPIO
  GPIO_InitTypeDef  GPIO_InitStructure;
  //Interrupt
  NVIC_InitTypeDef NVIC_InitStructure;
  //Tmer
  TIM_BDTRInitTypeDef  TIM_BDTRInitStructure;           //死区刹车结构体变量定义
  TIM_OCInitTypeDef TIM_OCInitStructure;
  TIM_ICInitTypeDef TIM_ICInitStructure;           //定义结构体变量
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  //---------------------------------TMER3 HALL------------------------------
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_0);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  TIM_DeInit(TIM3);
  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_OCStructInit(&TIM_OCInitStructure);

  TIM_TimeBaseStructure.TIM_Prescaler = 47;                                                                           //TIM基本初始化
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period =65535;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);     

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;            //选择通道1
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入上升沿捕获  
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC ; //配置通道为输入,并映射到哪里
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;       //输入捕获预分频值
  TIM_ICInitStructure.TIM_ICFilter = 10;                      //输入滤波器带宽设置

  TIM_ICInit(TIM3, &TIM_ICInitStructure);                     //输入通道配置

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;         //TIM输出通道初始化
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;            
  TIM_OCInitStructure.TIM_Pulse =65535;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      

  TIM_OC4Init(TIM3,&TIM_OCInitStructure);

  TIM_SelectHallSensor(TIM3,ENABLE);                          //使能TIMx的霍尔传感器接口

  TIM_SelectInputTrigger(TIM3, TIM_TS_TI1F_ED);               //输入触发源选择   

  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);             //从模式选择

  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);//主从模式选择        

  //        TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_OC2Ref );//选择输出触发模式(TRGO端)
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;              //开TIM3中断
  NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  TIM_ITConfig(TIM3, TIM_IT_Trigger|TIM_IT_CC4, ENABLE);   //开定时器中断
  TIM_ClearFlag(TIM3, TIM_FLAG_Trigger);
  TIM_ClearFlag(TIM3, TIM_FLAG_CC4);

  TIM_Cmd(TIM3,ENABLE);


//中断入口。
void TIM3_IRQHandler(void)
{
  if((TIM_GetFlagStatus(TIM3,TIM_FLAG_Trigger)) != RESET )
  {
    TIM_ClearITPendingBit(TIM3, TIM_FLAG_Trigger);
    HallPLLCtrl();        

  }

}

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

dapan100 回答时间:2017-7-25 15:46:53
本帖最后由 dapan100 于 2017-7-25 15:49 编辑
zhanghankui 发表于 2017-7-25 15:44
将TIM2接口的CH1 CH2输入送到TIM3是怎么实现的,还请指教

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3, ENABLE);
        
        TIM_ITRxExternalClockConfig(TIM3, TIM_TS_ITR1);
        TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);        
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);        
        TIM_Cmd(TIM3, ENABLE);
        
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
        
        TIM_SelectHallSensor(TIM2, ENABLE);
        TIM_SelectInputTrigger(TIM2, TIM_TS_TI1F_ED);
        TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
        TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_OC1);
        
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
        TIM_ICInitStructure.TIM_ICFilter = 9;
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_TRC;
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        
        TIM_ICInit(TIM2, &TIM_ICInitStructure);
        
        TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
        
        TIM_Cmd(TIM2, ENABLE);
zfz9232 回答时间:2016-10-19 10:48:30
有这个功能?围观下。
mark0668 回答时间:2016-10-19 11:51:49
强大,关注下
无薪税绵 回答时间:2016-11-10 08:18:59
第二个就是计数模式,
第一个不知道什么叫做“编码器接口模式”。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

peter001 回答时间:2016-11-10 08:32:49
建议你只用一个TIM和编码器完成测速,因为编码器读数变化速度就代表着转速

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

haifeng-388081 回答时间:2016-11-10 08:55:13
围观下,   
z258121131 回答时间:2016-11-10 08:56:25
学习了,强烈围观。
myfocus-2048857 回答时间:2016-11-10 09:06:11
关注中...         
bowei181 回答时间:2016-11-10 09:17:07
先围观      
斜阳 回答时间:2016-11-10 09:27:19
看一下         
ccl123 回答时间:2016-11-10 09:28:05
..................................
zbber 回答时间:2016-11-10 09:44:26
第二个就是计数模式,
wofei1314 回答时间:2016-11-10 10:17:03
不懂帮顶~~
asmhai 回答时间:2016-11-10 10:53:34
每天来签到,支持。
asmhai 回答时间:2016-11-10 11:01:37
用一个TIM,编码器读数变化速度就代表着转速,加上用判断,

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

123下一页

所属标签

相似问题

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