
STM32学习笔记-L298N驱动模块-电机
学习了点灯实验,就知道怎么配置引脚了,然后也知道怎么给引脚高低电平了,注意工程的创建,c文件和h文件都加上去
发布日期:2021-05-08 06:09:05
浏览次数:18
分类:精选文章
本文共 3367 字,大约阅读时间需要 11 分钟。
新手上路,十几天的学习感觉弯路走了不少,所以打算把学习的知识记录下来,和大家分享,不要嫌弃我,我从非常新手的角度来写。
1、STM32F103RCT6
我也是第一次学习单片机,选择了正点原子家的迷你版,学习到后面才发现什么板子都差不多,只要学会看手册就好了。推荐论坛:CSDN、正点原子官网、51黑论坛等。可以跟着正点原子提供的手把手视频教程把基本的实验做出来再去学习更深入的原理,就能得到事半功倍的效果。不要因为自己不会而畏怯,一旦遇到不懂的知识就马上查资料,还是不懂就去问,好了,感想有点多了。
2、L298N电机驱动模块
所以,剩下的IN3、IN4、EN1、OUT1和OUT2都同理了咯。
3、软件实现
先给大家分享个关于Keil5的小技巧,在界面edit里找到configuration点击去

没有 PWM 控制
.
// 先配置引脚void Motor_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;//端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB //暂时先把IO口拉低电平,也可以不拉 GPIO_ResetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13);}//在main函数里void main(void){ Motor_Init(); while(1) { delay_ms(1000); GPIO_ResetBits(GPIOB,GPIO_Pin_12);//正转 GPIO_SetBits(GPIOB,GPIO_Pin_13); delay_ms(6000); GPIO_ResetBits(GPIOB,GPIO_Pin_13);//反转 GPIO_SetBits(GPIOB,GPIO_Pin_12); delay_ms(1000); }}
通过上面的代码就可以实现电机简单地转动了,还可以让电机左转右转,看你实现吧
这里的接线是PB12->IN1、PB13->IN2,EN1的帽子要盖上。有 PWM 控制
.
//定义电机,左电机为A(PB12,PB13,PA8),右电机为B(PB14,PB15,PA11)//PB(12,13,14,15)接驱动模块IN脚,PA(8,11)接EN脚用来PWM输出/在.c文件里void Motor_Init(void){ RCC->APB2ENR|=1<<3; //PORTB时钟使能 ,位2 GPIOB->CRH&=0X0000FFFF; //PORTB12 13 14 15推挽输出 GPIOB->CRH|=0X22220000; //PORTB12 13 14 15推挽输出}void PWM_Init(u16 arr,u16 psc){ MiniBalance_Motor_Init(); //初始化电机控制所需IO RCC->APB2ENR|=1<<11; //使能TIM1时钟 RCC->APB2ENR|=1<<2; //PORTA时钟使能 GPIOA->CRH&=0XFFFF0FF0; //PORTA8 11复用输出 GPIOA->CRH|=0X0000B00B; //PORTA8 11复用输出 TIM1->ARR=arr; //设定计数器自动重装值 TIM1->PSC=psc; //预分频器不分频 TIM1->CCMR2|=6<<12; //CH4 PWM1模式 TIM1->CCMR1|=6<<4; //CH1 PWM1模式 7<<4是PWM2模式 TIM1->CCMR2|=1<<11; //CH4预装载使能 TIM1->CCMR1|=1<<3; //CH1预装载使能 TIM1->CCER|=1<<12; //CH4输出使能 TIM1->CCER|=1<<0; //CH1输出使能 TIM1->BDTR |= 1<<15; //TIM1必须要这句话才能输出PWM,MOE主输出使能 TIM1->CR1=0x8000; //ARPE使能 TIM1->CR1|=0x01; //使能定时器1 }/在.h文件里#ifndef __MOTOR_H#define __MOTOR_H#include#define AIN1 PBout(12)#define AIN2 PBout(13)#define BIN1 PBout(14)#define BIN2 PBout(15)#define PWMA TIM1->CCR1 //赋值给PWMA就可以直接修改寄存器,发出不同PWM了#define PWMB TIM1->CCR4 void MiniBalance_PWM_Init(u16 arr,u16 psc);void MiniBalance_Motor_Init(void);#endif//在main函数里void main(void){ Motor_Init(); PWM_Init(7199,0); while(1) { IN1=1;IN2=0;//左电机 IN3=1;IN4=0;//右电机 PWMA=4000;PWMB=4000;//直接操作寄存器,改变PWM }}
记得,如果使用PWM了,就要把EN的帽子拔了。可以是库函数版也可以用寄存器版,我比较喜欢寄存器点,很直接。
**对了,还要注意这个PWM值不能为负值。**到这里,电机可以动了,随你发挥吧。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月03日 03时15分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
vim杂谈(三)之配色方案
2021-05-08
vim杂谈(五)之vim不加载~/.vimrc
2021-05-08
Linux杂谈之终端快捷键
2021-05-08
vimscript学习笔记(二)预备知识
2021-05-08
vimscript学习笔记(三)信息打印
2021-05-08
awk杂谈之数组习题
2021-05-08
Linux网络属性配置详解
2021-05-08
Python(三十)类的理解
2021-05-08
Extjs布局详解
2021-05-08
Android数据库
2021-05-08
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
2021-05-08
keil左侧文件调整方法
2021-05-08
本地分支关联远程分支
2021-05-08
STM8 GPIO模式
2021-05-08
STM32boot启动
2021-05-08
回调函数(callback function)
2021-05-08
omnet++
2021-05-08
23种设计模式一:单例模式
2021-05-08
Qt中的析构函数
2021-05-08