基于L298N的STM32的直流电机PWM调速控制

发布者:sheng44最新更新时间:2019-01-30 来源: eefocus关键字:L298N  STM32  直流电机  PWM  调速控制 手机看文章 扫描二维码
随时随地手机看文章

这两天研究了一下基于L298N与stm32的直流电机调速,实验结果良好,可以根据调节STM32的PWM占空比来进行直流电机的调速。实验系统图如下:

在这里插入图片描述

首先整个PWM实验选用的是stm32f103系列,驱动模块选择的是L298N驱动模块,以及12V直流电源。简单的来说,电机调速就是通过stm32输出PWM来进行控制L298N的使能端ENA。

L298N驱动模块


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

使用方法:

输出A:通道A输出,连接直流电机

输出B:通道B输出,连接电机

12V供电:主电源正极输入

GND:主电源正负极输入

5V输出:5V电压输出端,可用于给STM32开发板进行供电

ENA:通道A使能

ENB:通道B使能

IN1—IN4:逻辑输入IN1-IN2控制通道A,逻辑输入IN3-IN4控制通道B


那么好了,介绍完L298N驱动模块之后我们来看看怎么如何进行PWM的控制输出进行调速。


首先便是控制逻辑:

在这里插入图片描述

软件程序设计

电机接口初始化void Motor_Init(void)


#include "motor.h"

#include "sys.h"

#include "delay.h"

#include "usart.h"

//GPIOB13与GPIO14为电机1的控制接口

void Motor_Init(void)//电机的GPIO口的初始化

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB端口时钟


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB13与14

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB15,GPIO15作为ENA的使能输出

}


接着是PWM波输出的函数设计


#include "timer.h"

#include "usart.h"

void TIM3_Int_Init(u16 arr,u16 psc)

{

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

NVIC_InitTypeDef NVIC_InitStructure;


RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能


TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断


NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器


TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设

 

}

//定时器3中断服务程序

void TIM3_IRQHandler(void)   //TIM3中断

{

if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 

{

TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 

}

}

//TIM3 PWM部分初始化 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM3_PWM_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef  TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    

 

   //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

 

   //初始化TIM3

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//初始化TIM3 Channel2 PWM模式  

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2


TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

    TIM_Cmd(TIM3, ENABLE);  //使能TIM3

}


最后就是在主函数中通过调节占空比即可控制PWM输出给ENA来进行电机调速。


 TIM_SetCompare2(TIM3,400);

关键字:L298N  STM32  直流电机  PWM  调速控制 引用地址:基于L298N的STM32的直流电机PWM调速控制

上一篇:STM32的ETR引脚计数功能
下一篇:使用STM32CubeMx配置STM32输入捕获功能

推荐阅读最新更新时间:2024-03-16 16:23

