基于树莓派ROSstm32搭载Freertos智能平衡车Day3
前言
PID控制进程前传之正交码盘速度检测
一、正交码盘速度检测
增量式编码器
增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。
注:编码器轴每旋转一圈,A相和B相都发出相同的脉冲个数,但是A相和B相之间存在一个90°(电气角的一周期为360°)的电气角相位差,可以根据这个相位差来判断编码器旋转的方向是正转还是反转,正转时,A相超前B相90°先进行相位输出,反转时,B相超前A相90°先进行相位输出(如下图所示)。把AB两相接入单片机接口既可以获得具体的信息。
STM32编码器接口
1、读取CNT就是编码器输出脉冲的个数
2、当电机正向转动时,CNT向上计数
3、当电机反转时CNT向下计数
4、TIMx_CR1寄存器的DIR位(第4位) 标识了方向
电机1
INC_LEFT_A PE9
INC_LEFT_B PE11
(TIN1-CH1 和 TIN1-CH2)
电机2
INC_RIGHT_A PA0
INC_RIGHT _B PA1
(TIN2-CH1 和 TIN2-CH2
二、Start!
1.定时器配置为编码器模式
定时器配置65535方便强制转为short模式时65535会转为-1,及时判断正反转
检测两路脉冲数精度更高
配置TI1andTI2
2.相应调试打开
时钟晶振RCC,串口
3.测试 Demo
其他部分代码不用我多说了都是CUBMAX基本操作
main.c:
int main(void)
{
/* USER CODE BEGIN 1 */
int encoder_left, encoder_right;
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_TIM1_Init();
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
printf("编码器测速程序\n");
HAL_TIM_Encoder_Start(&htim1,TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_ALL);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
encoder_left = (short)TIM1->CNT ;
encoder_right= - (short)TIM2->CNT ;
printf("encoder_left = %d\n",encoder_left);
printf("encoder_right = %d\n",encoder_right);
TIM1->CNT = 0;
TIM2->CNT = 0;
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}