cube基本配置,外设开启编码器,串口2
可能大家在设置的时候有这个错误
错误:error: #20: identifier "TIM_ICPOLARITY_BOTHEDGE" is undefined
意思是,高级、通用定时器不能用BothEdge,只有基本定时器才能用BothEdge
针对具体的芯片举几个例子:基本都是大同小异
F4系列:
1 /* 编码器初始化及使能编码器模式 */
2 ENCODER_TIMx_Init();
3 HAL_TIM_Encoder_Start(&htimx_Encoder, TIM_CHANNEL_ALL);
1 /* 获取捕获值并计算转速 */
2
3 CaptureNumber = ( int16_t )__HAL_TIM_GET_COUNTER(&htimx_Encoder)+OverflowCount*65535;
4 printf("输入捕获值:%d \n",CaptureNumber);
5 // 4 : 使用定时器编码器接口捕获AB相的上升沿和下降沿,一个脉冲*4.
6 // 11:编码器线数(转速一圈输出脉冲数)
7 // 34:电机减数比,内部电机转动圈数与电机输出轴转动圈数比,即减速齿轮比
8 printf("电机实际转动速度:%0.2f(圈/s)\n",(float)CaptureNumber/4/11/34);
9 __HAL_TIM_SET_COUNTER(&htimx_Encoder,0);
F1系列 输出方向与速度
1 /**
2 * 函数功能: 系统滴答定时器中断回调函数
3 * 输入参数: 无
4 * 返 回 值: 无
5 * 说 明: 每发生一次滴答定时器中断进入该回调函数一次
6 */
7 void HAL_SYSTICK_Callback(void)
8 {
9 static uint32_t count=0;
10 if(start_flag) // 等待脉冲输出后才开始计时
11 {
12 time_count++; // 每1ms自动增一
13 if(time_count==1000) // 1s
14 {
15 /* Get the current direction */
16 uwDirection = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htimx_Encoder);
17 CaptureNumber=__HAL_TIM_GET_COUNTER(&htimx_Encoder);
18
19 printf("当前编码器定时器计数方向:%d\n",uwDirection);
20 printf("输入捕获值:%d\n",CaptureNumber);
21 printf("1s内编码器计数值:%d\n",CaptureNumber>=count?CaptureNumber-count:CaptureNumber+65535-count);
22
23 // 11:编码器线数(转速一圈输出脉冲数)
24 // 34:电机减数比,内部电机转动圈数与电机输出轴转动圈数比,即减速齿轮比
25 printf("电机实际转动速度:%0.2f(圈/s)\n",(float)(CaptureNumber>=count?CaptureNumber-count:CaptureNumber+65535-count)/11/34/2);
26 count=CaptureNumber;
27 time_count=0;
28 }
29 }
30 }
函数应用:
这个函数很好用,在电机控制时使用很多
__HAL_TIM_SET_COUNTER() 可以设置计数初值为需要的值,默认是0
增量式编码器四倍频:
确定编码器是多少线的,假设定时器分频为0; 则定时器计数为390*4 = 1560
中断配置:编码器模式是可以不需要中断的,主要是定时器1和8的配置
注意:这个是我实际遇到的问题,遇到的可以参考
编码器是否是OC(集电极开路)门,接了上拉没有,没有需要接上啦,如果不使用Z信号,需要把外部中断清零的那部分代码去掉
标准库配置可以参考:https://blog.csdn.net/wang328452854/article/details/50579832