Codificador TIM—STM32

Codificador TIM—STM32

inserte la descripción de la imagen aquí

EncoderInterface La interfaz del codificador
puede recibir la señal del codificador incremental (ortogonal) y controlar automáticamente el autoincremento o autodecremento del CNT de acuerdo con el pulso de señal ortogonal generado por la rotación del codificador, lo que indica la posición del codificador, la dirección de rotación y la rotación. velocidad
Cada temporizador avanzado y temporizador de propósito general tiene una interfaz de codificador Dos pines de entrada tomados del canal de captura de entrada 1 y canal 2

inserte la descripción de la imagen aquí
La frecuencia de la onda cuadrada representa la velocidad.
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
El primer paso es encender el reloj de RCC y encender el reloj de GPIO y el temporizador. El
segundo paso es configurar GPIO. Aquí, PA6 y PA7 deben configurarse como modo de entrada.
El tercer paso es configurar la unidad base de tiempo. Aquí generalmente elegimos ninguna división de frecuencia para el prescaler; recarga automática, generalmente hasta un máximo de 65535, solo necesita un CNT para realizar el conteo. El cuarto paso es configurar
el unidad de captura de entrada, pero aquí la unidad de captura de entrada solo tiene filtros y polaridad Dos parámetros son útiles
Paso 5, configure el modo de interfaz del codificador
Finalmente, llame a TIM_Cmd para iniciar el temporizador
inserte la descripción de la imagen aquí

#include "stm32f10x.h"                  // Device header

void Encorde_Init(void)
{
	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);	
	//第二步
	//设置输出PWM的GPIO端口
		//使能GPIOA的时钟 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//GPIOA模式初始化
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
			
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数 1分频
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数的模式 向上计数
	//频率为1KHz,占空比为50%的PWM波形
	//计数器溢出频率:CK CNT_OV = CKCNT /(ARR + 1)= CK PSC /(PSC + 1)/(ARR +1)
	//配置定时为1s,则CK CNT_OV=1;CKCNT=72MHz=72000000;
	TIM_TimeBaseInitStruct.TIM_Period = 65536 - 1;//周期,ARR自动重装器的值 范围0~65536 设置为最大值,防止溢出
	TIM_TimeBaseInitStruct.TIM_Prescaler = 1 - 1;//PSC预分频器的值 范围0~65536 不分频
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值 高级计数器才有
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
	
	//第四步,配置输入捕获单元。包括滤波器、极性、直连通道还是交又通道、分频器这些参数
	TIM_ICInitTypeDef TIM_ICInitStruct;
	//为了防业结构体中出现不确定值可能会造成的问题;用Structlnit给结构体赋一个初始值
	TIM_ICStructInit(&TIM_ICInitStruct);
	
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道 选择TIM3的通道1
	TIM_ICInitStruct.TIM_ICFilter = 0xF;//用来配置输入捕获的滤波器。数越大滤波效果越好
//	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发 上升沿参数代表的是高低电平极性不反转
	TIM_ICInit(TIM3,&TIM_ICInitStruct);
	//不需要重新定义新的结构体了
	TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;//选择通道 选择TIM3的通道2
	TIM_ICInitStruct.TIM_ICFilter = 0xF;//用来配置输入捕获的滤波器。数越大滤波效果越好
//	TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发 上升沿参数代表的是高低电平极性不反转
	TIM_ICInit(TIM3,&TIM_ICInitStruct);
	
	//第五步,配置编码器接口模式
	//Encoder函数位于ICInit函数的下面
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
	
	//调用TIM_Cmd,启动定时器
	TIM_Cmd(TIM3,ENABLE);
}

//想用这个编码器来测速的话;就可以在固定的闸门时间;读一次CNT,然后把CNT清零
int16_t Encorde_Get(void)
{
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);//读一次CNT
	TIM_SetCounter(TIM3,0);//把CNT清零
	return Temp;
}


#ifndef _ENCORDE_H
#define _ENCORDE_H

void Encorde_Init(void);
int16_t Encorde_Get(void);


#endif

Supongo que te gusta

Origin blog.csdn.net/qq_45159887/article/details/130478422
Recomendado
Clasificación