前言

今天这里主要是讲一下L298N电机驱动和PWM调速,之后再进行一番实际操作,那么废话不多说,直接进入主题。


一、L298N电机驱动主要介绍

主要I/O口

使能端ENA和ENB,控制输入端INA、INB、INC、IND,马达输出口OUT1、OUT2、OUT3、OUT4,5V输出(可以不接),还有一个板载5V电压,具体如下图所示:


二、控制实现功能

对于L298N模块,直接给12V输入,接上地,就可以给整个模块供电了,之后就是通过控制单片机(这里用的是STM32f1)给4个输入端(INA、INB、INC、IND)控制输入高低电平了

注意:ENA和ENB一般情况下会有两个跳线帽连着,这是直接连上高电平,只有给高电平,这才能让四个输入端(INA、INB、INC、IND)口去控制四个输出(OUT1、OUT2、OUT3、OUT4)进而直流电机状态。特别注意GND是电源和单片机一起共地!

下面为真值表:


三、PWM调速实现

这里就不再是把ENA、ENB再接上高电平了,这个时候就要把跳线帽拔掉了,在通过定时器来控制实现PWM调速,具体先上代码:

#include "timer.h"#define Ina PGout(2)
#define Inb PGout(3)
#define Inc PGout(4)
#define Ind PGout(5)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);   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG,ENABLE); 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通道2GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//TIM3通道1GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      GPIO_Init(GPIOG, &GPIO_InitStructure);                   GPIO_ResetBits(GPIOG,GPIO_Pin_2);                  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       GPIO_Init(GPIOG, &GPIO_InitStructure);             GPIO_ResetBits(GPIOG,GPIO_Pin_3);                       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;               GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       GPIO_Init(GPIOG, &GPIO_InitStructure);                  GPIO_ResetBits(GPIOG,GPIO_Pin_4);                      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       GPIO_Init(GPIOG, &GPIO_InitStructure);                  GPIO_ResetBits(GPIOG,GPIO_Pin_5);                      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);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure);  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure);  TIM_Cmd(TIM3, ENABLE);  }

上面这段代码主要是定时器TIM3的初始化以及四个输入端的初始化,至于那个预分配系数psc和自动重装值arr可以自己设定,这里我设定的是arr=450,psc=7199;大家可以自己调试,这里不细讲。

然后把PA6,PA7分别连接到ENA和ENB上,设置好arr和psc,最后通过TIM_SetComparex函数设置占空比即可实现PWM调速功能


四、整体关键代码和马达连接图

剩下一下重要代码如下:

void qianjin(void)
{TIM_SetCompare2(TIM3,100);//设置通道2的占空比实现PWM调速,这里是100,在0~450间,越小速度越快TIM_SetCompare1(TIM3,100);//设置通道1的占空比实现PWM调速Ina=1;Inb=0;Inc=1;Ind=0;
}
void houtui(void)
{TIM_SetCompare2(TIM3,100);TIM_SetCompare1(TIM3,100);Ina=0;Inb=1;Inc=0;Ind=1;
}
void zuozhuan(void)
{TIM_SetCompare2(TIM3,100);TIM_SetCompare1(TIM3,100);Ina=0;Inb=0;Inc=1;Ind=0;
}
void youzhuan(void)
{TIM_SetCompare2(TIM3,100);TIM_SetCompare1(TIM3,100);Ina=1;Inb=0;Inc=0;Ind=0;
}
void stop(void)
{TIM_SetCompare2(TIM3,100);TIM_SetCompare1(TIM3,100);Ina=0;Inb=0;Inc=0;Ind=0;
}

主函数:

int main(void){  vu8 key=0;delay_init();        //    LED_Init();           //KEY_Init(); //TIM3_PWM_Init(450,7199);while(1){key=KEY_Scan(0);  //通过按键简单实现if(key){                         switch(key){              case WKUP_PRES:    LED0=0;qianjin();break; case KEY1_PRES:    // qianjin();delay_ms(5000);delay_ms(5000);delay_ms(5000);houtui();delay_ms(5000);delay_ms(5000);delay_ms(5000);break;case KEY0_PRES:   LED0=1;stop();break;}}else delay_ms(10); }
}

以上是简单的代码实现,大家可以根据自己实际情况调整修改

下面是实物连接图:

这里用另一个L298N来连接,原理一样的,我另外那个红色版的螺丝不好拧,就暂且用这个,这里我用这个电机驱动4个马达,特别注意单片机和电机上的GND是连在一起的!

那个连接单片机的图片就不发了,具体按上述代码操作,不明白的地方可以留言或者哪里写的不对欢迎指正,谢谢!

题外话:

挺喜欢彭于晏说的一句话:“我就是没有才华,所以才用命去拼!”

学习32之路固然辛苦,但要是坚持下来了,那不是很酷?哈哈哈

