步进电机控制

news2024/11/27 4:14:17

步进电机控制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include "./stepper/bsp_stepper_init.h"
#include "./delay/core_delay.h"   
#include "stm32f4xx.h"

void TIM_SetTIMxCompare(TIM_TypeDef *TIMx,uint32_t channel,uint32_t compare);
void TIM_SetPWM_period(TIM_TypeDef* TIMx,uint32_t TIM_period);

TIM_HandleTypeDef TIM_TimeBaseStructure;
__IO uint16_t OC_Pulse_num = 200;     //比较输出的计数值


/**
  * @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.Alternate = MOTOR_PUL_GPIO_AF;
  /*设置复用*/
  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_TimeBaseStructure.Instance = MOTOR_PUL_TIM;    
  /* 累计 TIM_Period个后产生一个更新或者中断*/    
  //当定时器从0计数到TIM_PERIOD-1,即为TIM_PERIOD次,为一个定时周期
  TIM_TimeBaseStructure.Init.Period = TIM_PERIOD-1; 
  // 通用控制定时器时钟源TIMxCLK = HCLK=168MHz 
  // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=1MHz
  TIM_TimeBaseStructure.Init.Prescaler = 168-1;                

  /*计数方式*/
  TIM_TimeBaseStructure.Init.CounterMode = TIM_COUNTERMODE_UP;            
  /*采样时钟分频*/  
  TIM_TimeBaseStructure.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;   
  TIM_TimeBaseStructure.Init.RepetitionCounter = 0 ;      
  /*初始化定时器*/
  HAL_TIM_OC_Init(&TIM_TimeBaseStructure);

  /*PWM模式配置--这里配置为输出比较模式*/
  TIM_OCInitStructure.OCMode = TIM_OCMODE_TOGGLE; 
  /*比较输出的计数值*/
  TIM_OCInitStructure.Pulse = OC_Pulse_num;                    
  /*当定时器计数值小于CCR1_Val时为高电平*/
  TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH;          
  /*设置互补通道输出的极性*/
  TIM_OCInitStructure.OCNPolarity = TIM_OCNPOLARITY_LOW; 
  /*快速模式设置*/
  TIM_OCInitStructure.OCFastMode = TIM_OCFAST_DISABLE;   
  /*空闲电平*/
  TIM_OCInitStructure.OCIdleState = TIM_OCIDLESTATE_RESET;  
  /*互补通道设置*/
  TIM_OCInitStructure.OCNIdleState = TIM_OCNIDLESTATE_RESET; 
  HAL_TIM_OC_ConfigChannel(&TIM_TimeBaseStructure, &TIM_OCInitStructure, MOTOR_PUL_CHANNEL_x);

  /* 确定定时器 */
  HAL_TIM_Base_Start(&TIM_TimeBaseStructure);
  /* 启动比较输出并使能中断 */
  HAL_TIM_OC_Start_IT(&TIM_TimeBaseStructure,MOTOR_PUL_CHANNEL_x);
  /*使能比较通道*/
  TIM_CCxChannelCmd(MOTOR_PUL_TIM,MOTOR_PUL_CHANNEL_x,TIM_CCx_ENABLE);

}

/**
  * @brief  定时器中断函数
  * @note     无
  * @retval 无
  */
void MOTOR_PUL_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&TIM_TimeBaseStructure);
}

/**
  * @brief  定时器比较中断
  * @param  htim:定时器句柄指针
  * @note     无
  * @retval 无
  */
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
  __IO uint16_t count;
  
  /*获取当前计数*/
  count=__HAL_TIM_GET_COUNTER(htim);
  /*设置比较数值*/
  __HAL_TIM_SET_COMPARE(htim, MOTOR_PUL_CHANNEL_x, count + OC_Pulse_num);

}

/**
  * @brief  设置TIM通道的占空比
  * @param  channel   通道  (1,2,3,4)
  * @param  compare   占空比
  * @note   无
  * @retval 无
  */
void TIM8_SetPWM_pulse(int channel,int compare)
{
  switch(channel)
  {
    case 1:   __HAL_TIM_SET_COMPARE(&TIM_TimeBaseStructure,TIM_CHANNEL_1,compare);break;
    case 2:   __HAL_TIM_SET_COMPARE(&TIM_TimeBaseStructure,TIM_CHANNEL_2,compare);break;
    case 3:   __HAL_TIM_SET_COMPARE(&TIM_TimeBaseStructure,TIM_CHANNEL_3,compare);break;
    case 4:   __HAL_TIM_SET_COMPARE(&TIM_TimeBaseStructure,TIM_CHANNEL_4,compare);break;
  }
}



/**
  * @brief  引脚初始化
  * @retval 无
  */
