stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码 | 您所在的位置:网站首页 › l298n驱动器怎么调速 › stm32f103vet6通过L298N驱动12V直流无刷电机过程含代码 |
一、传统开头介绍一下L298N电机驱动模块
这个单片机是自己焊的,芯片用的是STM32F103VET6,反正用什么芯片都是大同小异啦 来解释一下我的接线图: 红色框 1. 接一个直流减速电机正反不用在意,正转反转都是自己决定的 红色框 2. 这里是外部供电12V的电源给这个L298N,和红色框3的GND一起焊接在一个接口上 红色框 3. 就是一个GND,用杜邦线插进去另一端和板子上的GND接上,和单片机共地 红色框 4. 这是一个输出5V啦,接在板子上的5V引脚,就当给板子供电了,这样也不用单片机单独供电了 红色框 5. 这里有三个引脚(INA,IN1,IN2)下面详细讲一下
这里我学的是野火哥的工程模板,用的原子哥的PWM例程移植过来,野火哥的教程里面没有PWM的讲解,我就用原子哥的教程抄作业抄了一个PWM输出啦,哈哈哈…(留下了没有技术的眼泪)
接下来打开User里面看看放了什么
前面说到我们只用了User中的pwm和SysTick,SysTick就没啥好说的啦,可以去找野火哥的教程有教学,看看我们自己写的pwm咋样 (1)-----“pwm.h” 这个pwm的头文件仔细一看也没啥好说的,大家看看就明白了用了pwm.c中用了–PE10、PE11、PA8 (2)-----“pwm.c” 上面是TIM1时钟的配置情况: 1、先定义三个结构体 2、打开TIM1和GPIOA的晶振 3、再配置一下INA嘛,上面的注释有些问题,又是PE13又是PE11的,其实是我PA8哒,大家知道就好了 4、下面的开始的自动重装载值和定时器分频什么的,以及定时器模式的选择在正点原子的stm32教程里面都有讲解,这里就不重复讲了 这个是40行以后的代码,其实也就是User中power.c放在pwm.c的代码部分作用是: 使能和初始化PE10和PE11 (3)-----“mian.c” 1、三个头文件要记得调用的嘛 2、mian开始的时候时钟已经被8M的晶振倍频为72M了 3、顺便初始化一下函数 4、IN1的PE11拉高,IN2的PE10拉低,给电机驱动模块L298N高低电平可以驱动电转动 5、TIM1_PWM_Init()这个比较重要带图一起讲 五、图文解释
一、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频率 三、说了那么多我上面的图是干嘛的啊 我们知道了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_PWM2—也就是模式1相反啦,CNTCCRx的时间段输出有效电平(高电平),上面我添了两笔的图就是这种模式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是怎么玩的,大家有写的更好的互相分享一下啊 人不常在论坛可能看不到你的消息,需要的小伙伴微信扫码回复L298N收到百度网盘链接自行下载啦 |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |