完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
新手上路,十几天的学习感觉弯路走了不少,所以打算把学习的知识记录下来,和大家分享,不要嫌弃我,我从非常新手的角度来写。
1、STM32F103RCT6 我也是第一次学习单片机,选择了正点原子家的迷你版,学习到后面才发现什么板子都差不多,只要学会看手册就好了。推荐论坛:CSDN、正点原子官网、51黑论坛等。可以跟着正点原子提供的手把手视频教程把基本的实验做出来再去学习更深入的原理,就能得到事半功倍的效果。不要因为自己不会而畏怯,一旦遇到不懂的知识就马上查资料,还是不懂就去问,好了,感想有点多了。 2、L298N电机驱动模块 解释一下: 马达A输出(OUT1和OUT2):就是接电机的正负线,无所谓哪个正哪个负,后期如果想让它反转再改回来即可,当你接上后你会发现两个是导通的,这就是电机的知识了,如果想了解电机内部结构,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 《sys.h》 #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值不能为负值。**到这里,电机可以动了,随你发挥吧。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1100 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1118 浏览 1 评论
551 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
417 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1004 浏览 2 评论
1595浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
265浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
279浏览 3评论
248浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
241浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-17 14:54 , Processed in 1.022627 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号