系列文章目录(STM32常用外设/HAL库版)

一、HC-SR04超声波模块的使用
二、OLED的HAL库代码介绍及使用
三、直流减速电机的测速以及电机驱动的使用(本篇)


文章目录

  • 系列文章目录(STM32常用外设/HAL库版)
  • 前言
  • 一、所用的器材模块介绍
  • 二、接线说明
  • 三、CubeMX配置
    • 3.1. 时钟树的配置
    • 3.2. PWMA配置(TIM4)
    • 3.3. 编码器模式配置(TIM3)
    • 3.4. 定时器配置(TIM1)
    • 3.5. IIC和USART配置
    • 3.6. NVIC配置
    • 3.7. 最终引脚图
  • 四、程序代码及说明
    • 4.1. encoder.h
    • 4.2. encoder.c
    • 4.3. motor.h
    • 4.4. main.c
  • 总结

前言

由于之后要着手开始做一些闭环的小项目,比如常见的两轮平衡小车,那就必须使用编码器来测量直流减速电机的转速,本文将介绍如何使用stm32f103c8t6的编码器模式测量带15线霍尔编码器的直流减速电机的空载转速。


先放上最终效果展示吧

使用STM32的编码器模式测量直流减速电机的转速


提示:以下是本篇文章正文内容,下面案例可供参考

一、所用的器材模块介绍

  1. stm32f103c8t6最小系统板
  2. 12V锂电池
  3. DC-DC可调降压模块(LM2596S)
  4. 0.96寸OLED(IIC接口)
  5. HC-08蓝牙模块
  6. 两路直流电机驱动(这里用的是DRV8848而不是TB6612,因为TB6612已经停产)
  7. 直流减速电机(电机型号为GM25-370,空载转速12V12000RPM,减速比为34:1,减速后350转/分)
  8. 15线霍尔编码器(编码器单圈15脉冲,减速后单圈为510脉冲每圈,可以通过stm32编码器模式4倍频至2040脉冲每圈)

所用的带15线霍尔编码器的GM25-370直流减速电机及其参数见下图


所用模块的具体作用:
蓝牙模块:通过手机蓝牙直接改变电机转速
OLED:实时显示电机的转速以及读取到的脉冲数

二、接线说明

特别注意:这步至关重要,稍有不慎就会烧坏单片机

下面给出原理图:(最好不要把电机驱动板上所有的GND都与单片机共地,VCC下面的GND可以不与单片机共地,还有就是STM32只外接信号线,不要用它给电机驱动板的VCC供电,STM32接一些感性负载(比如电机)时最好加光耦隔离,我之前也是用了光耦隔离,但是要想完全隔离只能用双电源,最终就没加)

三、CubeMX配置

为了进行测速,我们一共需要3个定时器,作用分别是:①输出PWM;②编码器模式进行脉冲计数;③计时,确定每次测速的时间间隔;

3.1. 时钟树的配置

(1)点击RCC ,开启HSE,并选择RC或晶体作为时钟源

(2)配置时钟树

3.2. PWMA配置(TIM4)

(1)点击TIM4,在Mode选项中设置Clock Source为Internal Clock。设置Channel1为PWM Generation CH1,其余默认即可。

(2)设置Configuration选项中Parameter Settings的参数

将PWM设置为10KHz
设置频率最好在20Hz~20000Hz以内,因为这个频率内的PWM波不会让电机发出明显的电流声

(3)TIM4_CH1 的GPIO参数设置

PB6参数设置

3.3. 编码器模式配置(TIM3)

(1)点击TIM3,在Mode选项中设置Combined Channels为编码器模式。

(2)设置Configuration选项中Parameter Settings的参数

注意:将Encoder Mode 设置为Encoder Mode TI1 and TI2,使得编码器模式为4倍频模式,得到的脉冲值X4

编码器模式中Polarity是用来设置触发的信号是否反向,即用来匹配编码器与电机的旋转方向,而不是像“输入捕获”功能那样用来设置触发的边沿

(3)GPIO参数设置

3.4. 定时器配置(TIM1)

配置定时器,配置为0.1S定时中断一次读取TIM3编码器模式记录的脉冲值

3.5. IIC和USART配置

这部分就是开启I2C1的I2C模式,开启USART2的异步模式

3.6. NVIC配置

开启TIM1 update interrupt,USART2 global interrupt 两个中断并将USART2 global interrupt的优先级设置的高于TIM1 update interrupt,因为要通过串口接收中断来改变转速,如果串口中断的优先级低于定时器中断的优先级,此时串口中断就不能立刻执行


3.7. 最终引脚图

四、程序代码及说明

提示:OLED代码见OLED的HAL库代码介绍及使用,这里就不再赘述

4.1. encoder.h

#ifndef ENCODER_ENCODER_H_
#define ENCODER_ENCODER_H_#include "stm32f1xx_hal.h" //HAL库文件声明
#include <main.h>extern TIM_HandleTypeDef htim1;
extern TIM_HandleTypeDef htim3;void GET_NUM(void);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);#endif /* ENCODER_ENCODER_H_ */

