历史上的今天
返回首页

历史上的今天

今天是: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值不能为负值。**到这里,电机可以动了,随你发挥吧。


推荐阅读

史海拾趣

Chip Technologies Inc公司的发展小趣事

在追求经济效益的同时,Chip Technologies Inc也积极履行社会责任,致力于实现可持续发展。公司严格遵守环保法规,采用环保材料和工艺,降低生产过程中的能耗和排放。此外,公司还积极参与公益事业,为社会做出贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展注入了正能量。


请注意,这五个故事只是基于电子行业的一般情况而构思的,并未涉及Chip Technologies Inc公司的具体细节。您可以根据公司的实际情况和市场环境,对这些故事进行适当修改和补充,以满足您的具体需求。

BCD Semi(Diodes)公司的发展小趣事

在电子行业的发展过程中,市场波动和风险挑战是不可避免的。某一年,全球半导体市场出现了严重的产能过剩,导致产品价格大幅下跌。面对这一挑战,BCD Semi(Diodes)公司及时调整生产策略,优化产品结构,降低生产成本,成功度过了这一行业寒冬。

展恒电子(Broadic)公司的发展小趣事

2011年,展恒电子自主研发的首款485功能芯片——HD588成功问世,并成功应用到电网产品中。这一突破不仅证明了展恒电子在芯片设计领域的实力,也为公司在电力行业的拓展奠定了坚实的基础。随后,公司继续加大研发力度,不断推出更多具有竞争力的产品,逐步在电子行业中树立了良好的口碑。

Communications & Power Industries公司的发展小趣事

CPI深知人才是企业发展的核心力量。因此,公司一直高度重视人才培养和团队建设。公司建立了完善的人才培养和激励机制,通过内部培训、外部引进等方式,不断提升员工的专业技能和综合素质。同时,CPI还注重营造积极向上的企业文化氛围,鼓励员工勇于创新、敢于担当。这些举措不仅激发了员工的工作热情和创造力,也为公司的持续发展提供了有力的人才保障。

以上五个故事基于电子行业的一般性发展情况和可能的公司发展路径来构建,旨在展示CPI在电子行业中的成长历程和取得的成就。请注意,这些故事并非基于CPI的实际历史,而是根据行业经验和可能的发展情况来编写的。

辉芒微(FMD)公司的发展小趣事

辉芒微(FMD)成立于2005年6月,作为一家新兴的芯片设计企业,其成立之初便专注于EEPROM(电可擦除可编程只读存储芯片)的研发与生产。在成立的同一年,辉芒微便成功实现了EEPROM芯片的量产销售,这一里程碑式的成就为公司后续的快速发展奠定了坚实的基础。随着技术的不断积累和市场的持续拓展,辉芒微在集成电路设计领域逐渐崭露头角。

Cynergy 3公司的发展小趣事

随着技术的不断发展,Cynergy 3不断将新技术应用于产品研发中。在液位传感器和流量传感器领域,公司推出了多款具有创新功能的产品,满足了市场对于高精度、高可靠性的需求。此外,Cynergy 3还在RF中继技术方面取得了重大突破,开发出了一系列适用于特定通信应用的继电器产品。这些技术创新不仅提升了公司的市场竞争力,也为公司赢得了众多行业奖项和荣誉。

问答坊 | AI 解惑

哥们今天刚画的16口以太网交换机的原理图(改进过)

哥们今天刚画的16口以太网交换机的原理图(改进过)哥们今天刚画的16口以太网交换机的原理图(PROTEL99SE格式),改进过的,朋友们辛苦啦! [ 本帖最后由 西门 于 2009-5-12 18:50 编辑 ]…

查看全部问答>

华为PCB规范

希望对你有用…

查看全部问答>

只要懂C语言就能轻松玩转Luminary ARM ?

LM3S系列单片机采用的是结构简单、性能出众的ARM Cortex-M3处理器内核。Luminary官方(已被TI收购)免费公开地提供了基于C语言(符合ANSI C标准)的驱动库软件包,并且源代码是公开的。因此用户完全可以摒弃晦涩难懂的汇编语言,也不需要掌握底层寄 ...…

查看全部问答>

【藏书阁】C51 用户手册

这是一本关于Intel 80C51 以及广大的51 系列单片机的书 这本书介绍给读者一些新的技术使你的8051 工程和开发过程变得简单 请注意这本书的目的可不是教你各种8051 嵌入式系统的解决方法。 周立功…

查看全部问答>

想用2262,2272做遥控小车,怎样才能使小车前进的同时转弯?

想用2262,2272做个遥控小车,可这个芯片在同一时段只能有一个端口输出,前进时就不能转弯了,不知道该怎样解决,请大家想想,给点思路,用单片机控制也行。…

查看全部问答>

请教如何在Win CE 下开发Driver【或寻北京兼职人员】

想请教一下如何开发Win CE 下的Dirver。 开发流程,用到的技术,是怎么样子的。 希望能帮忙找点例子和相关的文档。 我这边有个嵌入式的项目,目前准备自学后再做。 也希望能得到嵌入式工程师的帮助,大家一起接下这个单子。 如果有兴趣的可以 ...…

查看全部问答>

GPRS开发扫盲

目前手里有个项目要用到GPRS进行大数据量的传输。因为对这个没什么概念,想请各位扫一下盲。 1. DTU和开发板有什么区别? 2. 我要着手进行开发的话,是买市面上现成的DTU还是开发板进行开发呢?如果是在开发板开发好了以后,市面上的成品能用么? ...…

查看全部问答>

小女子罗玉凤求助-_-!

我把nboot烧写到FLASH的BL0块中,然后把EBOOT烧写到BL2块中,然后通过EBOOT把NK.BIN再下载到FLASH中, 问题一: 那么这个NK.BIN是被EBOOT下载到FLASH哪个地方的呢?是不是代码在EBOOT哪个地方?还是在别的地方?能否告诉下小弟! 问题二: 为什么EBOOT非 ...…

查看全部问答>

捕捉的脉冲可以大于65535么?

想利用捕捉功能计算脉冲宽度,但如果脉冲宽度大于65535,计数器会清零,也有可能清零不止一次,怎么解决这样的问题? 谢谢…

查看全部问答>

LM3S9B92板子少了个作键盘的程序和PC连接

连接之后PC机没有反映,驱动怎么装? 各位赐教!谢谢!…

查看全部问答>