void stepper_Init()
{
  /*电机IO配置*/
  Stepper_GPIO_Config();
  /*定时器PWM输出配置*/
  TIM_PWMOUTPUT_Config();
  /*中断配置*/
  TIMx_NVIC_Configuration();
}



#ifndef __BSP_STEP_MOTOR_INIT_H
#define __BSP_STEP_MOTOR_INIT_H

#include "stm32f4xx.h"
#include "stm32f4xx_hal.h"

/*宏定义*/
/*******************************************************/

//Motor 方向
#define MOTOR_DIR_PIN                   GPIO_PIN_1
#define MOTOR_DIR_GPIO_PORT             GPIOE
#define MOTOR_DIR_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOE_CLK_ENABLE()

//Motor 使能
#define MOTOR_EN_PIN                    GPIO_PIN_0
#define MOTOR_EN_GPIO_PORT              GPIOE
#define MOTOR_EN_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOE_CLK_ENABLE()

//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()          __TIM8_CLK_ENABLE()

#define MOTOR_PUL_PORT                  GPIOI
#define MOTOR_PUL_PIN                   GPIO_PIN_5
#define MOTOR_PUL_GPIO_CLK_ENABLE()     __HAL_RCC_GPIOI_CLK_ENABLE()

#define MOTOR_PUL_GPIO_AF               GPIO_AF3_TIM8
#define MOTOR_PUL_CHANNEL_x             TIM_CHANNEL_1

// 定义定时器周期,输出比较模式周期设置为0xFFFF
#define TIM_PERIOD                   0xFFFF


extern void TIMx_Configuration(void);
extern void TIM8_SetPWM_pulse(int channel,int compare);


/************************************************************/
#define HIGH GPIO_PIN_SET       //高电平
#define LOW  GPIO_PIN_RESET     //低电平

#define ON  LOW                 //开
#define OFF HIGH                //关

#define CW  HIGH                //顺时针
#define CCW LOW                 //逆时针

//控制使能引脚
/* 带参宏,可以像内联函数一样使用 */
#define MOTOR_EN(x)         HAL_GPIO_WritePin(MOTOR_EN_GPIO_PORT,MOTOR_EN_PIN,x)
#define MOTOR_PLU(x)        HAL_GPIO_WritePin(MOTOR_PUL_GPIO_PORT,MOTOR_PUL_PIN,x)
#define MOTOR_DIR(x)        HAL_GPIO_WritePin(MOTOR_DIR_GPIO_PORT,MOTOR_DIR_PIN,x)

extern void stepper_Init(void);
extern void stepper_turn(int tim,float angle,float subdivide,uint8_t dir);
#endif /* __STEP_MOTOR_INIT_H */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/764381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python爬虫学习笔记(五)————JsonPath解析

目录 1.JSONPath —— xpath在json的应用 2.JSONPath 表达式 3.jsonpath的安装及使用方式 4.jsonpath的使用 5.JSONPath语法元素和对应XPath元素的对比 6.实例 (1)商店案例 (2) 解析淘票票的“城市选择”数据 1.JSONPath…

Java8实战-总结3

Java8实战-总结3 基础知识流多线程并非易事 默认方法 基础知识 流 几乎每个Java应用都会制造和处理集合。但集合用起来并不总是那么理想。比方说,从一个列表中筛选金额较高的交易,然后按货币分组。需要写一大堆套路化的代码来实现这个数据处理命令&…

cocos creator Richtext点击事件