STM32芯片UID话题
绝大多数STM32系列的芯片都在固定的地方放置了长度为96位的唯一身份识别码,简称UID,只有极少数STM32系列芯片内部没有该UID,比方超值型STM32F0x0系列,STM32F100系列。具体到哪颗芯片到底有没有UID,在芯片数据手册的首页都有明确的说明,无需猜测。如下图所以: 芯片所对应的参考手册里,有对该UID存放地址的详细介绍。地址因不同系列或子序列而不同。 关于这个UID常有人有些疑问,有几个问题在这里稍微总结下: 1、有无问题。上面说了绝大部分STM32都内置UID,具体以查看数据手册为准。 2、唯一性问题。该UID的唯一性是靠96位这个整体来保证其唯一性,你若截取部分就不保证了。 3、内容问题。有人对这个
[单片机]
<font color='red'>STM32</font>芯片UID话题
stm32 SysTick系统定时器
它是一个24位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟8分频后获取 当定时器计数到0时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数 如果开启SysTick中断的话,当定时器计数到0,将产生一个中断信号 void SysTick_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); fac_us=SYSCLK/8; //1us次数 fac_ms=(u16)fac_us*1000; //1ms次
[单片机]
<font color='red'>stm32</font> SysTick系统定时器
意法半导体新系列MCU STM32H5提升下一代智能应用的性能和安全性
意法半导体新系列MCU STM32H5提升下一代智能应用的性能和安全性 • 采用Arm Cortex-M33嵌入式微控制器内核,运行频率250MHz • 内置 STM32Trust TEE Secure Manager,让安全功能既强大又简单 2023年3月16日,中国 – 服务多重电子应用领域、全球排名前列的半导体公司意法半导体(STMicroelectronics,简称ST;)发布了STM32H5系列高性能微控制器(MCU)。 新系列产品引入STM32Trust TEE Security Manager安全技术,为智能物联网设备带来先进的安全功能。 新推出的STM32H5 MCU系列搭载Arm® 的C
[单片机]
意法半导体新系列MCU STM32H5提升下一代智能应用的性能和安全性
学习STM32C语言要达到什么水平?
学到可以看懂这句代码 *(unsigned int *)0X00000800=16; 学到可以看懂标准库(结构体、枚举、宏定义、函数形参为结构体变量的情况该怎么传值) 学到可以理解指针是C语言的精髓学到可以理解内存的重要性 而要做到这些你只需要看下面的三个视频AV50963968 AV50868642 AV80340721 吹爆我大B站 下面总结了一些操作! 1) 不改变其他位的值的状况下,对某几个位进行设值。 这个场景单片机开发中经常使用,方法就是先对需要设置的位用&操作符进行清零操作, 然后用|操作符设值。比如我要改变 GPIOA 的状态,可以先对寄存器的值进行&清零操作 GPIOA- CRL&=0XFFFFFF0F; //将
[单片机]
基于TMS320F2407的主动振动控制系统
主动振动控制具有隔振率高、适应性强、可抗强冲击振动等优点,可使关键设备在恶劣冲击振动环境下可靠工作。但是,主动振动控制系统对相位要求较为严格,要求系统具有极强的实时性,否则由于相位滞后,控制效果将会受到严重影响。因而在数字式主动振动控制系统中,通常在单片机难以达到实时性要求,本文采用高速DSP器件解决控制的实时性问题。 TMS320LF2407是TI公司专为实时控制而设计的高性能16位定点DSP器件,指令周期为33ns,其内部集成了前端采样A/D转换器和后端PWM输出硬件,在满足系统实时性要求的同时可简化硬件电路设计。本文在总线模拟主动控制系统设计作经验的基础上,设计了以TMS320F2407为核心的数字式主动振动控制系统。 1 主
[应用]
基于VHDL的16路可调速彩灯控制器设计
0 引言   近年来,FPGA/CPLD发展迅速,随着集成电路制造工艺的不断进步,高性价比的FPGA/CPLD器件推陈出新,使FPGA/CPLD成为当今硬件设计的重要途径,与传统电路设计方法相比,FPGA/CPLD具有功能强大、开发周期短、投资少,便于追踪市场变化及时修改产品设计以及开发工具智能化等特点。在诸多FPGA/CPLD的设计语言中,VHDL语言作为一种主流的硬件描述语言,具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性,并在语言易读性和层次化、结构化设计方面,表现出了强大的生命力和应用潜力。   QuartusⅡ是Altera公司在21世纪初推出的
[安防电子]
基于VHDL的16路可<font color='red'>调速</font>彩灯<font color='red'>控制</font>器设计
使用STM32的systick定时器中断实现RTC工作过程出错
开发环境:keil MDK V5.10 操作系统:windows 7(32位) 目标硬件:STM32F103C8 问题描述:使用STM32的systick定时器实现RTC功能。具体方法为systick滴答计时器配置为1ms时间间隔的滴答中断,定义一个RTC结构体,包含年、月、日、时、分、秒。在每进一次systick中断服务程序中更新一次RTC的值。主程序通过不停地获取RTC的时钟,每一秒钟使用printf函数输出当前的时间。测试过程发现绝大多数时间系统正常工作,但依然存在部分情况系统无法进行正常的输出。相关代码和测试结果如下: /** * @brief 系统滴答定时器中断服务程序,主要功能为更新实时时钟 *
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved