当前位置: 首页 > news >正文

步进电机位置速度双环控制实现

步进电机位置速度双环控制实现

野火stm32电机教学

提高部分-第11讲 步进电机位置速度双环控制实现(1)_哔哩哔哩_bilibili

PID模型

位置环作为外环,速度环作为内环。设定目标位置和实际转轴位置的位置偏差,经过位置PID获得位置期望,然后讲位置期望(位置变化反映了转轴的速度)和实际转轴速度作为差值,经过速度PID获得速度期望,然后控制步进电机的输入脉冲频率,调整电机转速。

实验环境

【*】 程序简介 
-工程名称:步进电机-位置环控制-位置式PID
-实验平台: 野火STM32 F103 拂晓 开发板
【 !】功能简介:
位置速度环例程 默认使用从PID调试助手界面打开串口
【 !】实验操作:
下载本程序,复位开发板即可。
【 !!】注意事项:
步进电机驱动器使用32细分
/************************************************************/
步进电机驱动器接口1:PUL+<--->VCOMPUL-<--->PC6DIR+<--->VCOMDIR-<--->PE6ENA+<--->VCOMENA-<--->PE5	
编码器与步进电机的接线红线+5V	<------------>VENC黑线GND <------------->GNDA相蓝线	<------------>PD12B相绿线	<------------>PD13Z相黄线	<------------>PD14屏蔽线()<------------>GND(没有PIN屏蔽线的可以不接)
/*************************************************************************/
【*】 时钟
A.晶振:
-外部高速晶振:8MHz
-RTC晶振:32.768KHz
B.各总线运行时钟:
-系统时钟 = SYCCLK = AHB = 72MHz
-APB2 = 72MHz 
-APB1 = 36MHz

定时器输出PWM控制步进电机

定时器8,通道1,时钟频率72MHz ,预分频因子为16,重装载值0xFFFF,

//Motor 脉冲
#define MOTOR_PUL_IRQn                  TIM8_CC_IRQn
#define MOTOR_PUL_IRQHandler            TIM8_CC_IRQHandler#define MOTOR_PUL_TIM                   TIM8
#define MOTOR_PUL_CLK_ENABLE()  		    __HAL_RCC_TIM8_CLK_ENABLE()#define MOTOR_PUL_PORT       			      GPIOC
#define MOTOR_PUL_PIN             		  GPIO_PIN_6
#define MOTOR_PUL_GPIO_CLK_ENABLE()		  __HAL_RCC_GPIOC_CLK_ENABLE()
#define MOTOR_PUL_CHANNEL_x             TIM_CHANNEL_1#define MOTOR_TIM_IT_CCx                TIM_IT_CC1
#define MOTOR_TIM_FLAG_CCx              TIM_FLAG_CC1
/*频率相关参数*/
//定时器实际时钟频率为:72MHz/TIM_PRESCALER
//具体需要的频率可以自己计算
#define TIM_PRESCALER                16 /*补充:对F103例程测试,提高分频利于位置环稳定状态*/
// 定义定时器周期,输出比较模式周期设置为0xFFFF
#define TIM_PERIOD                   0xFFFF

比较输出模式的反转模式

