L298N驱动步进电机,有stm32代码亲测可用

2023-05-16

1.1 步进电机相关概念

相数:产生不同对极N、S磁场的激磁线圈对数,常用 m 表示。例如:二相四线电机,就有两对极N、S磁场的激磁线圈,四个线圈。上图可知,A+,A- 是连通的,B+ 和B- 是连通的,分别记为A组、B组。在不知道电机接线图的情况下可以用万用表测试,即相互连通的为一组。

拍数:完成一个磁场周期性变化所需脉冲数或导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA,四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA。

步距角:对应一个脉冲信号,电机转子转过的角位移用θ表示。θ=360度(转子齿数J运行拍数),以常规二、四相,转子齿为50齿电机为例。四拍运行时步距角为θ=360度/(50 × 4 50\times 450×4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(50 × 8 50\times 850×8)=0.9度(俗称半步)。

定位转矩:电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以及机械误差造成的)。

静转矩:电机在额定静态电作用下,电机不作旋转运动时,电机转轴的锁定力矩。此力矩是衡量电机体积(几何尺寸)的标准,与驱动电压及驱动电源等无关。

#include "sys.h"
#ifndef _L298N_H
#define _L298N_H

#define IN1 PBout(12)
#define IN2 PBout(13)
#define IN3 PBout(14)
#define IN4 PBout(15)
#define ENA GPIO_Pin_7 //TIM3通道2,PWM通道
#define ENB GPIO_Pin_6 //TIM3通道1
#define ENAZERO  GPIOA->BSRR&=~(1<<6)
#define ENBZERO  GPIOA->BSRR&=~(1<<7)
#define ENASTART GPIOA->BSRR|=(1<<6)
#define ENBSTART GPIOA->BSRR|=(1<<7)
#define MOTOR_STEP_COUNT   400
void Static_init();
void Motor_en_init(int arr,int psc);
void Motor_speed_adjust(TIM_TypeDef* TIMx,int arr,float Dutycycle); //调节函数只针对通道一
void Stop1(void );
void Stop2(void );
void Stop_all(void );
void ZRotate1();
void ZRotate2();
void  Z_Rotate_all();
void FRotate1();
void FZRotate2();
void  F_Rotate_all();
void SetMotor(unsigned char InputData);
void Control_4();
void Control_dou4();
void Control_8();
 #endif


L298N源文件

#include "stm32f10x.h"
#include "pwm.h"
#include "L298N.h"
#include "delay.h"
 void Static_init()//全部默认为0
 {
		ENAZERO;//A电机停转
		ENAZERO;//B电机停转
 GPIO_InitTypeDef GPIO_InitStructure;
	 RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE);//使能,开启GPIOB的外设时钟
	 //IN1
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;			
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 
	GPIO_ResetBits(GPIOB,GPIO_Pin_12);	
	 //IN2
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 				
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	GPIO_Init(GPIOB, &GPIO_InitStructure);				
	GPIO_ResetBits(GPIOB,GPIO_Pin_13);				
 //IN3
	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 
	GPIO_ResetBits(GPIOB,GPIO_Pin_14);
	 //IN4
	 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;				
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 
	GPIO_ResetBits(GPIOB,GPIO_Pin_15);	
		
 }
 void Motor_en_init(int arr,int psc)
 {
	 RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);//使能,开启GPIOC的外设时钟
     ENASTART,ENBSTART;
	 TIM3_PWM_Init(arr,psc);//100HZ
//	 TIM_Cmd(TIM3, ENABLE);

 }
 //调节函数只针对通道一
 void Motor_speed_adjust(TIM_TypeDef* TIMx,int arr,float Dutycycle)
 {
 //Set_Pwm2_Dutycycle( TIM3,10000,0.5);
	 Set_Pwm2_Dutycycle( TIMx,arr,Dutycycle);
 }
 //以下函数默认电机使能,针对直流电机而言
 //一电机停止
 void Stop1( )
 {
     IN1=0;
	 IN2=0;
	 
 }
 //二电机停止