4.2. encoder.c

TIM3(编码器模式)的计数值为0-65535,采用short int类型对其强制类型转换;
若TIM3计数器值为 0 ~ 32767,则强制转化后的值仍为0 ~ 32767,电机正转;
若TIM3计数器值为32768 ~ 65535,则强制转化后的值为-32768 ~ -1,,电机反转;

#include"encoder.h"
#include"../oled/oled.h"float  n=0;//转速,单位为:转/秒
short encoder_counter=0;//STM32编码器模式读取的总脉冲数/*** @function: void GET_NUM(void)* @description: 使用STM32编码器模式,读取编码器产生的脉冲值* @param {*} * @return {*}*/
void GET_NUM(void)
{encoder_counter=(short) __HAL_TIM_GET_COUNTER(&htim3);__HAL_TIM_SET_COUNTER(&htim3,0);
}/*** @function:void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)* @description: 定时器中断回调函数,0.1S中断一次并计算转速,将电机转速以及编码器产生的脉冲数显示在OLED屏上* @param {TIM_HandleTypeDef *htim} * @return {*}*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim==&htim1){GET_NUM();//得到所记录的脉冲数OLED_Showdecimal(0,6,encoder_counter,5,2,12,0);//在特定位置显示5位整数+2位小数的脉冲数n=(float)encoder_counter/2040/0.1;//转速为n,r/s//编码器单圈15脉冲,减速后单圈为510脉冲每圈,可以通过stm32编码器模式4倍频至2040脉冲每圈。定时器中断是0.1S执行一次OLED_Showdecimal(0,4,n,2,2,12,0);//在特定位置显示2位整数+2位小数的电机转速}
}

4.3. motor.h

这个.h就是给电机驱动板AO1,AO2赋高低电位的

#ifndef MOTOR_MOTOR_H_
#define MOTOR_MOTOR_H_#include "stm32f1xx_hal.h" //HAL库文件声明
#include <main.h>#define MOTOR_GO HAL_GPIO_WritePin(GPIOA, AIN1_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, AIN2_Pin, GPIO_PIN_SET)#endif /* MOTOR_MOTOR_H_ */

4.4. main.c

/* USER CODE BEGIN Includes */
#include "../../icode/motor/motor.h"
#include "../../icode/usart/usart.h"
#include "../../icode/encoder/encoder.h"
#include "../../icode/oled/oled.h"
/* USER CODE END Includes */

  /* USER CODE BEGIN 2 */HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); //开启TIM4 PWMA模式HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);//开启TIM3编码器模式HAL_UART_Receive_IT(&huart2,(uint8_t *)&USART2_NewData,1); //开启串口二的接收中断,用于蓝牙改变电机转速HAL_TIM_Base_Start_IT(&htim1);//开启TIM1的定时器中断OLED_Init();                           //OLED初始OLED_Clear();                         //清屏OLED_ShowString(0,0,"Rotational Speed:",12,0);OLED_ShowString(50,4,"rad/s",12,0);/* USER CODE END 2 */

下面这部分main.c内容是通过蓝牙改变电机转速,与本文的重点>通过STM32编码器模式对直流减速电机测速的讲解关系不大

  /* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(USART2_RX_STA&0x8000)           //判断中断接收标志位(蓝牙模块使用USART2){if((USART2_RX_STA&0x7FFF) ==4    //判断接收数量是不是为四个&& USART2_RX_BUF[0]==0xA5    //判断接收第一个数据是不是包头0xA5&& USART2_RX_BUF[3]==(USART2_RX_BUF[1]+USART2_RX_BUF[2])%0x100)   //判断接收校验码是不是原数据之和的低八位{switch(USART2_RX_BUF[2])      //接收并读取蓝牙发送过来的第三个数,改变车速{   //ARR的在CubeMX中设置为20000case(0x00):__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1,0);break;    //0%的speedcase(0x14):__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1,1440) ;break;//20%case(0x28):__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1,2880) ;break;//40%case(0x3C):__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1,4320);break;//60%case(0x50):__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1,5760);break;//80%case(0x64):__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1,7200);break;//100%default:break;}}USART2_RX_STA=0;//标志位清0}MOTOR_GO;}/* USER CODE END 3 */

总结

最终结果就是文章开头视频中显示的,还是测量的比较精准,和电机的参数十分接近,这部分内容对于之后的平衡小车至关重要,因为后续PID控制时要经常读取电机转速来对小车进行闭环控制。

码字不易,希望喜欢的小伙伴别忘了点赞+收藏+关注,你们的肯定就是我创作的动力

欢迎大家积极交流,本文未经允许谢绝转载!!!

