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代码亲测可用 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 当数据大小较小时,内存到内存 DMA 传输是否需要权衡?

    我正在学习 STM32 F4 微控制器 我正在尝试找出使用 DMA 的限制 根据我的理解和研究 我知道如果数据量较小 即设备使用DMA生成或消耗少量数据 则开销会增加 因为DMA传输需要DMA控制器执行操作 从而不必要地增加系统成本 我做了
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

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

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • STM32 GPIO工作原理详解

    STM32 GPIO介绍 1 STM32引脚说明 GPIO是通用输入 输出端口的简称 是STM32可控制的引脚 GPIO的引脚与外部硬件设备连接 可实现与外部通讯 控制外部硬件或者采集外部硬件数据的功能 以STM32F103ZET6芯片为例
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE

随机推荐

  • 雷达模拟器 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