STM32 编码器接口测速

对于使用STM32微控制器来进行编码器接口测速,您可以使用定时器和输入捕获功能来实现。您可以配置一个定时器作为编码器输入的计数器,然后使用输入捕获功能来捕获编码器的计数脉冲。通过测量计数脉冲的时间间隔,您可以计算出编码器的速度。

主要步骤如下:

1.打开时钟
2.配置GPIO TIM3
3.配置时基单元
4.配置输入捕获单元
5.配置编码器接口模式

6.启动定时器
7.开启时钟   

主要的函数包括Time.c和Encode.c

Time.c源代码如下:

#include "stm32f10x.h"                  // Device header
  
  //要用主函数的num变量就在变量前面声明  
void Timer_Init(void)
{
	//第一步打开RCC时钟  注意TIM2是APB1的外设
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//第二步设置时基单元的时钟
	TIM_InternalClockConfig(TIM2);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef  TimeStructure;
	TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;//1分频
	TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	//1S(1HZ)的列子为:ARR=10000 PSC=7000  定时频率:CK_CNT_OV=CK_CNT/(ARR+1)=CK_PSC/(PSC+1)/(ARR+1)
	//CK_PSC=72M    
	TimeStructure.TIM_Period=10000-1;//ARR自动重装器的值 0——65535
	TimeStructure.TIM_Prescaler=7000-1;//PSC就是预分频器的值  0——65535
	TimeStructure.TIM_RepetitionCounter=0;   //重复计数器 高级计数器才有 所以置0
	TIM_TimeBaseInit(TIM2,&TimeStructure);
	
	
	TIM_ClearFlag(TIM2,TIM_IT_Update);//防止每次复位从1开始
	//第四步 TIM使能中断  开启更新中断到NVIC的通路
	TIM_ITConfig(TIM2, TIM_IT_Update,ENABLE);
	
	//第五步设置NVIC 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef  NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;//指定中断通道来开启或关闭 我们用的是STM32F10X_MD的15_10
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//指定的通道是使能还是失能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//设置抢占优先级 2组的取值是0-3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;//设置响应优先级  2组的取值是0-3
	NVIC_Init(&NVIC_InitStructure);
	
	//第六步启动定时器
	TIM_Cmd(TIM2, ENABLE);
}
#ifndef __TIMER_H
#define __TIMER_H

void Timer_Init(void);
#endif

Encode.c源代码如下:

#include "stm32f10x.h"                  // Device header


void Encode_Init(void)
{
	//第一步打开时钟
	//第二步配置GPIO TIM3
	//第三步配置时基单元
	//第四步配置输入捕获单元
	//第五步配置编码器接口模式
	//第六步启动定时器
	//第七步开启时钟   
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	//第二步配置GPIO  TIM3对应PA6 和PA7
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//设置上拉输入 根据外部模块输出的默认电平 要与这个一致
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//第三步设置时基单元
	//TIM_InternalClockConfig(TIM3);//编码器接口会托管时钟 所以这个内部时钟不用设置了
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 65536 - 1;		//设置大一些 防止计数溢出
	//通过调节PSC来改变PWM频率
	TIM_TimeBaseInitStructure.TIM_Prescaler = 1- 1;		// 预分频给0就是不分频  编码器时钟直接驱动计数器
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
	
	//第四步初始化捕获单元  编码器只使用到了滤波器和极性选择 只需要配置这两个 
	//没有配置的用TIM_IC初始化没有用到的函数
	TIM_ICInitTypeDef ICstructure;
	TIM_ICStructInit(&ICstructure);
	ICstructure.TIM_Channel=TIM_Channel_1;//选择通道
	ICstructure.TIM_ICFilter=0xF;//选择滤波器
	//ICstructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//边沿检测极性选择  这里上升沿就是反相
	TIM_ICInit(TIM3,&ICstructure);
	//还要配置一个通道
    ICstructure.TIM_Channel=TIM_Channel_2;//选择通道
	ICstructure.TIM_ICFilter=0xF;//选择滤波器
	//ICstructure.TIM_ICPolarity=TIM_ICPolarity_Rising;//边沿检测极性选择  这里上升沿就是反相
	TIM_ICInit(TIM3,&ICstructure);
	
	//第五步配置编码器接口模式
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
	//这里的两个TIM_ICPolarity_Rising与上面的一样 都是设置反相和不反相
	
   	//第六步启动定时器
	TIM_Cmd(TIM3, ENABLE);
}

int16_t Encode_get(void)
{   
	//测速 每次读完后要清零CNT
    int16_t i;//临时变量
	i = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3,0);
	return i;
}
#ifndef __ENCODE_H
#define __ENCODE_H

int16_t Encode_get(void);
void Encode_Init(void);
#endif

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elegent C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值