赞
踩
#上一章我们成功构建了cubemx的芯片配置,并且生成了代码。我们紧接着要开始展示代码部分。
(ps:没想到第一次写博客能有这么多的浏览量!虽然只有几百但是还是挺开心的0.0,我会尽可能详细地展示代码部分,毕竟代码是整个过程的核心!还望大家多多支持。)
因为我写这个文章是面向广大基础薄弱,但是对智能车有兴趣的朋友们,所以我们构建好的keil模板里,我们首先来点亮我们的第一颗led灯,这个过程相当于我们c语言中的“HELLO WORLD”,也是单片机的最基础的第一步。(会的朋友们可以把这一部分跳过去,节约一点时间。)
点亮一颗led很简单,在这里我们直接讲述如何构建呼吸灯。
我们在keil里面用的是HAL库,【STM32】入门(九):HAL库学习_stm32 hal库-CSDN博客
具体的可以参考这个博客,不看也没有关系,一步一步跟着me来,肯定没有问题。
首先我们在上一章设置好了定时器,我们在代码中首先要启动定时器
我们首先来介绍呼吸灯的逻辑。
我们知道二极管是单向导电性,默认情况是正方向是低电平,若要使led点亮,我们应该将正方向设置为高电平,即反转电平。
我们要在main函数中写上下面的函数
即反转电平,这样我们的led灯就可以点亮成功了
我们接上pwlink,烤录进去之后就会有下面这个成功图。
可以看到蓝色的小灯已经被点亮了。
紧接着我们思考一下呼吸灯的逻辑,即灯的亮度逐渐增大,当到达某一值时候,在逐渐减小,当熄灭之后,再重复以上步骤,即卡在while循环里面,想通了这个原理,那么代码也就很显而易见可以写出来。
我们加上延时函数delay,这样可以让呼吸灯的效果更加明显,到这里为止,我们将会成功构建出呼吸灯的逻辑。
(我在这里直接给出代码,可能有的地方没有说清楚,如果有哪里不正确可以私信多多交流,谢谢大家)//到这里为止我们就可以开始我们的单片机之旅了!点亮呼吸灯是最基础的一步,当然不会也不影响下面的学习,并不影响我们智能车的构建,仅仅只是一个正反馈,让你能够有更大的兴趣来学习。
这个部分就开始了我们电机的转动,这一步学会之后,我们就可以成功的让小车向前跑,向后跑的操作,即电机的正转,反转。
我们先要设置我们的电机。
在呼吸灯的基础上我们进行电机的设置,我在这里就先拿其中一个电机来说明,另外一个照本宣科就好啦。
我们在呼吸灯的逻辑上首先将我们的电机驱动打开,即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,以及实际情况来确定我们的转速,这一部分需要不断的调试,我们将在下一个章节讲述如何调节转速,以及五路循迹模块的原理和代码部分。
如果各位对我的文章感兴趣可以多多关注点点赞支持一下,我还会更加详细的更新智能车系列,谢谢大家的支持。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。