基于stm32f4的五路循迹小车(三、呼吸灯设置以及PWM电机驱动)

#上一章我们成功构建了cubemx的芯片配置,并且生成了代码。我们紧接着要开始展示代码部分。

(ps:没想到第一次写博客能有这么多的浏览量!虽然只有几百但是还是挺开心的0.0,我会尽可能详细地展示代码部分,毕竟代码是整个过程的核心!还望大家多多支持。)

因为我写这个文章是面向广大基础薄弱,但是对智能车有兴趣的朋友们,所以我们构建好的keil模板里,我们首先来点亮我们的第一颗led灯,这个过程相当于我们c语言中的“HELLO WORLD”,也是单片机的最基础的第一步。(会的朋友们可以把这一部分跳过去,节约一点时间。)

呼吸灯

点亮一颗led很简单,在这里我们直接讲述如何构建呼吸灯。 

我们在keil里面用的是HAL库,【STM32】入门(九):HAL库学习_stm32 hal库-CSDN博客

具体的可以参考这个博客,不看也没有关系,一步一步跟着me来,肯定没有问题。 

首先我们在上一章设置好了定时器,我们在代码中首先要启动定时器

 我们首先来介绍呼吸灯的逻辑。

我们知道二极管是单向导电性,默认情况是正方向是低电平,若要使led点亮,我们应该将正方向设置为高电平,即反转电平。

我们要在main函数中写上下面的函数

即反转电平,这样我们的led灯就可以点亮成功了

我们接上pwlink,烤录进去之后就会有下面这个成功图。

可以看到蓝色的小灯已经被点亮了。

紧接着我们思考一下呼吸灯的逻辑,即灯的亮度逐渐增大,当到达某一值时候,在逐渐减小,当熄灭之后,再重复以上步骤,即卡在while循环里面,想通了这个原理,那么代码也就很显而易见可以写出来。

我们加上延时函数delay,这样可以让呼吸灯的效果更加明显,到这里为止,我们将会成功构建出呼吸灯的逻辑。

(我在这里直接给出代码,可能有的地方没有说清楚,如果有哪里不正确可以私信多多交流,谢谢大家)//到这里为止我们就可以开始我们的单片机之旅了!点亮呼吸灯是最基础的一步,当然不会也不影响下面的学习,并不影响我们智能车的构建,仅仅只是一个正反馈,让你能够有更大的兴趣来学习。

PWM驱动电机调节

这个部分就开始了我们电机的转动,这一步学会之后,我们就可以成功的让小车向前跑,向后跑的操作,即电机的正转,反转。

我们先要设置我们的电机。

在呼吸灯的基础上我们进行电机的设置,我在这里就先拿其中一个电机来说明,另外一个照本宣科就好啦。

我们在呼吸灯的逻辑上首先将我们的电机驱动打开,即set,同时注意我们的电源的电压,切记不要超过了驱动板的电压,很有可能会烧坏。

代码部分就是这个样子。

这样我们同样烤录进去,他就会像呼吸灯的逻辑一样,先跑的慢,然后越来越快最后再慢慢减速直到没有速度,然后重复以上步骤。这样我们的小车就可以实现前进后退两个功能了。

//以上内容只是让小车转动起来,真正要实现小车循迹功能我们还要建立一个motor.c,motor.h的文件夹,在里面将小车驱动模块的代码补充完毕,原理也上上面一样,也不算太难。

这是我们motor.h的文件,我的水平低,如果有更好的改进可以提出来,互相学习

#ifndef _MOTOR_H
#define _MOTOR_H
typedef enum{
	LEFT=0,
	RIGHT=1
}Motor;
typedef enum{
	FORWARD=0,
	BACKWARD=1
}Direction;
void runMotorDir(Motor l_or_r,Direction f_or_b);
void runMotorSpeed(Motor l_or_r,int pwm_val);
void runCarLeft();
void runCarLittleLeft();
void runCarGo();
void runCarLittleRight();
void runCarRight();
void runCarStop();
void runCarLittleLeft1();
void runCarLittleRight1();
#endif /*_MOTOR_H*/

这是motor.c的代码部分。



#include "motor.h"
#include "main.h"
#include "tim.h"
void runMotorDir(Motor l_or_r, Direction f_or_b){
	if(l_or_r==LEFT&&f_or_b==FORWARD){
		HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
	}else if(l_or_r==LEFT&&f_or_b==BACKWARD)
	{
		HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);
	
	}
	else if(l_or_r==RIGHT&&f_or_b==FORWARD){
		HAL_GPIO_WritePin(AIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET);
		HAL_GPIO_WritePin(AIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET);
	}else if(l_or_r==RIGHT&&f_or_b==BACKWARD)
	{
		HAL_GPIO_WritePin(AIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(AIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_SET);
	
	}
}
void runMotorSpeed(Motor l_or_r,int pwm_val)
{
	if(l_or_r==LEFT)
	{
		__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,pwm_val);
	}
	if(l_or_r==RIGHT)
	{
		__HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,pwm_val);
	}
	
}

结合自己的理解写出适合自己的代码,我写的代码可能只适用于我自己的情况,在这里起到一个启迪大家的作用。

以上的内容结合自己的理解,小车可以成功的进行前进后退,我们要实现循迹模块时候,我们要考虑小车左转右转的情况。这一部分我们需要根据pid,以及实际情况来确定我们的转速,这一部分需要不断的调试,我们将在下一个章节讲述如何调节转速,以及五路循迹模块的原理和代码部分。

如果各位对我的文章感兴趣可以多多关注点点赞支持一下,我还会更加详细的更新智能车系列,谢谢大家的支持。

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用STM32F4主从定时器驱动步进电机是一个常见的应用场景。STM32F4系列微控制器内置了多个定时器,可以利用这些定时器的输出来产生脉冲信号,控制步进电机的运动。 首先,选择一个合适的主定时器作为步进电机驱动的脉冲发生器。这个定时器的计数器值将作为步进电机每个脉冲的时间间隔。根据步进电机的要求,可在主定时器的计数器达到一定值时触发一个中断,该中断用于生成步进电机脉冲。 然后,选择一个从定时器用于计数步进电机脉冲数量。在主定时器中断中,将从定时器的计数器值清零,并设置一个较大的目标计数值,用于控制步进电机的运动。 在主定时器中断中,通过设置相应的IO口的电平来控制步进电机相应的引脚。根据步进电机的类型(单相、双相等),可以设置不同的引脚电平来控制步进电机的转动方向和步进数目。 最后,在主程序中,通过启动主定时器开始生成脉冲,同时启动从定时器开始计数。在从定时器的中断中,可以实现一些其他的功能,如改变电机转速、实现加减速等。 需要注意的是,步进电机的驱动方式还与具体的步进电机驱动芯片有关,可能需要配置一些额外的寄存器。另外,还需要根据步进电机的特性和要求,调整主定时器的计数器值、从定时器的计数范围等参数,以实现精确的步进电机控制。 综上所述,通过使用STM32F4主从定时器驱动步进电机,可以实现精确的步进电机控制,满足不同应用场景的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值