目录
Cubemx配置
调试配置
时钟配置
打开定时器的编码器模式
设置自动重装载系数是8191
代码
MotorBoard_Encoder.h
#ifndef __MOTORBOARD_ENCODER_H_
#define __MOTORBOARD_ENCODER_H_
#include "main.h"
typedef struct {
short speed[10];
short speed_sum;
} ENCODER;
extern ENCODER encoder[2];
void MotorBoard_Encoder_Init(void);
unsigned short MotorBoard_Encoder_GetSpeed_0(void);
void MotorBoard_Encoder_SetZero_0(void);
void read_Encoder_0();
unsigned short MotorBoard_Encoder_GetSpeed_1(void);
void MotorBoard_Encoder_SetZero_1(void);
void read_Encoder_1();
#endif
MotorBoard_Encoder.c
#include "MotorBoard_Encoder.h"
#include "stdio.h"
#include "tim.h"
ENCODER encoder[2];
void MotorBoard_Encoder_Init(void){
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
}
unsigned short MotorBoard_Encoder_GetSpeed_0(void){
return __HAL_TIM_GET_COUNTER(&htim2);
}
unsigned short MotorBoard_Encoder_GetSpeed_1(void){
return __HAL_TIM_GET_COUNTER(&htim1);
}
void MotorBoard_Encoder_SetZero_0(void){
__HAL_TIM_SET_COUNTER(&htim2,0);
}
void MotorBoard_Encoder_SetZero_1(void){
__HAL_TIM_SET_COUNTER(&htim1,0);
}
void read_Encoder_0(){
encoder[0].speed[0] = MotorBoard_Encoder_GetSpeed_0()>4096?(MotorBoard_Encoder_GetSpeed_0()-8192):MotorBoard_Encoder_GetSpeed_0();
MotorBoard_Encoder_SetZero_0();
encoder[0].speed_sum=0;
for(int i=0;i<10;i++)
{
encoder[0].speed_sum+=(encoder[0].speed[i])*(10-i);
}
for(int i=0;i<9;i++)
{
encoder[0].speed[9-i]=encoder[0].speed[8-i];
}
}
void read_Encoder_1(){
encoder[1].speed[0] = MotorBoard_Encoder_GetSpeed_1()>4096?(MotorBoard_Encoder_GetSpeed_1()-8192):MotorBoard_Encoder_GetSpeed_1();
MotorBoard_Encoder_SetZero_1();
encoder[1].speed_sum=0;
for(int i=0;i<10;i++)
{
encoder[1].speed_sum+=encoder[1].speed[i]*(10-i);
}
for(int i=0;i<9;i++)
{
encoder[1].speed[9-i]=encoder[1].speed[8-i];
}
}
思路参考:基于STM32F103C6T6的AB相霍尔编码电机的PID转速调节(CubeMx-HAL库)(未完成-持续更新)_stm32f103 如何获得霍尔电机转速-CSDN博客