STM32f1之L298N电机驱动+PWM调速(附主代码)相关推荐

  1. 基于MSP430f5529 编码电机测速 接收脉冲数 PWM调速 CCS编译器 代码分析

    前言:2022年TI杯大学生电子设计竞赛,小车跟随行驶系统(C题)要求:设计一套小车跟随行驶系统,采用TI的MCU,由一辆领头小车和一辆跟随小车组成,要求小车具有循迹功能,且速度在0.3~1m/s可调 ...

  2. 基于stm32与l298n的直流电机pwm调速(二)

    在上一博文中说了直流电机驱动板的电路原理,现在具体说一下直流电机的调速原理以及代码实现,亲测调速有效. 首先说一下接线,l298n可以控制两路直流电机,在这里仅测试一路,看一下l298n的控制逻辑以及 ...

  3. [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题

    [问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题 参考文章: (1)[问题解决]不使用PWM调速系统,彻底解决一个L298N带动两个电机却转速不同的问题 (2)ht ...

  4. 51单片机的直流电机PWM调速控制系统(附Proteus仿真+C程序等全套资料)

    设计思路 直流电机PWM控制系统的主要功能包括:很实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部 ...

  5. STM32蓝牙小车以及PWM调速

    STM32蓝牙遥控小车 基于STM32F103系列的蓝牙控制小车以及PWM调速 代码下载 HC-06蓝牙模块 使用蓝牙模块前,需要先对其进行一些设置: 使用USB转TTL模块将蓝牙模块连接到电脑,蓝牙 ...

  6. pwmc语言调速程序_51单片机的直流电机PWM调速系统设计,正转反转,加减速,急停等,仿真和代码...

    设计思路 直流电机PWM控制系统的主要功能包括:实现对直流电机的加速.减速以及电机的正转.反转和急停,并且可以调整电机的转速,能够方便的实现电机的智能控制. 主体电路:即直流电机PWM控制模块.这部分 ...

  7. pwm调速流程图小车_PWM调速+循迹__智能小车程序

    //T0 产生双路 PWM 信号, L298N 为直流电机调速, 接 L298N 时相应的管脚上最好接上 10K 的上拉电阻. /* 晶振采用 12M, 产生的 PWM 的频率约为 100Hz */ ...

  8. 51 PWM调速蓝牙小车

    文章目录 前言 一.硬件配置 二.相关接线 1.L298N驱动模块 2.HC-05蓝牙模块 3.接线图解 三.PWM调速 四.完整代码 总结 前言 当你看到无人机升天.平衡车的落地以及超声波避障等技术 ...

  9. PIC16 F887 单片机 直流电机PWM调速 PID调速 PID算法

    直流电机PWM调速:使用将直流电机转速转换为脉冲频率,测量出电机的转速,与写入到单片机的EEPROM里的脉冲设定值进行比较产生偏差,若偏差为正值则电机减速,偏差为负值则加速,并在LCD上显示电机的转速 ...

最新文章

  1. 如何用Python快速抓取Google搜索?
  2. 回调函数的意义以及python实现
  3. 2017计算机应用+简答,2017计算机应用基础试题及答案
  4. origin数据平滑_研发工程师必备:20条实用origin技能,让作图效率飞起来
  5. html图片往左,如何用js把一张图片由右向左展开?
  6. 苹果电脑基本设置+Linux 命令+Android 实战集锦
  7. 使用faker生成测试数据
  8. 爪哇国新游记之二十八----从url指定的地址下载文件到本地
  9. ssh图示+hibernate图示
  10. R语言介绍(R包与帮助文档)
  11. HTML5CSS3网页设计仿微信通讯录页
  12. GitHub的简介翻译(草稿)
  13. C语言绘图示例-繁花图案
  14. Python:for...in range() 、 for...in enumerate() 、for...in() 、for...in zip()的用法
  15. 怎样判断一个exe可执行程序是32位的还是64位的
  16. 【FPGA知识点】八段共阳极数码管编码表
  17. C++——求平均数、求和函数
  18. 如何做成功的项目经理
  19. MPAndroidChart使用(个人笔记)
  20. Linux 上生成 SSL 证书

热门文章

  1. 算法进阶面试题07——求子数组的最大异或和(前缀树)、换钱的方法数(递归改dp最全套路解说)、纸牌博弈、机器人行走问题
  2. java正则表达式验证标点符号
  3. web网页制作期末大作业——蓝色的异清轩个人博客(6页) 个人博客模板源码异清轩博客
  4. 10019---CSS Grouping Selectors(分组和嵌套)
  5. 文档管理利器--云脉文档自动分类快速检索
  6. 自定义UpsertStreamTableSink
  7. Android 设置边距总结
  8. IT运维如何应对SOX挑战?
  9. 架构师速成4.4-我该学什么语言
  10. 声声慢 - 程序人生(程序员生活的真实写照)