IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32F4系列 之 霍尔编码器减速直流电机 -> 正文阅读

[嵌入式]基于STM32F4系列 之 霍尔编码器减速直流电机

文章目录

  • 前言
  • 一、关于编码器介绍
  • 二、编码器工作原理
  • 三、编码器电机配置
  • 四、代码配置
  • 五、实验工程链接




前言

这篇博文为作者实验经历写下的笔记,借鉴学习了多位博主的博文,并总结了互联网资料。本篇使用的是JGB37-520减速直流电机并结合USMART调试模块,上位机通信控制PWM输出,如有错误敬请大佬们斧正。



一、关于编码器的介绍

JGB37-520减速直流电机

? ? ? ?编码器是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号,前者称为码盘,后者称为码尺。按照读出方式编码器可以分为接触式和非接触式两种;按照工作原理编码器可分为增量式和绝对式两类。

? ? ? ?增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关。

按照原理可分为(常见的)

? ? ? ? ? ?1,光电编码器(光学式),

? ? ? ? ? ?2,触点电刷式

? ? ? ? ? ?3,霍尔编码器(磁式)。



二、编码器的工作原理(正交式)

? ? ? ?编码器能够将电机的机械几何位移转化为脉冲信号或数字量。本实验采用的编码器为增量式编码器,增量式编码器通常有两个输出信号,分别为A相和B相。电机带动霍尔码盘转动,在码盘的结构位上将电机在转动时会产生A、B两相的脉冲信号,且这两路脉冲信号的相位差为90度(即正交)配置定时器进行捕获计数,测得脉冲频率,再根据脉冲序列的频率确定电机的转速。同时,在此过程中,A,B相位触发的先后顺序可以确定转动的正反方向。

stm32F4定时器中部分定时器提供了编码器模式,可大大简化解析过程。

高级定时器TIM1和TIM8,通用定时器TIM2-TIM5支持定位用增量(正交)编码器和霍尔传感器电路。

三、编码器电机的配置

M1与M2为电机电源,通过TB6612FNG等电机驱动输出PWM信号,减速电机的转速。

M1与M2,高/低电平决定电机转动的方向(测试电机:直接向其接入12V以下电源,另一端接地,反之反转)

中间部分为编码盘部分与减速电机可区别开:

GND----接地? ? ? VCC----接电源3.3V

C1----霍尔编码器A相位? C2----霍尔编码器B相位

霍尔传感器编码器的测速模块,配有 11 线强磁码盘,A B 双相输出 共同利用下,通过计算可得出车轮转一圈时,脉冲数可达30*11*2=660个,单相也可以达到 330 个.(减速比为30:1)

关于编码器的工作模式:

?模式1,即计数器仅在TI1的边沿处计数;

模式2,即计数器仅在TI2的边沿处计数;

模式3,即定时器在TI1、TI2双边沿处计数(具体请参考stm32f4系列中文参考手册)

四、代码配置部分

本篇使用的是JGB37-520减速直流电机并结合USMART调试模块,上位机通信控制PWM输出。

main.c主函数如下

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "Encoder.h"   //编码器头文件
#include "pwm.h"       //PWM配置头文件
#include "led.h"
#include "lcd.h"        
#include "usmart.h"		//USMART调试组件头文件

unsigned int run;

void set(unsigned int i)//USMART组件注册函数配置
{
	TIM_SetCompare1(TIM14,i);//上位机调节PWM值控制转速
    run=i;	
} 

int main(void)
{
	uint32_t encoder; //定义编码值
	float pulse;	  //定义电机实际脉冲值
	float speed;	  
	
	GPIO_InitTypeDef  GPIO_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);  
	uart_init(115200);
	usmart_dev.init(84); 	//调试组件初始化
	LCD_Init();
	LED_Init();
 	TIM14_PWM_Init(500-1,84-1);	//电机PWM初始化
	encoder_init();	
	
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//配置转速电机方向TB6612FNG工作 
                                                         //模式位
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_5;           
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;        
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;    
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;       
	GPIO_Init(GPIOF,&GPIO_InitStructure);            
	
	GPIO_SetBits(GPIOF,GPIO_Pin_6 | GPIO_Pin_7|GPIO_Pin_5);
	GPIO_ResetBits(GPIOF,GPIO_Pin_7);
	
   while(1) 
	{	
		TIM_SetCompare1(TIM14,run);
		encoder = read_cnt();	
		pulse = encoder/2;
	    speed = encoder/2/6.3/11;

		LCD_ShowString(10,100,50,16,16,"encoder:");
		LCD_ShowNum(90,100,encoder,5,16);
		
		LCD_ShowString(10,130,50,16,16,"pulse:");
		LCD_ShowNum(90,130,pulse,5,16);
		
		LCD_ShowString(10,160,50,16,16,"speed:");
		LCD_ShowNum(90,160,speed,5,16);
		
		printf("encoder:%d \t speed:%lf rps \t",encoder,speed);//上位机显示编码值与转速
		delay_ms(500);//延迟500ms
		LED1=!LED1;	//LED1闪烁
	}
}

encoder.c文件如下:

#include "Encoder.h"
#include "sys.h"

void encoder_init(void)//定时器工作模式为编码器工作模式
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_ICInitTypeDef TIM_ICInitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//配置A、B相位
	GPIO_Init(GPIOA, &GPIO_InitStructure);                //初始化IO口

	GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM3);   //映射复用定时器 
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM3);
	
	TIM_TimeBaseStructure.TIM_Prescaler = 0;         //脉冲值计数					
	TIM_TimeBaseStructure.TIM_Period = 65535;					
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;

	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
	TIM_ICStructInit(&TIM_ICInitStructure);						
	
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising ,TIM_ICPolarity_Rising);      //A、B均为上升沿触发,为二倍频

	TIM_SetCounter(TIM3, 0);		
	TIM_Cmd(TIM3, ENABLE);			//使能定时器TIM3
}

uint32_t read_cnt(void)  //定时器计数值读取
{
	uint32_t encoder_cnt;
	
	encoder_cnt = TIM3->CNT;		
	TIM_SetCounter(TIM3, 0);	
	
	return encoder_cnt;			
}

可通过XCOM软件与STM32通信,向单片机发送数据,调试电机。

usmart.c调试组件配置(部分)如下:

// 
#include "delay.h"		
#include "sys.h"
#include "lcd.h"
#include "pwm.h"

extern void set(unsigned int i);//注册PWM控制函数

struct _m_usmart_nametab usmart_nametab[]=   //添加进调试库            
{
	(void*)set,"set(unsigned int i)",				  	    
};						  
///END///

五、实验工程链接

霍尔编码器直流电机实验.rar-嵌入式文档类资源-CSDN下载

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章           查看所有文章
加:2021-11-22 12:30:12  更:2021-11-22 12:32:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:50:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码