stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码

一、传统开头介绍一下L298N电机驱动模块

stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第1张图片
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。
该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。

原理图

stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第2张图片

二、话不多嗦,直接上接线图

stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第3张图片

这个单片机是自己焊的,芯片用的是STM32F103VET6,反正用什么芯片都是大同小异啦
来解释一下我的接线图:
红色框 1. 接一个直流减速电机正反不用在意,正转反转都是自己决定的
红色框 2. 这里是外部供电12V的电源给这个L298N,和红色框3的GND一起焊接在一个接口上
红色框 3. 就是一个GND,用杜邦线插进去另一端和板子上的GND接上,和单片机共地
红色框 4. 这是一个输出5V啦,接在板子上的5V引脚,就当给板子供电了,这样也不用单片机单独供电了
红色框 5. 这里有三个引脚(INA,IN1,IN2)下面详细讲一下

stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第4张图片
PA8 : 这里直接用stm32f103vet6默认的TIM1时钟引脚,也可以将TIM1映射到其他引脚(当然不是什么引脚都行),为了写工程简单一点这里也没有改
PE11、PE10:这两个引脚倒是可以在工程中随便改成什么引脚都行,只是分别输出高低电平给IN1和IN2的,为了让电机转起来
5V : 这里就靠L298N供电给单片机啦,单片机上面的接口就不用接电源了
GND :单片机GND和L298N共地,为了方便这里强行用了杜邦线接过去

三、接线细节图

stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第5张图片
来讲一讲这三个引脚的情况
1、INA使能买来时本身是有一个短接帽的,把短接帽去掉,靠近板子里面的引脚就是一个5V供电,靠近板子外面的就是INA使能啦,这个接到单片机的PA8上,用TIM1产生PWM输出来让电机从慢到快,在从快到慢转
2、IN1就给一个高电平(3.3V),IN2就给一个低电平(GND),反过来IN2高,IN1低也行,但是不能同高同低,这样是制动状态,电机是不会转的

四、接下来是代码部分了


这里我学的是野火哥的工程模板,用的原子哥的PWM例程移植过来,野火哥的教程里面没有PWM的讲解,我就用原子哥的教程抄作业抄了一个PWM输出啦,哈哈哈…(留下了没有技术的眼泪)


stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第6张图片
先讲一下工程里面的东西,工程模板设计格式是按照野火stm32教程入门篇的工程模板(我觉得这种布局挺好的,适合新手),我们自己写的代码主要在User中,其他的都是固件库或者编译生成的文件

接下来打开User里面看看放了什么

stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第7张图片
1.led:这里本来想用led灯来显示一下电机现在正转还是反转的后来嫌自己怪多事的,就没有使用上
2.power:本来写的是PE10、PE11接到IN1、IN2,INA直接用短接帽使能的测试电机转不转的代码,后来就整合到pwm里面去了,也没有用上(我还懒得删除)
3.pwm:这个就是主要的,使用晶振生成定时器TIM1的pwm输出啦
4.SysTick:从野火例程里面偷来的系统时钟代码,拿来延时用(小声BB)
5.main.c:主函数啦等下具体代码看一下
6.stm32f10x_conf.h:全部外设的头文件集合地
7.stm32f10x_it.c:全部中断的集合地(也可以不放在这里,放在这里方便管理而已)
7.stm32f10x_it.h:stm32f10x_it.c的头文件(这个…就这样解释吧)

代码详细情况

前面说到我们只用了User中的pwm和SysTick,SysTick就没啥好说的啦,可以去找野火哥的教程有教学,看看我们自己写的pwm咋样

(1)-----“pwm.h”
stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第8张图片

这个pwm的头文件仔细一看也没啥好说的,大家看看就明白了用了pwm.c中用了–PE10、PE11、PA8

(2)-----“pwm.c”
stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第9张图片

上面是TIM1时钟的配置情况:
1、先定义三个结构体
2、打开TIM1和GPIOA的晶振
3、再配置一下INA嘛,上面的注释有些问题,又是PE13又是PE11的,其实是我PA8哒,大家知道就好了
4、下面的开始的自动重装载值和定时器分频什么的,以及定时器模式的选择在正点原子的stm32教程里面都有讲解,这里就不重复讲了
stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第10张图片

这个是40行以后的代码,其实也就是User中power.c放在pwm.c的代码部分作用是:
使能和初始化PE10和PE11

(3)-----“mian.c”

stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第11张图片

1、三个头文件要记得调用的嘛
2、mian开始的时候时钟已经被8M的晶振倍频为72M了
3、顺便初始化一下函数
4、IN1的PE11拉高,IN2的PE10拉低,给电机驱动模块L298N高低电平可以驱动电转动
5、TIM1_PWM_Init()这个比较重要带图一起讲

五、图文解释

stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第12张图片
接下来是我个人的理解


