stm32单片机+驱动L298N控制直流电机调速

您所在的位置:网站首页 l298原理图 stm32单片机+驱动L298N控制直流电机调速

stm32单片机+驱动L298N控制直流电机调速

2023-10-10 17:46| 来源: 网络整理| 查看: 265

文章目录 前言一、L298N电机驱动模块1、 使用介绍2、注意事项 二、32单片机源码main.c文件timer.c文件timer.h文件 三、接线总结

前言

暑假由于要参加一些创新比赛,所以学习了如何利用stm32单片机实现直流电机PWM调速,这篇博客记录了博主在实现直流电机PWM调速过程中32单片机源码以及遇到的一些问题。以下是本篇文章正文内容:

一、L298N电机驱动模块 1、 使用介绍

在这里插入图片描述

当驱动电压(板子背面标识为12V输入,实际可以接受的输入范围是7-12V)为7V-12V的时候,即12V电机驱动端子接通驱动电源时,插上跳线帽使用板载的78M05供给芯片的逻辑电源,指示灯亮,可以不用再外接逻辑电源;当使用板载5V供电之后,接口中的+5V供电端子不要输入电压,但是可以引出5V电压供外部使用。

当驱动电压高于12V,小于等于24V 时,比如要驱动额定电压为18V的电机。首先必须拔除板载5V输出使能的跳线帽,指示灯熄灭,不使用板载的78M05供给芯片的逻辑电源,然后在5V输出端口外部接入5V电压对L298N内部逻辑电路供电。

5V使能即一个电平为5V的控制信号,当此信号输入有效时,且电机驱动模块中电源供电正常时,电机驱动模块输出电流。否则即使电源供电正常,电机上也无电流。

L298N使能端(高电平有效,常态下用跳线帽接于VCC),可通过这两个端口实现PWM调速( 使用PWM调速时取下跳线帽)。ENA和ENB接上PWM信号,IN1、IN2、IN3、IN4正常接上高低电平使电机正转、反转或停转。

2、注意事项

L298N供电的5V如果是用另外电源供电的话,( 即不是和的电源共用),那么需要将单片机的GND和模块上的GND连接在只有这样单片机上过来的逻辑信号才有个参考0点。板载5V稳压芯片的输入引脚和电机供电驱动接线端子导通的。(这点很重要,博主因为这一点走了不少弯路)。

二、32单片机源码 main.c文件 #include "delay.h" #include "usart.h" #include "timer.h" int main(void) { delay_init(); //延迟函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组设置 uart_init(115200); //串口初始化设置 TIM3_PWM_Init(999,0); //PWM输出初始化 while(1) { //以90%的速度正转 TIM_SetCompare2(TIM3,900); GPIO_SetBits(GPIOA,GPIO_Pin_4); GPIO_ResetBits(GPIOA,GPIO_Pin_5); delay_ms(3000); //以60%的速度反转 TIM_SetCompare2(TIM3,600); GPIO_SetBits(GPIOA,GPIO_Pin_5); GPIO_ResetBits(GPIOA,GPIO_Pin_4); delay_ms(3000); } } timer.c文件 #include "timer.h" #include "led.h" #include "usart.h" //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_GPIOA, ENABLE); //使能GPIO外设时钟 //初始化IOPA4 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_4); //初始化IOPA5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_5); //初始化IOPA7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频系数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化TIM3 Channel2 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择PWM模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low ; //输出比较极性地 TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能定时器3通道2预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIM3 } timer.h文件 #ifndef __TIMER_H #define __TIMER_H #include "sys.h" void TIM3_PWM_Init(u16 arr,u16 psc); #endif

完整工程源码.

三、接线

在这里插入图片描述 IN3–PA5 IN4–PA4 ENB–PA7 L298N与32单片机共地(很重要)

总结

感谢各位的支持,有什么问题欢迎到评论区提问! 。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3