STM32驱动带编码器的直流减速电机

2024-06-12 01:44

本文主要是介绍STM32驱动带编码器的直流减速电机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

STM32驱动带编码器的直流减速电机

文章目录

  • STM32驱动带编码器的直流减速电机
    • 硬件材料
    • MG310 直流减速电机
      • 直流电机原理
      • 减速器
      • 实物接线
      • 霍尔编码器
    • TB6612电机驱动
    • 接线说明
    • 程序设计
      • 定时器生成PWM驱动电机
      • 速度计算
    • 实验结果
      • 程序下载

硬件材料

  • 主控板:STM32F407ZG
  • 直流减速电机:MG310(霍尔编码)
  • 电机驱动:TB6612
  • 7.4V电源

MG310 直流减速电机

直流电机原理

直流电机(DC Motor)的基本原理是基于电磁感应和电磁力。其工作原理可以归结为利用电流通过线圈在磁场中产生力,从而驱动电机转动。以下是直流电机的详细原理和工作机制:

20240610203412

  • 定子(Stator)
    永磁体或电磁体,产生静态磁场。

  • 转子(Rotor)
    也称为电枢(Armature),通常是一个带有线圈的铁芯,位于定子磁场中,并且能够自由转动。

  • 换向器(Commutator)
    半圆形导体片,连接在转子轴上,与电刷接触,用于切换电流方向,确保转矩方向恒定。

  • 电刷(Brushes)
    通常由碳材料制成,固定在电机外壳上,与换向器接触,将外部电源的电流传递到转子线圈。

当直流电流通过电刷和换向器进入转子线圈时,依据右手定则,电流在磁场中会产生洛伦兹力。电流方向和磁场方向决定了力的方向,具体如下:

1)电流通过线圈: 线圈的一部分电流从换向器和电刷流入,流经线圈,然后通过另一组换向器和电刷流出。
2)力的产生: 根据弗莱明左手定则,在磁场中的电流承受洛伦兹力,力的方向与电流方向和磁场方向成垂直。在线圈的两边产生相反方向的力,形成一个转矩,使转子旋转。
3)换向器的作用: 随着转子旋转,换向器不断地切换电流方向,以保持转子线圈中电流方向相同,从而维持持续的转矩方向。

减速器

减速器是机械传动系统中的一种重要部件,其主要作用是降低转速并增加转矩。

  • 降低转速:
    减速器的主要功能是将输入轴的高速旋转转变为输出轴的低速旋转。这是通过齿轮传动来实现的,输入轴连接到高速齿轮,通过多个齿轮级的传动,输出轴的转速被降低。
  • 增加转矩:
    当转速降低时,输出轴的转矩(扭矩)会相应增加。这是由于功率守恒定律,即在理想情况下,输入功率等于输出功率。减速器通过增加输出转矩,使得负载能被有效驱动。

实物接线

20240610161406

从上图可知,直流电机其实只有两个线(最边上两条),怎么这个电机有6个线,而且还有两个大焊点呢?其实,根据上面的图解也知道,那两个焊点分别和黄线和棕线是连接在一起的。也就是说只有6个线,而6P排线中,中间的四根线(红绿白黑)是编码器的线,只是用于测速,和直流电机本身没有联系。

霍尔编码器

编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感器,我们可以通过编码器测量到底位移或者速度信息。
其中,霍尔编码器通过检测磁性目标的运动来生成位置和速度信息,具体步骤如下:

  • 磁场变化检测:
    当磁性目标(如磁环或磁铁)随轴旋转时,霍尔传感器检测到磁场的变化。

  • 霍尔效应生成信号:
    霍尔传感器将磁场变化转换为电压信号。这些电压信号的波形取决于磁性目标的极性和旋转速度。

  • 信号处理:
    信号处理电路将霍尔传感器生成的模拟信号处理为数字脉冲信号。这些脉冲信号的频率与旋转速度成正比脉冲的数量与旋转角度成正比

  • 输出信号:
    处理后的数字脉冲信号通过输出接口传输到单片机。单片机根据这些信号计算转速、位置和方向。

20240610205054

因为编码器输出的是标准的方波,我们可以使用单片机(STM32 STM8 51等)直接读取。在软件中的处理方法是分两种,自带编码器接口的单片机如STM32,可以直接使用硬件计数。而没有编码器接口的单片机如51单片机,可以通过外部中断读取,比如把编码器A相输出接到单片机的外部中断输入口,这样就可通过跳变沿触发中断,然后在对应的外部中断服务函数里面,通过B相的电平来确定正反转。如当A相来一个跳变沿的时候,如果B相是高电平就认为是正转,低电平就认为是反转。

TB6612电机驱动

TB6612具有大电流MOSFET-H桥结构,双通道电路输出,可同时驱动2个电机。和 L298N 的使用基本一致的。而且,相比 L298N 的热耗性和外围二极管续流电路,它无需外加散热片,外围电路简单,只需外接电源滤波电容就可以直接驱动。

20240610205938

20240610160358

20240610210135

接线说明

TB6612是可以一次控制两个电机的(A和B),AB的接线是一样的,这边为了方便,只针对一个电机。下面是接线说明,同一行的两两相接。

