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

news/2024/12/25 9:55:51 标签: 嵌入式硬件, 单片机, stm32

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

野火stm32电机教学

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

PID模型

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

实验环境

【*】 程序简介 
-工程名称:步进电机-位置环控制-位置式PID
-实验平台: 野火STM32 F103 拂晓 开发板
【 !】功能简介:
位置速度环例程 默认使用从PID调试助手界面打开串口
【 !】实验操作:
下载本程序,复位开发板即可。
【 !!】注意事项:
步进电机驱动器使用32细分
/************************************************************/
步进电机驱动器接口1:
	PUL+<--->VCOM
	PUL-<--->PC6
	DIR+<--->VCOM
	DIR-<--->PE6
	ENA+<--->VCOM
	ENA-<--->PE5	
编码器与步进电机的接线
	红线+5V	<------------>VENC
	黑线GND <------------->GND
	A相蓝线	<------------>PD12
	B相绿线	<------------>PD13
	Z相黄线	<------------>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次

http://www.niftyadmin.cn/n/5798945.html

相关文章

[机器学习]sklearn入门指南(1)

简介 scikit-learn&#xff08;简称sklearn&#xff09;是一个开源的Python机器学习库&#xff0c;它提供了简单而高效的工具用于数据挖掘和数据分析&#xff0c;并且拥有一个活跃的开发社区。它建立在NumPy、SciPy和matplotlib这些科学计算库之上&#xff0c;旨在提供一致且可…

【vue】圆环呼吸灯闪烁效果(模拟扭蛋机出口处灯光)

效果图先发&#xff1a; 页面部分&#xff1a; <div ref"round" class"round"><div class"light" ref"light"/><div class"box"></div></div>js部分(控制圆环生成&#xff09;; setRound…

解释 Python 中的装饰器及其作用?

一、装饰器的基本概念 装饰器本质上是一个函数&#xff0c;它接受一个函数作为参数&#xff0c;并返回一个新的函数。 这个新的函数通常会在原函数的基础上添加一些额外的功能&#xff0c;比如日志记录、权限验证、性能统计等。 装饰器的语法糖形式为decorator_name&#xf…

微信小程序中momentjs无法切换中文问题处理

微信小程序中momentj.s无法切换中文问题处理. 表现为 使用 locale(“zh-cn”)无效。 处理方法 # 1、先删除 miniprogram_npm\moment\index.js # 2、将 node_modules\moment\min\moment-with-locales.min.js 复制到 miniprogram_npm\moment下 并重命名为index.js # 3、修改mi…

Apache解析漏洞(apache_parsing_vulnerability靶场攻略CVE-2017-15715靶场攻略)

apache_parsing_vulnerability靶场 Apache HTTPD ⽀持⼀个⽂件拥有多个后缀&#xff0c;并为不同后缀执⾏不同的指令 只要文件的后缀中存在相应的后缀&#xff0c;那么就会自动识别并执行 我们向靶场上传 111.jpg.xxx.php.gif 上传成功后会显示文件所在的路径&#xff0c;我…

JDK和JRE有什么区别?

JDK&#xff08;Java Development Kit&#xff09;和JRE&#xff08;Java Runtime Environment&#xff09;是Java开发和运行的核心组件&#xff0c;它们之间存在明显的区别。以下是对两者的详细比较&#xff1a; 一、定义与功能 JDK&#xff1a; 定义&#xff1a;JDK是Java语…

突围边缘:OpenAI开源实时嵌入式API,AI触角延伸至微观世界

当OpenAI宣布开源其名为openai-realtime-embedded-sdk的实时嵌入式API时&#xff0c;整个科技界都为之震惊。这一举动意味着&#xff0c;曾经遥不可及的强大AI能力&#xff0c;如今可以被嵌入到像ESP32这样的微型控制器中&#xff0c;真正地将AI的触角延伸到了物联网和边缘计算…

BCSP-X 2024 Scratch图形化编程 小学低年级组 真题

BCSP-X 2024-2 图形化编程 小学低年级组 真题 题目总数&#xff1a;40 总分数&#xff1a;100 选择题 第 1 题 单选题 在下面各世界顶级的奖项中&#xff0c;为计算机科学与技术领域做出杰出贡献的科学 家设立的奖项是?( ) A. 奥斯卡奖 B. 诺贝尔奖 C. 菲尔兹…