编码电机测速(stm32f1/HAL库/CubeMX/编码器模式/平衡小车/直流减速电机/超详细)相关推荐

  1. stm32编码器电机测速(hal库)

    记录一下今天参考别人的代码实现了四个电机的测速. 编码器被广泛应用于电机测速,实现电机闭环控制.所以不论是自己做小车还是后续参加各种比赛,必须要学会编码器测速. 一.参数 编码电机其实就是一个带有编码 ...

  2. 基于MSP430f5529 编码电机测速 接收脉冲数 PWM调速 CCS编译器 代码分析

    前言:2022年TI杯大学生电子设计竞赛,小车跟随行驶系统(C题)要求:设计一套小车跟随行驶系统,采用TI的MCU,由一辆领头小车和一辆跟随小车组成,要求小车具有循迹功能,且速度在0.3~1m/s可调 ...

  3. STM32 HAL库实现编码器测速

    STM32 HAL库实现编码器测速 (还开了串口1用来调试,下文没写:然后那个short的用法就是看平衡小车之家(就是喵呜实验室的文档里头的,用法确实惊艳),文末贴了工程) 编码器接口模式 TI1和T ...

  4. stm32直流电机PID控制hal库(Cubemx)

    stm32直流电机PID控制hal库(Cubemx),一步步手把手教你怎么配置cubemx怎么写代码. 未对pid就行深入解析,不过相信您通过配置和写代码以后大概可以知道pid的主要作用. 文章目录 ...

  5. STM32之增量式编码器电机测速

    STM32之增量式编码器电机测速 编码器 编码器种类 按监测原理分类 光电编码器 霍尔编码器 按输出信号分类 增量式编码器 绝对式编码器 编码器参数 分辨率 精度 最大响应频率 信号输出形式 编码器倍 ...

  6. STM32机器人控制开发教程No.3 使用遥控控制电机/舵机(基于HAL库)

    01 前言 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口.SWD下载调试接口.航模遥控接口.USB5V输出接口以及方便与树莓派直接连接的40PIN接口等,板载资源丰富 ...

  7. STM32应用开发实践教程:智能小车电机测速模块的应用开发

    3.4.1 任务分析 本任务要求设计一个可实现智能小车电机测速的应用程序,具体要点如下. ① 取一个电机作为测速对象. ② 支持按键控制,使用 4 个按键,功能描述如下:  Key1 控制电机正转, ...

  8. STM32F407霸天虎HAL库CubeMX学习笔记——DS18B20

    STM32F407霸天虎HAL库CubeMX学习笔记--DS18B20 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 tim.c DS18B20.h DS18B20 ...

  9. 二、读取编码器数值实现电机测速—1 、配置串口通信;

    读取编码器数值实现电机测速 电机系列 二.读取编码器数值实现电机测速 1 .配置串口通信: usart.h usart.c main.c 2 .配置编码器: 电机系列 二.读取编码器数值实现电机测速 ...

最新文章

  1. 用hmmlearn学习隐马尔科夫模型HMM
  2. 《包青天》中的《鸳鸯蝴蝶梦》单元,剧中有一个很漂亮的女子叫“离垢”
  3. mini mp3模块 输出_小米有品众筹魔方mini电脑主机
  4. java 今天 昨天_js获取当前时间(昨天、今天、明天)
  5. 3520a SDL_tff库做bmp 也就是osd
  6. [转]使用HttpOnly提升Cookie安全性
  7. java基础----String、StringBuffer、StringBuilder
  8. ubuntu中用wine安装office2007
  9. 【MySQL】replace into 浅析之二
  10. Devexpress VCL Build v2014 vol 14.2.6 发布
  11. 腾讯通如何修改服务器,rtx如何设置服务器地址
  12. 华为eNSP BUG——Serial线配置ACL问题
  13. 漫画分销系统服务器配置,漫画分销平台哪个好?月流水30万的老手来谈谈!
  14. 数字图像处理学习笔记(一)——数字图像处理概述
  15. 央视《家有妙招》整理版,共250招,值得收藏
  16. 网上的PS把图片变清晰的原理
  17. JQuery插件validate的Remote使用
  18. 爱五笔iWuBi for Mac(五笔练习工具)
  19. Java开发岗:本硕211毕业一年,大厂面试最终拿下美团offer!献上我的面经+Java核心知识点(秋招适用)
  20. dc dc变换器的建模及matlab仿真,基于Matlab的AC/DC变换器的系统建模和仿真.pdf

热门文章

  1. JFrame,JDialog,JLabel,JButton(p228)
  2. SpringMVC(十三):SpringMVC 与fastjson集成
  3. poss八十七氟癸基/白色粉末状/溶于氟类树脂/自修复超疏水材料
  4. 二极管在电路设计中的应用
  5. 基于启发式蝙蝠算法、粒子群算法、花轮询算法和布谷鸟搜索算法的换热器PI控制器优化(Matlab代码实现)
  6. linux发邮件到126,Linux上,用bash通过126邮箱发邮件。
  7. Churchill资本集团和科睿唯安合并,将在纽交所上市
  8. MATLAB与VERP/Coppeliasim联合仿真:配置ZeroMQremote API
  9. Java中如何获取图片的长和宽
  10. macos 上的各种下载软件安装方式