编码电机测速(stm32f1/HAL库/CubeMX/编码器模式/平衡小车/直流减速电机/超详细)
系列文章目录(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的编码器模式测量直流减速电机的转速
提示:以下是本篇文章正文内容,下面案例可供参考
一、所用的器材模块介绍
- stm32f103c8t6最小系统板
- 12V锂电池
- DC-DC可调降压模块(LM2596S)
- 0.96寸OLED(IIC接口)
- HC-08蓝牙模块
- 两路直流电机驱动(这里用的是DRV8848而不是TB6612,因为TB6612已经停产)
- 直流减速电机(电机型号为GM25-370,空载转速12V12000RPM,减速比为34:1,减速后350转/分)
- 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/编码器模式/平衡小车/直流减速电机/超详细)相关推荐
- stm32编码器电机测速(hal库)
记录一下今天参考别人的代码实现了四个电机的测速. 编码器被广泛应用于电机测速,实现电机闭环控制.所以不论是自己做小车还是后续参加各种比赛,必须要学会编码器测速. 一.参数 编码电机其实就是一个带有编码 ...
- 基于MSP430f5529 编码电机测速 接收脉冲数 PWM调速 CCS编译器 代码分析
前言:2022年TI杯大学生电子设计竞赛,小车跟随行驶系统(C题)要求:设计一套小车跟随行驶系统,采用TI的MCU,由一辆领头小车和一辆跟随小车组成,要求小车具有循迹功能,且速度在0.3~1m/s可调 ...
- STM32 HAL库实现编码器测速
STM32 HAL库实现编码器测速 (还开了串口1用来调试,下文没写:然后那个short的用法就是看平衡小车之家(就是喵呜实验室的文档里头的,用法确实惊艳),文末贴了工程) 编码器接口模式 TI1和T ...
- stm32直流电机PID控制hal库(Cubemx)
stm32直流电机PID控制hal库(Cubemx),一步步手把手教你怎么配置cubemx怎么写代码. 未对pid就行深入解析,不过相信您通过配置和写代码以后大概可以知道pid的主要作用. 文章目录 ...
- STM32之增量式编码器电机测速
STM32之增量式编码器电机测速 编码器 编码器种类 按监测原理分类 光电编码器 霍尔编码器 按输出信号分类 增量式编码器 绝对式编码器 编码器参数 分辨率 精度 最大响应频率 信号输出形式 编码器倍 ...
- STM32机器人控制开发教程No.3 使用遥控控制电机/舵机(基于HAL库)
01 前言 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口.SWD下载调试接口.航模遥控接口.USB5V输出接口以及方便与树莓派直接连接的40PIN接口等,板载资源丰富 ...
- STM32应用开发实践教程:智能小车电机测速模块的应用开发
3.4.1 任务分析 本任务要求设计一个可实现智能小车电机测速的应用程序,具体要点如下. ① 取一个电机作为测速对象. ② 支持按键控制,使用 4 个按键,功能描述如下: Key1 控制电机正转, ...
- STM32F407霸天虎HAL库CubeMX学习笔记——DS18B20
STM32F407霸天虎HAL库CubeMX学习笔记--DS18B20 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 tim.c DS18B20.h DS18B20 ...
- 二、读取编码器数值实现电机测速—1 、配置串口通信;
读取编码器数值实现电机测速 电机系列 二.读取编码器数值实现电机测速 1 .配置串口通信: usart.h usart.c main.c 2 .配置编码器: 电机系列 二.读取编码器数值实现电机测速 ...
最新文章
- 用hmmlearn学习隐马尔科夫模型HMM
- 《包青天》中的《鸳鸯蝴蝶梦》单元,剧中有一个很漂亮的女子叫“离垢”
- mini mp3模块 输出_小米有品众筹魔方mini电脑主机
- java 今天 昨天_js获取当前时间(昨天、今天、明天)
- 3520a SDL_tff库做bmp 也就是osd
- [转]使用HttpOnly提升Cookie安全性
- java基础----String、StringBuffer、StringBuilder
- ubuntu中用wine安装office2007
- 【MySQL】replace into 浅析之二
- Devexpress VCL Build v2014 vol 14.2.6 发布
- 腾讯通如何修改服务器,rtx如何设置服务器地址
- 华为eNSP BUG——Serial线配置ACL问题
- 漫画分销系统服务器配置,漫画分销平台哪个好?月流水30万的老手来谈谈!
- 数字图像处理学习笔记(一)——数字图像处理概述
- 央视《家有妙招》整理版,共250招,值得收藏
- 网上的PS把图片变清晰的原理
- JQuery插件validate的Remote使用
- 爱五笔iWuBi for Mac(五笔练习工具)
- Java开发岗:本硕211毕业一年,大厂面试最终拿下美团offer!献上我的面经+Java核心知识点(秋招适用)
- dc dc变换器的建模及matlab仿真,基于Matlab的AC/DC变换器的系统建模和仿真.pdf
热门文章
- JFrame,JDialog,JLabel,JButton(p228)
- SpringMVC(十三):SpringMVC 与fastjson集成
- poss八十七氟癸基/白色粉末状/溶于氟类树脂/自修复超疏水材料
- 二极管在电路设计中的应用
- 基于启发式蝙蝠算法、粒子群算法、花轮询算法和布谷鸟搜索算法的换热器PI控制器优化(Matlab代码实现)
- linux发邮件到126,Linux上,用bash通过126邮箱发邮件。
- Churchill资本集团和科睿唯安合并,将在纽交所上市
- MATLAB与VERP/Coppeliasim联合仿真:配置ZeroMQremote API
- Java中如何获取图片的长和宽
- macos 上的各种下载软件安装方式