STM32F407 增量编码盘电机测速,直流电机速度环详解(内附源码)

芯片是STM32F407VGT6,采用定时器TIM4.

void ENCODER_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_ICInitTypeDef TIM3_ICInitStructure;
	TIM_ICInitTypeDef TIM4_ICInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);		//TIM4时钟使能
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);	//使能PORTD时钟
	
	GPIO_StructInit(&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;	//GPIOD12/GPIOD13
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;			//管脚复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;		//管脚速度100MHz
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;			//管脚悬空
	GPIO_Init(GPIOD,&GPIO_InitStructure);					//初始化 GPIO
		
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);	//PC6复用定时器4
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);	//PC7复用定时器4
		
	TIM_DeInit(TIM4);
	TIM_TimeBaseStructure.TIM_Period= 511 * 4;					//自动重装载值
	TIM_TimeBaseStructure.TIM_Prescaler= 0x00;					//定时器分频
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;	//向上计数模式
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);				//初始化 TIM3
	
	TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
	
	TIM_ICStructInit(&TIM4_ICInitStructure);
	TIM3_ICInitStructure.TIM_ICFilter = 0x06;			//IC1F=0000 配置输入滤波器 不滤波
	TIM_ICInit(TIM4, &TIM3_ICInitStructure);
	
	TIM_ClearFlag(TIM4, TIM_FLAG_Update);
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);			//允许更新中断
	
	TIM4->CNT=0;

	TIM_Cmd(TIM4,ENABLE ); 	//使能定时器4
		
	NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;		//抢占优先级2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;			//子优先级0
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);								//初始化 NVIC

}


void TIM4_IRQHandler(void)
{
	if(TIM4->SR&0x0001)//溢出中断
	{
		
	}	
	TIM4->SR&=~(1<<0);//清除中断标志位 
}

TIM3->CNT就是增量编码盘的脉冲值,其值范围是0-编码盘线数(重装载值我这里是2044)。

电机转速获得可以通过该脉冲值获得。

当前转速大小=(当前一扫描周期脉冲值-上一扫描周期脉冲值)*k(比例系数)

要想获得精确的rpm,需要综合考虑执行周期,编码盘线数,减速比,计算获得。

若只需获得大概反应电机速度变化的数值,可默认为1.

至此,电机速度环已形成。

尾声

有时间写一下编码盘电机角度控制.

这里获得了脉冲值,也就是相对角度,电机在不同位置的脉冲值不同。

一般来说编码器线数的意思是,当编码盘旋转一周变化的脉冲值(如2044)

若定义起始位为脉冲值为0 ,角度也为0 ,则当旋转180度时,脉冲值应为1022.

可以通过这个实现电机角度位置控制。具体来说要对相对角度处理,转化为绝对角度。

https://blog.csdn.net/qq_40696002/article/details/105487992

 

 

 

 

  • 11
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值