野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19109|回复: 14

求stm32库函数版电机编码器测速例程

[复制链接]
发表于 2016-9-11 15:31:15 | 显示全部楼层 |阅读模式
5火花
求stm32库函数版电机编码器测速例程,网上找了一部分大都是寄存器写的,看了还不是太明白,有人用库函数写过么

回复

使用道具 举报

 楼主| 发表于 2016-9-11 18:44:41 | 显示全部楼层
求大神帮助
回复

使用道具 举报

 楼主| 发表于 2016-9-11 18:52:05 | 显示全部楼层
没有人么。
回复

使用道具 举报

发表于 2016-9-11 19:53:48 | 显示全部楼层

  1. /**************************************************************************
  2. 函数功能:把TIM2初始化为编码器接口模式
  3. 入口参数:无
  4. 返回  值:无
  5. **************************************************************************/
  6. void Encoder_Init_TIM2(void)
  7. {
  8.   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  9.   TIM_ICInitTypeDef TIM_ICInitStructure;  
  10.   GPIO_InitTypeDef GPIO_InitStructure;
  11.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定时器2的时钟
  12.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PB端口时钟
  13.        
  14.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;        //端口配置
  15.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  16.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                //根据设定参数初始化GPIOB
  17.   
  18.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  19.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器
  20.   TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值
  21.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频
  22.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIM向上计数  
  23.   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  24.   TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3
  25.   TIM_ICStructInit(&TIM_ICInitStructure);
  26.   TIM_ICInitStructure.TIM_ICFilter = 10;
  27.   TIM_ICInit(TIM2, &TIM_ICInitStructure);
  28.   TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新标志位
  29.   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  30.   //Reset counter
  31.   TIM_SetCounter(TIM2,0);
  32.   TIM_Cmd(TIM2, ENABLE);
  33. }
复制代码

最后使用TIM_GetCounter(TIM2)函数就可以得到脉冲数
回复

使用道具 举报

发表于 2016-9-12 09:37:24 | 显示全部楼层
楼主问题解决  记得整理发帖哦!!!
回复

使用道具 举报

 楼主| 发表于 2016-9-13 10:10:37 | 显示全部楼层
cancore 发表于 2016-9-11 19:53
最后使用TIM_GetCounter(TIM2)函数就可以得到脉冲数

无论什么速度,得到的脉冲数都是0或者1这是为什么
回复

使用道具 举报

发表于 2016-9-13 10:48:20 | 显示全部楼层
fanhuayishi 发表于 2016-9-13 10:10
无论什么速度,得到的脉冲数都是0或者1这是为什么

你这个电平信号和IO匹配吗
回复

使用道具 举报

发表于 2016-9-13 11:27:52 | 显示全部楼层
fanhuayishi 发表于 2016-9-13 10:10
无论什么速度,得到的脉冲数都是0或者1这是为什么

贴上代码分析吧
回复

使用道具 举报

 楼主| 发表于 2016-9-13 15:39:57 | 显示全部楼层
cancore 发表于 2016-9-13 11:27
贴上代码分析吧

这是编码器的配置
  1. void Encoder_Init_TIM4(void)
  2. {
  3.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  4.   TIM_ICInitTypeDef TIM_ICInitStructure;  
  5.   GPIO_InitTypeDef GPIO_InitStructure;
  6.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//ê1Äü¶¨ê±Æ÷4μÄê±Öó
  7.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//ê1ÄüPB¶Ë¿úê±Öó
  8.        
  9.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;        //¶Ë¿úÅäÖÃ
  10.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //¸¡¿Õêäèë
  11.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                              //¸ù¾Yé趨2Îêy3õê¼»ˉGPIOB
  12.   
  13.   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  14.   TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // Ô¤·ÖÆμÆ÷
  15.   TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //é趨¼ÆêyÆ÷×Ô¶ˉÖØ×°Öμ
  16.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//Ñ¡Ôñê±Öó·ÖÆμ£o2»·ÖÆμ
  17.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIMÏòéϼÆêy  
  18.   TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  19.   TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//ê1óñàÂëÆ÷Ä£ê½3
  20.   TIM_ICStructInit(&TIM_ICInitStructure);
  21.   TIM_ICInitStructure.TIM_ICFilter = 10;
  22.   TIM_ICInit(TIM4, &TIM_ICInitStructure);
  23.   TIM_ClearFlag(TIM4, TIM_FLAG_Update);//Çå3yTIMμĸüD±ê־λ
  24.   TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
  25.   TIM_SetCounter(TIM4,0);
  26.   TIM_Cmd(TIM4, ENABLE);
  27. }
复制代码

这是主函数
  1.            while(1)
  2.         {
  3.                 Encoder=TIM_GetCounter(TIM2);
  4.                
  5.                 printf("%d\r\n",Encoder);       
  6.                 delay_ms(500);
  7.         }
复制代码
回复

使用道具 举报

发表于 2016-9-13 16:19:54 | 显示全部楼层
fanhuayishi 发表于 2016-9-13 15:39
这是编码器的配置

这是主函数

你初始化的TIM4,然后读的是TIM2~
回复

使用道具 举报

 楼主| 发表于 2016-9-14 09:47:31 | 显示全部楼层
cancore 发表于 2016-9-13 16:19
你初始化的TIM4,然后读的是TIM2~

改了之后也不对,我这样读取时对的吗?
回复

使用道具 举报

发表于 2016-10-14 15:30:58 | 显示全部楼层
我也遇到这问题,在429TIM3使用编码器,输出值为0或1,使用TIM2就正常了·······
回复

使用道具 举报

发表于 2016-10-14 15:31:27 | 显示全部楼层
有人解答吗?
回复

使用道具 举报

发表于 2016-11-7 00:34:53 | 显示全部楼层

求同问
回复

使用道具 举报

发表于 2018-4-17 16:15:57 | 显示全部楼层
求用霍尔传感器的代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 14:02 , Processed in 0.068645 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表