TB6612单片机电机电源
VM7~12V
GND共地
VCC3.3V
STBY3.3V
PWMAPWM(PE9)
AIN1GPIO(PD2)
AIN2GPIO(PD3)
AO1电机电源+
AO2电机电源-
PWM(PB4)编码器A相
PWM(PB5)编码器B相
编码器电源+3.3~5V
编码器电源-GND

程序设计

定时器生成PWM驱动电机

一般来说,TB6612 可以支持较宽范围的 PWM 频率。不同电机对 PWM 频率的响应不同,较高的频率可以使电机运行更加平滑,但过高的频率可能导致驱动器的效率降低。一般推荐的 PWM 频率范围为 10kHz 到 100kHz。

这边用定时器1通道1口生成 PWM 波形

void TIM1_PWM_Init(u32 arr,u32 psc)	//PWM引脚初始化
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);  	  //TIM8时钟使能    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); 	//使能PORTC时钟	GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_TIM1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14;   //GPIOGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉GPIO_Init(GPIOE,&GPIO_InitStructure);              //初始化PC口//Sets the value of the auto-reload register cycle for the next update event load activity//设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 TIM_TimeBaseStructure.TIM_Period = arr; //Sets the pre-divider value used as the TIMX clock frequency divisor//设置用来作为TIMx时钟频率除数的预分频值TIM_TimeBaseStructure.TIM_Prescaler =psc; //Set the clock split :TDTS = Tck_tim//设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_ClockDivision = 1; //Up counting mode //向上计数模式  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //Initializes the timebase unit for TIMX based on the parameter specified in TIM_TIMEBASEINITSTRUCT//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //Select Timer mode :TIM Pulse Width Modulation mode 1//选择定时器模式:TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Compare output enablement//比较输出使能TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //Output polarity :TIM output polarity is higher	//输出极性:TIM输出比较极性高	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     TIM_OCInitStructure.TIM_Pulse=arr/2;//Initialize the peripheral TIMX based on the parameter specified in TIM_OCINITSTRUCT//根据TIM_OCInitStruct中指定的参数初始化外设TIMx	TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_OC2Init(TIM1, &TIM_OCInitStructure); TIM_OC3Init(TIM1, &TIM_OCInitStructure); TIM_OC4Init(TIM1, &TIM_OCInitStructure); // Advanced timer output must be enabled//高级定时器输出必须使能这句		TIM_CtrlPWMOutputs(TIM1,ENABLE);//CH1 is pre-loaded and enabled//CH1预装载使能	 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);  TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);  TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);  // Enable the TIMX preloaded register on the ARR//使能TIMx在ARR上的预装载寄存器	TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIM1TIM_Cmd(TIM1, ENABLE); 
}

速度计算

速度 = 脉冲数 ∗ 轮胎周长 读取周期 ∗ 轮胎每转一圈的脉冲数 速度=\frac{脉冲数*轮胎周长}{读取周期*轮胎每转一圈的脉冲数} 速度=读取周期轮胎每转一圈的脉冲数脉冲数轮胎周长

其中,轮胎每转一圈的脉冲数取决于编码器的分辨率,可由下面公式进行计算:

轮胎每转一圈的脉冲数 = 倍频 ∗ P P R ∗ 减速比 轮胎每转一圈的脉冲数=倍频*PPR*减速比 轮胎每转一圈的脉冲数=倍频PPR减速比

然后可以看下 MG310 产品具体参数

20240611194730

MG310的编码器倍频为4,PPR为13,减速比为20,那么最后可以计算轮胎每转一圈的脉冲数为:

轮胎每转一圈的脉冲数 = 4 ∗ 13 ∗ 20 = 1040 轮胎每转一圈的脉冲数=4*13*20=1040 轮胎每转一圈的脉冲数=41320=1040

轮胎的参数如下

20240611195203

我设置速度读取周期为10ms,也就是0.01,最后的速度公式简化为:

速度 = 0.01 秒内产生的脉冲数 ∗ 0.048 ∗ π 0.01 ∗ 1040 速度=\frac{0.01秒内产生的脉冲数*0.048*\pi}{0.01*1040} 速度=0.0110400.01秒内产生的脉冲数0.048π

单位为 m / s m/s m/s

代码:

void speedCal(void)
{float speed = 0;speed = (Read_Encoder(3)*0.048f*3.14f)/(10.4f);printf("速度值为:%f m/s\r\n",speed);
}

实验结果

无标题视频——使用Clipchamp制作

20240611211631

程序下载

https://download.csdn.net/download/u011895157/89421733

这篇关于STM32驱动带编码器的直流减速电机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052844

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

【电机控制】数字滤波算法(持续更新)

文章目录 前言1. 数字低通滤波 前言 各种数字滤波原理,离散化公式及代码。 1. 数字低通滤波 滤波器公式 一阶低通滤波器的输出 y [ n ] y[n] y[n] 可以通过以下公式计算得到: y [ n ] = α x [ n ] + ( 1 − α ) y [ n − 1 ] y[n] = \alpha x[n] + (1 - \alpha) y[n-1]

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的