900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 基于STM32F4系列 之 霍尔编码器减速直流电机

基于STM32F4系列 之 霍尔编码器减速直流电机

时间:2021-09-01 06:21:04

相关推荐

基于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);//延迟500msLED1=!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下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。