void Stop2( )
 {
     IN3=0;
	 IN4=0;
 } 
 void Stop_all()
 {
	 
     IN1=0;
	 IN2=0;
	 IN3=0;
	 IN4=0;
	 
 }
 void ZRotate1()
 {
     IN1=0;
	 IN2 =1;
	 
 }
 void ZRotate2()
 {
     IN3=0;
	 IN4=1;
 }
 //全部正转
 void  Z_Rotate_all()
 {
     IN1=0;
	 IN2 =1;
	 IN3=0;
	 IN4=1;
	 //...
 
 }
 //反转
 void FRotate1()
 {
     IN1=1;
	 IN2 =0;
	 
 }
 void FZRotate2()
 {
     IN3=1;
	 IN4=0;
 }
 //全部反转
 void  F_Rotate_all()
 {
     IN1=1;
	 IN2 =0;
	 IN3=1;
	 IN4=0;
	 
 }
  //单四拍控制通电方式
 void Control_4()
 {
 
 IN1=1,IN2=0,IN3=0,IN4=0;
		delay_ms(1);
	 IN1=0,IN2=0,IN3=1,IN4=0;
		delay_ms(1);
	 IN1=0,IN2=1,IN3=0,IN4=0;
		delay_ms(1);
	 IN1=0,IN2=0,IN3=0,IN4=1;
		delay_ms(1);
 }
 
 //双四拍控制通电方式
 void Control_dou4()
 {
 
 IN1=1,IN2=0,IN3=1,IN4=0;
		delay_ms(1);
	 IN1=0,IN2=1,IN3=1,IN4=0;
		delay_ms(1);
	 IN1=0,IN2=1,IN3=0,IN4=1;
		delay_ms(1);
	 IN1=1,IN2=0,IN3=0,IN4=1;
		delay_ms(1);
 }
 //单八拍控制通电方式,一拍0.9度
 void Control_8()
 {
 IN1=1,IN2=0,IN3=0,IN4=0;
		delay_ms(1);
		IN1=1,IN2=0,IN3=1,IN4=0;
		delay_ms(1);
		IN1=0,IN2=0,IN3=1,IN4=0;
		delay_ms(1);
		IN1=0,IN2=1,IN3=1,IN4=0;
		delay_ms(1);
		IN1=0,IN2=1,IN3=0,IN4=0;
		delay_ms(1);
		IN1=0,IN2=1,IN3=0,IN4=1;
		delay_ms(1);
		IN1=0,IN2=0,IN3=0,IN4=1;
		delay_ms(1);
		IN1=1,IN2=0,IN3=0,IN4=1;
		delay_ms(1);
 
 }
 
 
 u16  nCurrentMotorStepCount=0;
void SetMotor(unsigned char InputData)
{ 
    if(InputData&0x01)
    {      
		IN4=1;
		
    }
    else
    {
		IN4=0;
    }
 
    if(InputData&0x02)
    {
		IN2=1;
    }
    else
    {
		IN2=0;
    }
 
    if(InputData&0x04)
    {
		IN3=1;
    }
    else
    {
		IN3=0;
    }
 
    if(InputData&0x08)
    {
    
		IN1=1;
    }
    else
    {
		IN1=0;
    }
}
// unsigned char PhaseCW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//顺时针旋转相序表
// unsigned char PhaseCCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//逆时针旋转相序表
//void TIM3_IRQHandler(void)
//{
//    if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中断
//    {        
//        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIM3更新中断标志    
//  
//        nCurrentMotorStepCount++;
//                
//        if(nCurrentMotorStepCount <= MOTOR_STEP_COUNT)
//        {
//            SetMotor(PhaseCW[nCurrentMotorStepCount%8]);
//            //SetMotor(PhaseCCW[nCurrentMotorStepCount%8]);           
//        }
//               
//        if(nCurrentMotorStepCount >= MOTOR_STEP_COUNT)
//        {
//            TIM_Cmd(TIM3, DISABLE);    //关闭TIM3
//            
//            ENAZERO; //只有转的时候使能,否则持续供电,芯片和电机过热。
//            ENBZERO ;
//            nCurrentMotorStepCount = 0;
//        }
//    }     
//}
// 
 
