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

【2016.11.10】今日问题:stm32 电机控制低速测速问题    关闭

[复制链接]
zero99 提问时间:2016-11-10 07:09 /
阅读主题, 点击返回1楼
收藏 评论102 发布时间:2016-11-10 07:09
102个回答
shaoziyang 回答时间:2016-11-10 09:45:34
签到            
falcon07@sina.c 回答时间:2016-11-10 09:46:17
签到了!
党国特派员 回答时间:2016-11-10 09:46:55
签到了! 0.png 1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png
三好学生 回答时间:2016-11-10 09:50:37
签到签到了!!
qianfan 回答时间:2016-11-10 09:55:01
shuishou 回答时间:2016-11-10 09:57:02
签到
签到
x5y4z3 回答时间:2016-11-10 09:58:44
※ 签到,签到!
zhangdaijin 回答时间:2016-11-10 10:01:08
签到签到
zhangdaijin 回答时间:2016-11-10 10:01:40
天天签到
笑鸟007 回答时间:2016-11-10 10:03:28
签到QQQ
wofei1314 回答时间:2016-11-10 10:16:39
签到赚金币喽~
JackieLaura 回答时间:2016-11-10 10:20:01
签到签到
dear祝子 回答时间:2016-11-10 10:21:33
两种方案:第一种就时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();       

  }

}

北松 回答时间:2016-11-10 10:28:02
签到签到
chenbourne 回答时间:2016-11-10 10:29:19
签到签到

所属标签

相似问题

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