历史上的今天
今天是:2025年01月05日(星期日)
2021年01月05日 | STM32学习笔记-L298N驱动模块-电机
2021-01-05 来源:eefocus
新手上路,十几天的学习感觉弯路走了不少,所以打算把学习的知识记录下来,和大家分享,不要嫌弃我,我从非常新手的角度来写。
REFER[1]传送门。
12V电源、地线:12V电源接口接12V电池正线,负线接地,同时这个地还要接到单片机的地才行,关于这个12V电源,只要电压尽量不要高于16V不要低于8V就好啦。
5V输出:这是因为L298N模块里自带了稳压功能,可以供出5v电压,以后要是做车,单片机的供电选择可以选这个,但是对于初学者应该还没用到,暂且不理。
A通道使能(EN1):使能是什么……我刚开始学的时候也不懂,但是如果你学了点灯实验,就会知道要配置IO口,使能时钟什么的,这是使能的意思就是让它开启工作状态。这个使能接口是用来控制PWM输入的,如果你还不知道PWM到底是个什么东西,你就先把它理解成一个可以控制电机转速的东西。也就是说,如果单纯只想让电机转动起来,可以不用管这个EN1先,把那个帽子给它盖上,它就和5v接上了,也就是它不使能了。以后如果想用PWM来控制,那就把帽子拔了,把EN脚接到单片机的PWM输出口。
单片机IO口控制输入(IN1、IN2):这两个脚是接到单片机某两个IO口的,只要你分别给个高给个低电平,电机就可以转了。
所以,剩下的IN3、IN4、EN1、OUT1和OUT2都同理了咯。
3、软件实现
先给大家分享个关于Keil5的小技巧,在界面edit里找到configuration点击去
学习了点灯实验,就知道怎么配置引脚了,然后也知道怎么给引脚高低电平了,注意工程的创建,c文件和h文件都加上去
没有 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值不能为负值。**到这里,电机可以动了,随你发挥吧。
史海拾趣
|
哥们今天刚画的16口以太网交换机的原理图(改进过)哥们今天刚画的16口以太网交换机的原理图(PROTEL99SE格式),改进过的,朋友们辛苦啦! [ 本帖最后由 西门 于 2009-5-12 18:50 编辑 ]… 查看全部问答> |
|
LM3S系列单片机采用的是结构简单、性能出众的ARM Cortex-M3处理器内核。Luminary官方(已被TI收购)免费公开地提供了基于C语言(符合ANSI C标准)的驱动库软件包,并且源代码是公开的。因此用户完全可以摒弃晦涩难懂的汇编语言,也不需要掌握底层寄 ...… 查看全部问答> |
|
这是一本关于Intel 80C51 以及广大的51 系列单片机的书 这本书介绍给读者一些新的技术使你的8051 工程和开发过程变得简单 请注意这本书的目的可不是教你各种8051 嵌入式系统的解决方法。 周立功… 查看全部问答> |
|
想用2262,2272做遥控小车,怎样才能使小车前进的同时转弯? 想用2262,2272做个遥控小车,可这个芯片在同一时段只能有一个端口输出,前进时就不能转弯了,不知道该怎样解决,请大家想想,给点思路,用单片机控制也行。… 查看全部问答> |
|
请教如何在Win CE 下开发Driver【或寻北京兼职人员】 想请教一下如何开发Win CE 下的Dirver。 开发流程,用到的技术,是怎么样子的。 希望能帮忙找点例子和相关的文档。 我这边有个嵌入式的项目,目前准备自学后再做。 也希望能得到嵌入式工程师的帮助,大家一起接下这个单子。 如果有兴趣的可以 ...… 查看全部问答> |
|
我把nboot烧写到FLASH的BL0块中,然后把EBOOT烧写到BL2块中,然后通过EBOOT把NK.BIN再下载到FLASH中, 问题一: 那么这个NK.BIN是被EBOOT下载到FLASH哪个地方的呢?是不是代码在EBOOT哪个地方?还是在别的地方?能否告诉下小弟! 问题二: 为什么EBOOT非 ...… 查看全部问答> |