#include "L298N.h"
#include "hbpwmdsq.h"
#include "sys.h"
int main ()
{
//	USART1_Init(115200);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init();
	SystemInit();
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA,ENABLE);//使能,开启GPIOC的外设时钟
	Static_init();
	Motor_en_init(1800,71);	//1.8ms,一拍
	while(1)
	{
	    TIM_SetCompare1(TIM3,900);
		TIM_SetCompare2(TIM3,900);

	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

L298N驱动步进电机,有stm32代码亲测可用 的相关文章

  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • rt-thread studio中新建5.0不能用

    文章目录 一 版本对比 二 文件和文件夹打斜杠 在使用RT Thread studio创建新工程5 0版本的时候 结果发现新建完成之后程序不能正常运行 但是创建4 10版本的时候却能运行 那肯定是新版本出现了BUG 一 版本对比 首先对比了
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 1.69寸SPI接口240*280TFT液晶显示模块使用中碰到的问题

    1 69寸SPI接口240 280TFT液晶显示模块使用中碰到的问题说明并记录一下 在网上买了1 69寸液晶显示模块 使用spi接口 分辨率240 280 给的参考程序是GPIO模拟的SPI接口 打算先移植到FreeRtos测试 再慢慢使用
  • 毕设开题分享 单片机智能教室系统(智能照明+人数统计)

    1 简介 Hi 大家好 今天向大家介绍一个学长做的单片机项目 单片机智能教室系统 智能照明 人数统计 大家可用于 课程设计 或 毕业设计 项目分享 https gitee com feifei1122 simulation project
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • 雷达模拟器 SPx Radar Simulator

    产品简介 SPx Radar Simulator可产生模拟雷达视频数据 xff0c 还可以获得地形高程数据 xff0c 并利用这些数据计算模拟雷达回波 用户可自定义静态及动态目标 xff0c 将模拟雷达信号源置于某个静态位置或自定义运动轨迹
  • 无人机拉力测试台螺旋桨的正确安装方式

    在使用无人机拉力测试台测试螺旋桨的拉力 扭矩和效率时 xff0c 怎样正确安装螺旋桨才能得到最准确的测试结果 xff1f 下图示意了螺旋桨的正确安装方式 xff1a 这个测试台装置的背后理论 xff0c 经过实验验证由于测试台本身造成的障碍
  • 无人机设计过程中的计算和假设

    当我们想要设计一架新的无人机时 xff0c 首先要确定我们要设计一架什么样的无人机 xff0c 例如多大的起飞重量 几个旋翼 续航时间等 无人机工程过程通常作为 设计循环 运行 xff0c 指的是设计过程的循环性质 构建无人机的第一个版本依
  • 如何计算电机极数和无刷电机的Kv值?

    介绍 如果您正在制造无人机 遥控车或任何使用无刷直流 BLDC 电机的机器 xff0c 您可能会遇到电机极数和电机Kv值的概念 这两个参数对于表征您的电机和估计其性能都很有帮助 在本文中 xff0c 我们将介绍这些指标的含义 如何计算和衡量
  • 无人机拉力测试台:15kg级-Flight Stand 15

    产品简介 Flight Stand 15测试台是多年无人机动力系统开发经验和经历数千个用户使用反馈不断优化的成果 该测试台对无人机电机和螺旋桨的拉力 xff0c 扭矩 xff0c 转速 xff0c 电流 xff0c 电压 xff0c 温度
  • 教你编写Python抢购代码

    想买mate40 xff0c 但总是抢不到 xff0c 所以想试着能不能写个脚本代码 第一步 xff1a 把想要抢购的商品加进购物车 xff0c 注意 xff1a 脚本是对购物车内全部商品进行下单操作 xff0c 所以不够买的商品最好先从购
  • Linux C/C++UDP通信实现

    文章目录 一 UDP通信流程二 代码实现1 服务器2 客户端 一 UDP通信流程 二 代码实现 1 服务器 代码如下 xff08 示例 xff09 xff1a span class token macro property span cla
  • 无人机拉力测试台:75kg级-1780系列

    产品简介 1780系列测试台是专为无人机设计师的简化测试需求而设计 xff0c 同时配有易于使用的支持手动控制功能的操作软件 xff0c 并支持设计师使用定制的预编写脚本实现自动化测试 测量结果完成后可以实时保存并导出到 CSV格式文件 试
  • 无人机拉力测试台:5kg级-1580测试台

    产品简介 1580测试台对无人机动力系统的无刷电机和螺旋桨进行测试 xff0c 测量高达5kgf的拉力和2Nm的扭矩 xff0c 以及电压 xff0c 电流 xff0c 功率 xff0c 电机转速 xff0c 振动和效率 该测试台大大减少了
  • 共轴双旋翼无人机动力测试解决方案

    前言 与传统的多旋翼无人机架构相比 xff0c 共轴式多旋翼无人机具有结构紧凑 上下旋翼反转扭矩相消和良好的操控性等优势 xff0c 同时可以为整机提供更大的动力 xff0c 尤其在直升机领域 xff0c 共轴双旋翼的设计受到了越来越多军工
  • 航空数据链协议解析与仿真测试

    航空数据链概述 航空数据链通信是指飞机和地面站系统之间一种数字通信技术 该技术通过使用互连路由器和终端系统的航空电信网络 ATN xff0c 以及作为空中 地面数据链技术的VHF数字链路模式2 VDL mode 2 VDL2 来实现管制员与
  • 无人机拉力测试台研制&测试过程中的9个关键技术点

    随着近年来无人机行业的飞速迭代发展 xff0c 越来越多的相关从业人员选择使用拉力测试台来测试并优化无人机的动力系统 xff0c 本文尝试从无人机拉力测试台的研制和使用角度来阐述无人机拉力测试中的9个关键技术点 1 电磁干扰方面的考虑 测试
  • 无人机动力系统优化测试平台-15kg级-Flight Stand 15

    产品简介 通过Flight Stand 15测试台对电机和螺旋桨的拉力 xff0c 扭矩 xff0c 转速 xff0c 电流 xff0c 电压 xff0c 温度 xff0c 空速 xff0c 螺旋桨效率和电机效率的测量帮助您精准地描述和评估
  • 无人机飞行控制实验平台

    无人机在研制过程中需要不断地进行飞行测试 xff0c 而测试的过程不是万无一失的 xff0c 飞行过程中发生任何错误都有可能会导致无人机的损毁或破坏 xff0c 更严重地甚至会造成外界伤害 基于此我们推出了无人机的三旋转自由度 3 DOF
  • ADS-B教学实验方案

    ADS B教学系统是为了让学生学习ADS B原理 ADS B系统组成 ADS B信号处理技术 可以通过ADS B教学系统进一步研究分析ADS B位置的精度 准确性 稳定性 实时性 xff0c 设计基于ADS B的空中碰撞告警系统 xff0c
  • ROS系列:工作空间及功能包创建

    前言 分享一下ROS开发的基础教程 xff0c 全部自己手敲 xff0c 希望能帮到正在学习的你 ROS在WIKI上也有教程 xff0c 个人觉得太过臃肿 xff0c 可以简化点 xff0c 毕竟大家都赶着投胎 xff0c 哈哈哈哈哈 一
  • java UDP DatagramSocket接收不到数据

    今天联系这个通信 xff0c 接收端总是接收不到数据 xff01 排除代码本身有可能出现的错误 xff0c 比如地址 xff0c 数据宝包 我称它为数据宝宝 xff09 等等自己粗心的错误后还是不行 xff0c 我查看各种方法 xff0c
  • Python与爬虫有什么关系?

    爬虫一般是指网络资源的获取 xff0c 因为python的脚本特征 xff0c Python易于配置 xff0c 对字符的处理也非常灵活 xff0c 加上python有丰富的网络抓取模块 xff0c 所以两者经常联系在一起 接下来我们可以详
  • C++中struct和class的区别

    1 C 43 43 中struct和class的区别 C 43 43 中的struct其实是为了与C的兼容性而留下来的 C 43 43 的struct和class其实大部分都是相同的用法 xff0c 基本上可以用class做的事都可以用st
  • L298N驱动步进电机,有stm32代码亲测可用

    1 1 步进电机相关概念 相数 xff1a 产生不同对极N S磁场的激磁线圈对数 xff0c 常用 m 表示 例如 xff1a 二相四线电机 xff0c 就有两对极N S磁场的激磁线圈 xff0c 四个线圈 上图可知 xff0c A 43