当前位置:   article > 正文

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

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的文件夹,在里面将小车驱动模块的代码补充完毕,原理也上上面一样,也不算太难。

  1. 这是我们motor.h的文件,我的水平低,如果有更好的改进可以提出来,互相学习
  2. #ifndef _MOTOR_H
  3. #define _MOTOR_H
  4. typedef enum{
  5. LEFT=0,
  6. RIGHT=1
  7. }Motor;
  8. typedef enum{
  9. FORWARD=0,
  10. BACKWARD=1
  11. }Direction;
  12. void runMotorDir(Motor l_or_r,Direction f_or_b);
  13. void runMotorSpeed(Motor l_or_r,int pwm_val);
  14. void runCarLeft();
  15. void runCarLittleLeft();
  16. void runCarGo();
  17. void runCarLittleRight();
  18. void runCarRight();
  19. void runCarStop();
  20. void runCarLittleLeft1();
  21. void runCarLittleRight1();
  22. #endif /*_MOTOR_H*/

  1. 这是motor.c的代码部分。
  2. #include "motor.h"
  3. #include "main.h"
  4. #include "tim.h"
  5. void runMotorDir(Motor l_or_r, Direction f_or_b){
  6. if(l_or_r==LEFT&&f_or_b==FORWARD){
  7. HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET);
  8. HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET);
  9. }else if(l_or_r==LEFT&&f_or_b==BACKWARD)
  10. {
  11. HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);
  12. HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);
  13. }
  14. else if(l_or_r==RIGHT&&f_or_b==FORWARD){
  15. HAL_GPIO_WritePin(AIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET);
  16. HAL_GPIO_WritePin(AIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET);
  17. }else if(l_or_r==RIGHT&&f_or_b==BACKWARD)
  18. {
  19. HAL_GPIO_WritePin(AIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET);
  20. HAL_GPIO_WritePin(AIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_SET);
  21. }
  22. }
  23. void runMotorSpeed(Motor l_or_r,int pwm_val)
  24. {
  25. if(l_or_r==LEFT)
  26. {
  27. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_1,pwm_val);
  28. }
  29. if(l_or_r==RIGHT)
  30. {
  31. __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,pwm_val);
  32. }
  33. }

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/501013
推荐阅读
相关标签
  

闽ICP备14008679号