stm32 编码器测量电机位置

stm32f103c8t6

原理

小的旋转编码器和平时用的带编码器的电机都是一样的

编码器A相/B相/AB相产生的脉冲,作为时基单元的输入,去驱动时基单元的计数器CNT

cubemx配置

我比较喜欢用A/B向来计数,所以选择了模式1

配置时基单元

时基单元的时钟是编码器来提供的,PSC就是编码器的分频系数,PSC=0,拧一次cnt+1,为1时,宁两次才+1,ARR是周期,如果设置为10,就是cnt=10之后清空,我想设置为100

我们以A相为例:

极性:选择上升沿(只需要设置这个)

选择输入信号的来源

分频:这个信号输入后分频与否

输入滤波器

代码

main.c

  HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1);
  HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_2);
  	  int32_t cnt=0;
	  uint8_t dir;
	  float rotations=0;
	  float distance=0;
	  int32_t cnt_last=0;
	  float speed_w=0;
	  float speed_v=0;
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  //转向
	  dir=__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2);
	  //脉冲计数
	  cnt=(int32_t)__HAL_TIM_GET_COUNTER(&htim2);
	  //转的圈数 脉冲数/分频数*减速比*编码器线数PRR
	  rotations=(float)cnt/(2*30*13);
	  //转过的距离 圈数*周长pai*d
	  distance=rotations*3.1415926*0.065;
	  //角速度 (此刻的计数值-10ms前的计数值)/...得到转数,转数/10ms*1s*60,得到每分钟的转数 rpm
	  speed_w=(float)(cnt-cnt_last)/(2*30*13)* 1000/10*60;
	  //线速度 v=w*pai*d  m/s
	  speed_v=speed_w/60*3.1415926*0.065;
	  
	  //printf("cnt:%d   dir:%d  rot:%.2f  dis:%.2f\r\n",cnt,dir,rotations,distance);
	  printf("w:%.2f,v:%.2f\n\r",speed_w,speed_v);
	  HAL_Delay(10);
	  cnt_last=cnt;
  }

相关函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值