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

news2024/11/15 18:06:18

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;   //GPIO
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
    GPIO_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_tim
    TIM_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脉冲宽度调制模式1
    TIM_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); 

    //使能TIM1
    TIM_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1813041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】WVP视频平台未授权漏洞

漏洞描述: WVP视频平台api/user存在未授权访问漏洞,攻击者可利用漏洞获取当前系统管理员用户名及密码进行登录系统。 搜索语法: Fofa-Query: body"国标28181" 漏洞详情: 1.WVP视频平台。 2.POC: GET /api/user/all HTTP/1.1 …

Redis项目中竟然有这么多种使用场景!!

下面蜗牛哥依次对Redis 15种业务场景举例说明和解释: 1. 排行榜和计数器 针对Redis作为排行榜和计数器的使用场景,下面是一个Java Spring Boot应用的案例,其中使用Redis来实现一个简单的文章点赞功能,并将点赞数用作排行榜的依据…

Django UpdateView视图

UpdateView是Django中的一个通用视图,用于处理对象的更新操作。它允许用户更新一个已经存在的对象。UpdateView通常与一个模型表单一起使用,这样用户就可以看到当前对象的值,并可以修改它们。 1,添加视图 Test/app3/views.py fr…

什么是覆盖索引 ?

走当前索引就足够,而无需回表就能找到所有数据,就叫覆盖索引。 比如 key1 上有索引。(它是一个普通的二级索引)。 那么select key1 from s1 where key1 a 这种就叫覆盖索引。 表现就是explain时, Extra 那里显示 …

鸿蒙开发文件管理:【@ohos.fileio (文件管理)】

文件管理 该模块提供文件存储管理能力,包括文件基本管理、文件目录管理、文件信息统计、文件流式读写等常用功能。 说明: 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 impor…

AI创意广告案例分析️可口可乐、麦当劳、伊利、钟薛高等一线品牌各显神通

AI 相关的教学我们最近做了不少分享,本期计育韬老师则希望和广告人们谈一谈具体的落地案例应用及其内在创意方法论。结合在 Midjourney 频道 LV.14 的部分创作经验,相信能为广大品牌方带来 AI 广告创作的启迪。 担心版权争议? 那就主打 UG…

分离轴定理:凸多边形相交检测算法

分离轴定理(Seperating Axis Theorem)是一种确定两个凸多边形是否相交的方法。该算法还可用于查找最小穿透向量,这对于物理模拟和许多其他应用非常有用。SAT 是一种快速通用算法,可以消除对每个形状类型对进行碰撞检测代码的需求&…

在Vue2和Vue3中ECharts如何使用,详细步骤,ref,$ref。echarts官网。

不管是在vue2中还是在vue3中其实本质上的原理和步骤都是一样的,只是语法可能有所不同。 为了方便大家看起乱,vue2和vue3我分开写。 echarts官网: https://echarts.apache.org/zh/index.html Vue2篇: 1.导入echarts包&#xf…

LaDM3IL:多实例学习用于免疫库分类

一个人的免疫组库由某一时间点的大量适应性免疫受体组成,代表了该个体的适应性免疫状态。免疫组库分类和相关受体识别有可能为新型疫苗的开发做出贡献。大量的实例对免疫组库分类提出了挑战,这可以表述为大规模多实例学习 (MMIL,Massive Mult…

AI实时免费在线图片工具4:WordArt艺术字生成;IC-Light打光模型;screenshot to code图像直接生成网页

1、艺术字生成WordArt https://modelscope.cn/studios/WordArt/WordArt/summary?reftop.aibase.com 2、打光模型IC-Light https://huggingface.co/spaces/lllyasviel/IC-Light Screenshot to Code图像直接生成网页 https://huggingface.co/spaces/HuggingFaceM4/screen…

Ubuntu,Linux服务器安装Mellanox MCX653105A IB网卡HCA卡驱动

驱动下载地址 https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ 选择对应操作系统 进入目录运行 安装成功显示 如果中途报错,需要核对下载的版本,并且把原来安装的卸载

钡铼BL102优化生产流程PLC-MQTT网关快速转换

在智能制造和工业4.0的推动下,优化生产流程、提升自动化水平已成为现代制造业的核心诉求。作为这一进程的关键环节,将传统的PLC控制系统与先进的物联网技术相结合,实现数据的高效采集与远程管理变得尤为重要。钡铼BL102作为一款专为优化生产流…

Jsch上传本地目录文件到服务器

文章目录 1.Jsch简介1.1 什么是Jsch1.2 Jsch使用步骤和简单示例 2.技术关键点3.Jsch实战3.1 maven依赖3.2 功能实现3.3 效果3.4 封装工具类 4.总结 摘要: 在一些框架开发工作中,需要为项目使用说明文档,来指导用户如何正确使用框架。比如通过markdown编写…

易舟云:让中小企业财务管理变得触手可及

在现代企业运营中,财务管理的精准和高效至关重要。对于中小企业来说,一款专业且易于使用的财务软件更是必不可少的工具。今天,我们就来详细了解一款深受中小企业喜爱的财务软件——易舟云。 财务管理的云端革命 随着云技术的发展,…

EVA-CLIP:在规模上改进CLIP的训练技术

摘要 对比性语言-图像预训练,简称CLIP,因其在各种场景中的潜力而备受关注。在本文中,我们提出了EVA-CLIP,一系列模型,这些模型显著提高了CLIP训练的效率和有效性。我们的方法结合了新的表示学习、优化和增强技术&…

Phaser-圆形路径

使用 Phaser 创建一个简单的路径动画 Phaser 是一个强大的 HTML5 游戏框架,适合用于开发 2D 游戏。在本文中,我们将展示如何使用 Phaser 创建一个简单的动画示例,其中一个红色的圆沿着椭圆路径移动。该示例将帮助你理解如何在 Phaser 中使用…

Linux用户,用户组,所有者权限分配,sftp用户权限分配

注意以下命令执行需要在root用户下执行 tenant命令切换至root命令 sudo -do root 删除用户信息 1.不删除用户主目录 userdel user_name 2.删除用户主目录 userdel -r user_name usermod命令修改用户账户权限 更改用户名 sudo usermod -l newusername oldusername 更…

Redis】Redis主从复制(二)————主从结构/流程

目录 回顾slaveof 命令断开主从复制关系切换主从复制关系只读网络延迟问题应对措施补充 主从结构一主一从结构问题改进 一主多从结构树形主从主从切换结构 主从复制流程简单来记关于数据同步两个参数replicationidoffset. psync 运行流程全量复制和部分复制全量复制流程&#x…

在镜像中添加Git提交号

文章目录 前言环境介绍思路内核cpuinfo中添加Git提交号修改setup.c获取Git提交号和生成GIT_COMMIT_INFO宏继续修改内核setup.c验证 内核设备树中添加Git提交号修改设备树验证 U-Boot版本号添加Git提交号U-Boot配置修改setlocalversion脚本验证 前言 在镜像中加入Git提交号&…

mysql和redis的双写一致性问题

一,使用方案 在使用redis作为缓存的场景下,我们一般使用流程如下 二,更新数据场景 我们此时修改个某条数据,如何保证mysql数据库和redis缓存中的数据一致呢? 按照常规思路有四种办法,1.先更新mysql数据&a…