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

楼主: zero99

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

   关闭 [复制链接]

2

主题

535

回帖

0

蝴蝶豆

金牌会员

最后登录
1970-1-1
发表于 2016-11-10 09:57:02 | 显示全部楼层

回帖奖励 +1 ST金币

签到
签到
回复 支持 反对

使用道具 举报

0

主题

2532

回帖

110

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2016-11-10 09:58:44 | 显示全部楼层

回帖奖励 +1 ST金币

※ 签到,签到!
回复 支持 反对

使用道具 举报

31

主题

1951

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-12-4
发表于 2016-11-10 10:01:08 | 显示全部楼层

回帖奖励 +1 ST金币

签到签到
回复 支持 反对

使用道具 举报

31

主题

1951

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-12-4
发表于 2016-11-10 10:01:40 | 显示全部楼层
天天签到
回复 支持 反对

使用道具 举报

1

主题

304

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-9-1
发表于 2016-11-10 10:03:28 | 显示全部楼层

回帖奖励 +1 ST金币

签到QQQ
回复 支持 反对

使用道具 举报

39

主题

934

回帖

45

蝴蝶豆

论坛元老

最后登录
2020-6-18
发表于 2016-11-10 10:16:39 | 显示全部楼层

回帖奖励 +1 ST金币

签到赚金币喽~
回复 支持 反对

使用道具 举报

7

主题

912

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-4
发表于 2016-11-10 10:20:01 | 显示全部楼层

回帖奖励 +1 ST金币

签到签到
回复 支持 反对

使用道具 举报

27

主题

498

回帖

40

蝴蝶豆

论坛元老

最后登录
2020-12-5
发表于 2016-11-10 10:21:33 | 显示全部楼层

回帖奖励 +1 ST金币

两种方案:第一种就时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();       

  }

}

回复 支持 反对

使用道具 举报

1

主题

362

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-9-29
发表于 2016-11-10 10:28:02 | 显示全部楼层

回帖奖励 +1 ST金币

签到签到
回复 支持 反对

使用道具 举报

14

主题

558

回帖

4

蝴蝶豆

金牌会员

最后登录
2020-11-13
发表于 2016-11-10 10:29:19 | 显示全部楼层

回帖奖励 +1 ST金币

签到签到
回复 支持 反对

使用道具 举报

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