TIM エンコーダ - STM32

TIM エンコーダ - STM32

ここに画像の説明を挿入

エンコーダインターフェース エンコーダインターフェースは
、インクリメンタル(直交)エンコーダの信号を受信し、エンコーダの回転によって生成される直交信号パルスに従ってCNTの自己インクリメントまたは自己デクリメントを自動的に制御し、それによってエンコーダの位置、回転方向、回転を示します。高度
なタイマーと汎用タイマーにはそれぞれエンコーダ インターフェイスがあります 2 つの入力ピンはインプット キャプチャ チャネル 1 とチャネル 2 を流用しています

ここに画像の説明を挿入
方形波の周波数は速度を表します。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
最初のステップは RCC のクロックをオンにし、GPIO とタイマーのクロックをオンにすることです。2 番目のステップは
GPIO を設定することです。ここで、PA6 と PA7 は次のように設定する必要があります入力モードです。3
番目のステップは、タイム ベース ユニットを設定することです。ここでは、通常、プリスケーラには周波数分割を選択しません。自動リロード (通常、最大 65535 まで) は、カウントを実行するための CNT のみが必要です。4 番目のステップは
、入力キャプチャ ユニット; ただし、ここでは入力キャプチャ ユニットにはフィルタと極性しかありません。2 つのパラメータが役に立ちます。
ステップ 5、エンコーダ インターフェイス モードを設定します
。 最後に、TIM_Cmd を呼び出してタイマーを開始します。
ここに画像の説明を挿入

#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

おすすめ

転載: blog.csdn.net/qq_45159887/article/details/130478422