一、TIM1_PWM_Init()这里有两个参数arr和psc,arr是自动重装载值,psc是分频数
为什么是(899,0)呢
899=900-1,0=1-1,这里自动重装载值其实是900,分频数其实是1,也就是不分频,至于要把值减一的原因,估计是计数是从0开始,所以要减一。


二、为什么PWM频率:是72M除以arr重装载值呢(感觉回到了小学算术题)
1.主函数开始系统时钟已经被8M的HSE晶振倍频为72M了
—72MHz=72000KHz=72000000Hz相当于1秒中可以记72000000次数,72000000次/每秒

2.定时器TIM1的900重装载值arr我理解为记900次数为一个周期

3.那么72MHz记1次数需要的时间是 1/72000000秒,
—记900次数需要 900/72000000秒=0.0000125s=12.5us

4.f=1/T,频率等于1除以一周期需要的时间 ,
—那么 TIM1的频率为 f = 1 / 0.0000125s = 80000Hz = 80KHz

5.总的来说,就是晶振记数太快了,把一次记数比喻成向领导上报一次,你记一次就上报一次领导都烦了,我不让你那么快,我让晶振记了900次才来向我上报一次,把频率降下来就是我的PWM频率


三、说了那么多我上面的图是干嘛的啊
stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第13张图片(真的灵魂画手)

我们知道了TIM1频率是怎么来的,接下来看看CCRx(捕获寄存器)是什么东西了
1、CCRx在主函数代码里面是pwmval初始值为0,在代码里面也是一直递增然后递减然后又递增又再次递减一直循环,从0开始1,2,3,4,5……800,然后又799,798,796,……,3,2,1,0

2、TIM_SetComparex(TIM_TypeDef* TIMx, uint16_t Compare1)这个函数就是修改占空比的,
接下来告诉你们它是如何修改占空比
x在代码里面是1也就是TIM1嘛,后面的Compare1就是你要修改的CCRx捕获寄存器

那么就不得不说一下定时器的模式选择了
在这里插入图片描述
这里简单来说:(默认选择了向上计数,有效电平为高电平,这两个都可以在代码里面设置)
TIM_OCMode_PWM1—也就是模式1,意思上面图定时器CNT从0开始计数一直的增大时,只要比CNT,那么这段时间内IO逻辑电路就输出有效电平(高电平),当CNT的数越计越大,超过CCRx时,也就是CNT>CCRx,那么这段时间就输出无效电平(低电平), CNT到达ARR的值时就溢出啦从0开始计数,又来一遍这个操作

TIM_OCMode_PWM2—也就是模式1相反啦,CNT无效电平(低电平),CNT>CCRx的时间段输出有效电平(高电平),上面我添了两笔的图就是这种模式2啦

六、完结


这里记录一下小伙伴问的问题:
为什么PWM不用中断优先级啊?
STM32定时器里每个通道都有个捕获/比较寄存器CCRx,当设置为PWM输出模式后,计数寄存器CNT与CCRx一直在比较,假如当CNT比CCRx小的时候输出一个0,那么当CNT比CCRx大的时候输入1,当CNT溢出后周而复始。所以CCRx与ARR的比值即为占空比。这些比较以及反转全部由定时器硬件来完成,所以不需要中断来干涉。

CCRx不变的情况下为什么PWM输出的电平IO是一下高一下低,电机是一直保持一个速度呢,不应该一下停一下动吗?
PWM信号频率很高,我们不能用肉眼去观察,就好像是LED也可以用PWM控制亮度,但是它亮灭的过程太快,人眼无法看到它暗的过程,就只能感觉到它的亮的程度变高或者变低了,电机也是一样的情况,它高低电平切换的过程太短,低电平停下一瞬间就切回高电平了,高电平也是一瞬间就切换低电平,能够观察到的只有电机转动的速度。


写这个为了记录一下电机实验,免得以后忘记了没地方复习,代码写的也不是很好,例程中主函数电机只能朝单个方向逐渐加速,加速到最高后再逐渐减速,往复循环。另外我用电压表测了一下我这个电机停下的电压,大概是1.5V以下INA就不会驱动,有一段时间是停止的。

我还试了一下把INA和(IN1、IN2)其中的高电平的接线替换,比如就是INA是高电平,IN2是低电平,IN1用芯片PWM输出,电机也是可以按照代码中的朝单个方向逐渐加速,加速到最高后再逐渐减速,往复循环。
原理都差不多,只是一个是PWM控制INA使能,一个是PWM控制电机的正脚使能。

开始的时候被淘宝店那啥电机驱动模块的程序书坑的不轻,模块就那一个word文档还是51的,工程都没有,不得已自己写了一个,代码就丢百度网盘了,连注释错的地方都和我上面说的一样懒得改了,还有很大的修改空间,我只是来测试一下L298N是怎么玩的,大家有写的更好的互相分享一下啊

stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第14张图片

人不常在论坛可能看不到你的消息,需要的小伙伴微信扫码回复L298N收到百度网盘链接自行下载啦
stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码_第15张图片

你可能感兴趣的:(stm32f103vet6)