/********************************************************************************* @file    bsp_stepper_init.c* @author  fire* @version V1.0* @date    2019-xx-xx* @brief   步进电机初始化******************************************************************************* @attention** 实验平台:野火  STM32 F103 开发板  * 论坛    :http://www.firebbs.cn* 淘宝    :http://firestm32.taobao.com********************************************************************************/
#include "./stepper/bsp_stepper_init.h"TIM_HandleTypeDef TIM_StepperHandle;__IO uint16_t OC_Pulse_num = 65535;     //比较输出的计数值/*** @brief  中断优先级配置* @param  无* @retval 无*/
static void TIMx_NVIC_Configuration(void)
{/* 外设中断配置 */HAL_NVIC_SetPriority(MOTOR_PUL_IRQn, 0, 0);HAL_NVIC_EnableIRQ(MOTOR_PUL_IRQn);
}/*** @brief  配置TIM复用输出PWM时用到的I/O* @param  无* @retval 无*/
static void Stepper_GPIO_Config(void) 
{GPIO_InitTypeDef GPIO_InitStruct;/*开启Motor相关的GPIO外设时钟*/MOTOR_DIR_GPIO_CLK_ENABLE();MOTOR_PUL_GPIO_CLK_ENABLE();MOTOR_EN_GPIO_CLK_ENABLE();/*选择要控制的GPIO引脚*/															   GPIO_InitStruct.Pin = MOTOR_DIR_PIN;	/*设置引脚的输出类型为推挽输出*/GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;  GPIO_InitStruct.Pull =GPIO_PULLUP;/*设置引脚速率为高速 */   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;/*Motor 方向引脚 初始化*/HAL_GPIO_Init(MOTOR_DIR_GPIO_PORT, &GPIO_InitStruct);	/*Motor 使能引脚 初始化*/GPIO_InitStruct.Pin = MOTOR_EN_PIN;	HAL_GPIO_Init(MOTOR_EN_GPIO_PORT, &GPIO_InitStruct);	/* 定时器通道1功能引脚IO初始化 *//*设置输出类型*/GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;/*设置引脚速率 */ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;/*设置复用*/GPIO_InitStruct.Pull =GPIO_PULLUP;/*选择要控制的GPIO引脚*/	GPIO_InitStruct.Pin = MOTOR_PUL_PIN;/*Motor 脉冲引脚 初始化*/HAL_GPIO_Init(MOTOR_PUL_PORT, &GPIO_InitStruct);			
}/** 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有* TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,* 另外三个成员是通用定时器和高级定时器才有.*-----------------------------------------------------------------------------* TIM_Prescaler         都有* TIM_CounterMode			 TIMx,x[6,7]没有,其他都有(基本定时器)* TIM_Period            都有* TIM_ClockDivision     TIMx,x[6,7]没有,其他都有(基本定时器)* TIM_RepetitionCounter TIMx,x[1,8]才有(高级定时器)*-----------------------------------------------------------------------------*/
void TIM_PWMOUTPUT_Config(void)
{TIM_OC_InitTypeDef  TIM_OCInitStructure;  	/*使能定时器*/MOTOR_PUL_CLK_ENABLE();TIM_StepperHandle.Instance = MOTOR_PUL_TIM;    /* 累计 TIM_Period个后产生一个更新或者中断*/		///当定时器从0计数到TIM_PERIOD-1,即为TIM_PERIOD次

相关文章:

步进电机位置速度双环控制实现

步进电机位置速度双环控制实现 野火stm32电机教学 提高部分-第11讲 步进电机位置速度双环控制实现(1)_哔哩哔哩_bilibili PID模型 位置环作为外环,速度环作为内环。设定目标位置和实际转轴位置的位置偏差,经过位置PID获得位置期望,然后讲位置期望(位置变化反映了转轴的速…...

优化程序中的数据:从数组到代数

前言 我们往往都希望优化我们的程序&#xff0c;使之达到一个更好的效果&#xff0c;程序优化的一个重点就是速度&#xff0c;加快速度的一个好办法就是使用并行技术&#xff0c;但是&#xff0c;并行时我们要考虑必须串行执行的任务&#xff0c;也就是有依赖关系的任务&#…...

【电商搜索】CRM: 具有可控条件的检索模型

【电商搜索】CRM: 具有可控条件的检索模型 目录 文章目录 【电商搜索】CRM: 具有可控条件的检索模型目录文章信息摘要研究背景问题与挑战如何解决核心创新点算法模型实验效果&#xff08;包含重要数据与结论&#xff09;相关工作后续优化方向 后记 https://arxiv.org/pdf/2412.…...

使用 ffmpeg 拼接合并视频文件

按顺序拼接多个视频文件 1、创建文件清单 创建一个文本文件 filelist.txt&#xff0c;列出所有要合并的视频文件。 格式如下&#xff1a; file path/to/video1.mp4 file path/to/video2.mp4 file path/to/video3.mp42、合并文件 下载FFmpeg&#xff0c;然后使用FFmpeg进行…...

【信号滤波 (上)】傅里叶变换和滤波算法去除ADC采样中的噪声(Matlab/C++)

目录 一、ADC采样的噪声简介1.1 常见的ADC噪声来源 二、信号的时域到频域转换2.1 傅里叶变换巧记傅里叶变换 三、傅里叶变换和滤波算法工程实现3.1 使用Matlab计算信号时域到频域的变换3.2 使用Matlab去除特定频点噪声寻找峰值算噪声频率构建陷波滤波器滤除噪声频点陷波滤波器与…...

Idea内,光标显示问题

键盘误触导致光标显示为白色块 解决方式 任选其一 键盘敲击 Ins 键&#xff08;既 insert 键&#xff09;Shift 0&#xff08;数字零&#xff09;...

回顾 python3中字符串

一. 简介 前面学习了 python3中的字符串&#xff0c; 本文回顾一下 python3中的字符串。 二. python3中的字符串 1. 创建字符串 字符串是 python中最常用的数据类型。我们可以使用引号&#xff08; 或者 " &#xff09;来创建字符串。 创建字符串很简单&#xff0c…...

代码随想录day23 | leetcode 39.组合总和 40.组合总和II 131.分割回文串

39.组合总和 Java class Solution { List<List<Integer>> result new ArrayList<>();LinkedList<Integer> path new LinkedList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {Arrays.sor…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)

if语句处理多个分支时需要用if-else if结构&#xff0c;分支越多&#xff0c;嵌套的if语句层就越多&#xff0c;程序不但庞大、复杂&#xff0c;理解起来也比较困难。在C编程中&#xff0c;针对有些问题除了使用if-else if结构之外&#xff0c;还有switch语句也可以实现&#x…...

R机器学习:决策树算法的理解与实操

今天继续给大家介绍决策树算法&#xff0c;决策树本身是一种非常简单直观的机器学习算法&#xff0c;用于做分类或回归任务。它就像我们平常做决定时的过程&#xff0c;通过逐步排除可能的选项&#xff0c;最终得出结论。 A decision tree is a flowchart-like structure used …...

解锁高效学习之道:从认知升级到实践突破

目录 学习之困&#xff1a;探寻低效的根源 &#xff08;一&#xff09;迷茫之境&#xff1a;目标缺失的困扰 &#xff08;二&#xff09;表象之迷&#xff1a;浅尝辄止的学习 &#xff08;三&#xff09;行动之阻&#xff1a;执行力的短板 认知重塑&#xff1a;明晰学习的本…...

2024年12月CCF-GESP编程能力等级认证Python编程三级真题解析

本文收录于专栏《Python等级认证CCF-GESP真题解析》,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 2024年10月8日,诺贝尔物理学奖“意外地”颁给了两位计算机科学家约翰霍普菲尔德(John J. Hopfield)和杰弗里辛顿(Geof…...

.NET Core 中使用 C# 获取Windows 和 Linux 环境兼容路径合并

在 .NET Core 中使用 C# 处理路径合并并确保在 Windows 和 Linux 环境中都能正常工作&#xff0c;可以使用 System.IO.Path 和 System.IO.Path.Combine 方法。它们是跨平台的&#xff0c;能够根据操作系统自动处理路径分隔符。可以通过 System.Runtime.InteropServices.Runtime…...

【SH】Ubuntu Server 24服务器搭建MySQL数据库研发笔记

文章目录 搭建服务器在线安装1. 更新软件包列表2. 安装MySQL3. 检查MySQL状态4. 修改密码5. 新增用户6. 设置局域网访问 离线安装下载安装包 常用命令参考文档在线安装日志 搭建服务器 作者羊大侠搭建的是 Ubuntu Server 24.04 LTS 服务器环境 搭建参考文档&#xff1a;【SH】…...

编译原理复习---正则表达式+有穷自动机

适用于电子科技大学编译原理期末考试复习。 1. 正则表达式 正则表达式&#xff08;Regular Expression&#xff0c;简称regex或regexp&#xff09;是一种用于描述、匹配和操作文本模式的强大工具。它由一系列字符和特殊符号组成&#xff0c;这些字符和符号定义了一种搜索模式…...

知识图谱+RAG学习

GraphRAG&#xff08;Graph-based Retrieval-Augmented Generation&#xff09;是微软在2024年推出的一项开源技术&#xff0c;旨在通过结合知识图谱和检索增强生成&#xff08;RAG&#xff09;方法&#xff0c;为大型语言模型&#xff08;LLM&#xff09;的数据处理提供全新解…...

消息队列技术的发展历史

消息队列技术的演进历程宛如一幅波澜壮阔的科技画卷&#xff0c;历经多个标志性阶段&#xff0c;各阶段紧密贴合不同的技术需求与市场风向&#xff0c;下面为您详细道来。 第一阶段&#xff1a;消息中间件的起源&#xff08;1970 年代末期 - 1980 年代中期&#xff09; 在计算…...

每天40分玩转Django:Django部署

Django部署 一、今日学习内容概述 学习模块重要程度主要内容生产环境配置⭐⭐⭐⭐⭐settings配置、环境变量WSGI服务器⭐⭐⭐⭐⭐Gunicorn配置、性能优化Nginx配置⭐⭐⭐⭐反向代理、静态文件安全设置⭐⭐⭐⭐⭐SSL证书、安全选项 二、生产环境配置 2.1 项目结构调整 mypr…...

搭建Elastic search群集

一、实验环境 二、实验步骤 Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎Elasticsearch目录文件&#xff1a; /etc/elasticsearch/elasticsearch.yml#配置文件 /etc/elasticsearch/jvm.options#java虚拟机 /etc/init.d/elasticsearch#服务启动脚本 /e…...

解析 Ingress-Nginx 故障:排查思路与方法

文章目录 一、什么是Ingress-Nginx二、故障排除1.1Ingress-Controller日志和事件检查 Ingress 资源事件检查 Nginx 配置检查使用的服务是否存在调试日志 1.2对 Kubernetes API 服务器的认证服务认证服务账户Kube-Config 1.3使用GDB和Nginx1.4在 Nginx 4.2.5 或其他版本&#xf…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...