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

stm32 电机控制低速测速问题  

[复制链接]
chxb1987 提问时间:2016-10-19 09:19 /
阅读主题, 点击返回1楼
收藏 3 评论32 发布时间:2016-10-19 09:19
32个回答
回答时间:2016-11-10 11:24:42
我也想知道,看看有没有高手给解答一下
五哥1 回答时间:2016-11-10 11:31:51
我只能路过看一下
dear祝子 回答时间:2016-11-10 11:54:53
哎呀,回答地方不对!
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

查看全部评分

携手未来 回答时间:2016-11-10 16:19:25
涨知识。
pegasus12 回答时间:2016-11-11 08:58:56
關注中 關注中
初学者0117 回答时间:2016-11-11 17:30:25
编码器应该是个自定义的功能吧  stm32上好像没见到过
nick.liu 回答时间:2016-12-28 13:22:17
dzzwoaizi 发表于 2016-11-10 11:55
两种方案:第一种就时STM32每个IO口都用按键中断,你可以牺牲一个定时器,当一个中断过来就计数,等待下一 ...

楼主问的是编码器模式和捕获模式同时开启,M法测高速,T法测低速,你给他回答霍尔传感。。。。。。。。。。。。
独自远行 回答时间:2017-7-21 14:22:07
关注一下
dapan100 回答时间:2017-7-25 09:11:40
我用了两个定时器实现的,TIM2设成hall模式测脉冲间隔并送出触发信号给tim3,tim3配制成计数模式
zhanghankui 回答时间:2017-7-25 15:44:23
本帖最后由 zhanghankui 于 2017-7-25 15:47 编辑
dapan100 发表于 2017-7-25 09:11
我用了两个定时器实现的,TIM2设成hall模式测脉冲间隔并送出触发信号给tim3,tim3配制成计数模式 ...

将TIM2接口的CH1 CH2输入送到TIM3是怎么实现的,还请指教。如果只是单纯把TI1F_ED送出来不行吧,编码器接口功能计脉冲数要有要有两个脉冲输入才能自动识别方向实现加减
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);
zhanghankui 回答时间:2017-7-25 15:49:23
dapan100 发表于 2017-7-25 15:46
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM3, ENABLE);
       
        TIM_ITRxExternalClock ...

这样TIM3计数怎么识别正反转呢
dapan100 回答时间:2017-7-25 15:51:21
zhanghankui 发表于 2017-7-25 15:49
这样TIM3计数怎么识别正反转呢

这里没用正交解码,如果要识别的只能进中断了
zhanghankui 回答时间:2017-7-25 15:56:04
dapan100 发表于 2017-7-25 15:51
这里没用正交解码,如果要识别的只能进中断了

这样的问题就是送到TIM3的脉冲不能直接拿来累加计数,因为不知道是正向脉冲还是反向脉冲,。
只一个方向转是没问题

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版