组件如图 添加ts自定义脚本,定义onClickFunc点击方法: import { Component, _decorator} from "cc";const { ccclass } _decorator; ccclass(RichTextComponent) export class RichTextComponent extends Component{public onClickFunc(even…

reggie优化02-SpringCache

1、SpringCache介绍 2、SpringCache常用注解 package com.itheima.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.itheima.entity.User; import com.itheima.service.UserService; import lombok.extern.slf4j.Slf4j; imp…

Mybatis:传参+提交事务(自动or手动)+sql多表关联查询(两种方法)

目录 一、参数两种类型: 二、传参的几种方法: 三、提交事务 四、sql多表关联查询(两种方法) 一、参数两种类型: 1.#{参数}:预编译方式,更安全,只用于向sql中传值; select * from admin w…

getattr, __getattr__, __getattribute__和__get__区别

一、getattr() 和另外三个方法都是魔法函数不同的是,getattr()是python内置的一个函数,它可以用来获取对象的属性和方法。例子如下: class A():a 5def __init__(self, x):self.x xdef hello(self):return hello funca A(10)print(getattr(a, x)) #…

2023 双非本科三个月互联网找实习心路历程

双非本科三个月互联网找实习心路历程 1、实习面试准备2、面试日历(1)开发投递(2)线下宣讲(3)转投测试,机会多多 3、同窗现状4、货拉拉 offer 的故事5、我的闲言6、我的收获(1)勇气&a…

2.5 线性表的建表

1. 顺序表建表 #include <iostream>/// <summary> /// 数组最大长度 /// </summary> const int MAX_SIZE 10;/// <summary> /// 顺序表建表 /// </summary> /// <param name"arr">数组</param> /// <param name"…

万达商管IPO:看似轻舟已过万重山,实则负重前行?

近日&#xff0c;继万达商管债券发行计划被终止、证监会质疑万达商场销售数据真实性、珠海万达商管的股权被法院冻结后又解冻&#xff0c;万达商管又遇“水逆”——惠誉发布报告下调万达商管的评级&#xff0c;并认为珠海万达商管可能无法在2023年底前完成上市。 纷至沓来的负…

什么是链路跟踪 Skywarking

什么是链路跟踪 Skywarking 链路跟踪&#xff08;Link Tracing&#xff09;是一种用于追踪分布式系统中请求路径和性能的技术。SkyWalking 是一个开源的 APM&#xff08;Application Performance Monitoring&#xff09;系统&#xff0c;它提供了链路跟踪功能。 SkyWalking 的…

ceph----应用

文章目录 一、创建 CephFS 文件系统 MDS 接口1.1 服务端操作1.2 客户端操作 二、创建 Ceph 块存储系统 RBD 接口三、OSD 故障模拟与恢复 一、创建 CephFS 文件系统 MDS 接口 1.1 服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node0…

Java编程-基本排序算法

冒泡排序 图解 &#xff08;注&#xff1a;图片来源网络&#xff09; Java代码 package suanfa_Ja;import org.apache.hadoop.security.SaslOutputStream;// 基本排序算法&#xff0c;冒泡排序 时间复杂度 O(n^2) 空间复杂度O(1) public class BubbleSort {public static v…

blender 建模马拉松

效果展示 蘑菇模型创建&#xff1a; 创建蘑菇头 shift A &#xff0c;创建立方体&#xff1b; 右下工具栏添加细分修改器&#xff08;视图层级&#xff1a;2&#xff0c;渲染&#xff1a;2&#xff09;&#xff1b;tab键进入编辑模式&#xff0c;alt z 进入透显模式&…

Python项目依赖项管理的秘诀:requirements.txt文件

一、背景 公司里面很多时候我们开发的Python项目都不只是我们一个人使用&#xff0c;而是整体团队使用。Python项目需要在别人的电脑环境中运行&#xff0c;则需要别人的电脑环境中也要安装上我们项目需要的python库。那么项目中到底用到了哪些Python库&#xff0c;每个库具体…

12.matlab数据分析——多项式的建立 (matlab程序)

1.简述 多项式及其建立 在运算中我们经常接触到的就是所谓的多项式&#xff0c;比如很常见的一个多项式&#xff1a; 这里我们就说这是一个x的多项式&#xff0c;最高次是2次&#xff0c;常数项是3&#xff0c;二次项的系数是1&#xff0c;一次项的系数是2&#xff0c;相信这些…

流程管理是什么?“流程管理”到底管什么?

流程管理&#xff08;process management&#xff09;&#xff0c;是一种以规范化的构造端到端的卓越业务流程为中心&#xff0c;以持续的提高组织业务绩效为目的的系统化方法。 任正非曾在一次访谈时说到&#xff1a; “权力要放进流程中&#xff0c;流程才有权力&#xff0c…

【Django学习】(十四)自定义action_router

之前我们的视图类可以继承GenericViewSet或者ModelViewSet&#xff0c;我们不用再自定义通用的action方法&#xff0c;但是有时候我们需要自定义action&#xff0c;我们该如何设计呢&#xff1f; 自定义action 1、手写视图逻辑 1.1、先在视图集里自定义action方法&#xff0…

LeetCode 790. 多米诺和托米诺平铺 - 二维空间的动态规划

多米诺和托米诺平铺 中等 304 相关企业 有两种形状的瓷砖&#xff1a;一种是 2 x 1 的多米诺形&#xff0c;另一种是形如 “L” 的托米诺形。两种形状都可以旋转。 给定整数 n &#xff0c;返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。 平铺指的是每个…

icp许可证 办理流程(icp资质申请条件)

icp许可证 办理流程(icp资质申请条件)是什么&#xff1f; ICP经营许可证是可以线上无忧办理的&#xff0c;包下证&#xff0c;流程也很简单&#xff0c;只需要你提供企业营业执照、法人身份证这些基础材料就可以。加急10-20工作日拿证&#xff0c;普通20-60工作日拿证。 在了解…

使用Vue的插件clipboard使用复制功能

1.安装clipboard插件 npm install clipboard 2.使用 clipboard <template><div style"margin-right: auto;margin-left: auto; 800px"><el-table :data"list"><el-table-column label"搜索引擎" prop"name"&g…