和同学一同在校园参与院电子设计大赛做的项目,看起来时刻很长,但实际上咱们拢共做的时刻差不多是3天的姿态。
板子是正点的,所以许多当地咱们就直接扒的正点的例程,比方红外遥控的部分完好拿过来了,能直接用。
咱们在完结校园的要求后又多加了测距显现和差速调理(让小车能够从彻底中止到最高速度),后边我会分块尽量具体叙说小车的功用原理及代码介绍。
视频演示
https://www.bilibili.com/video/av85501350/
电源
咱们选用的是三节18650供电,三节电池就有12v,用来驱动小车捉襟见肘,为了取得更安稳契合小车需求的电压,咱们又选用了一个LM2596S降压模块,把12V的电压给降到3v给单片机供电。在装置电源的时分,其实咱们犯了一个过错,把电池给装置在了小车的第二层,这样在取放电池时就需求拆开螺丝,比较费事。
驱动
驱动模块运用的是经典的L298N,首要是实验室一抓一大把,关于模块的具体阐明能够查找得到,不再赘述。
咱们关于这个模块具体的运用如图咱们做的是4轮驱动,把轮子分左右用一个驱动模块进行驱动,为了用PWM对小车进行速度操控,所以咱们需求调用时钟,这儿调用TIM4,使能PB8对左电机进行方向操控,使能PB9作为左电机的PWM信号,使能PA6对右电机进行方向操控,使能PB10作为右电机的PWM信号。
一边有俩电机对应俩轮子,所以,这儿还进行了映射,PB8映射到PB5和PB6,对应左面的in1和in2,进行方向操控。
PA6映射到PA5和PA6,对应左面的in3和in4,进行方向操控。
更多具体的装备都在函数里边。
驱动部分并不是由我彻底担任,所以我会在大体完结后找机会请其时一同完结的小伙伴一同校验。
在驱动部分,我想再首要挑一部分具体谈谈。
其时咱们在关于进行差速操控部分有一个主意,让它完结从零开始逐渐加快或许最高速逐渐减速,一起也完结要求的三挡速度。
关于要求的三挡速度,其他选了小车的组,据我调查,应该都是在函数里边写好了预先装备3个的PWM占空比,来完结。
其时是我担任的这个功用的完结,我觉得这样写只能单一完结那个要求,然后为了达到咱们料想的差速调理,所以我在主函数设置一个变量来代表占空比,然后motor.c里边引入并在后边的调速函数和三挡预置速度函数调用,就能够完结这两个功用了。里边更改占空比的数值是咱们测验调理修正出来的。
在操控方向上,咱们有旋转和有必定精度的视点的旋转。功用完结也是依托调理占空比,不再赘述。
超声波部分咱们选用的模块是HC-SR04,同样是一个比较经典的模块,这一部分比较搞的是什么,是超声波模块需求5v供电,及其重要,咱们一开始代码调试好后,一向显现不出来正确的数据,一向为0(咱们有加OLED显现模块,所以能够便利测验),从驱动做好后一向顺风顺水忽然在这卡壳了,弄得咱们自闭良久。后来在网上查到是5v供电后,一改立马成功。
OLED显现
咱们用的0.96寸7针显现模块,代码部分也没什么好说的,网上找到读懂后直接调用就行了
单片机源程序如下:
#include "stm32f10x.h"
#include "delay.h"
#include "motor.h"
#include "usart.h"
#include "remote.h"
#include "oled.h"
#include "hcsr04.h"
float length=0,sum=0;
u16 tim;
uint j=0;
int i=2000;
int main(void)
{
u8 key;
float distance;
delay_init();
TIM4_PWM_Init(7199,0); //初始化PWM
Remote_Init(); //红外接纳初始化
CH_SR04_Init();
OLED_Init(); //初始化OLED
OLED_Clear();
ZYSTM32_brake(500);
NVIC_Config();
while(1)
{
key=Remote_Scan();
distance=Senor_Using();
OLED_ShowString(0,2,"distance is");
OLED_ShowNum(0,4,distance,8,20);
if(distance>30)
switch(key)
{
case 98:ZYSTM32_run(100);break;
case 2:ZYSTM32_brake(100);break;
case 34:ZYSTM32_Spin_Left(100);break;
case 168:ZYSTM32_back(100);break;
case 194:ZYSTM32_Spin_Right(100);break;
case 104:speedchange(1);break;
case 152:speedchange(2);break;
case 176:speedchange(3);break;
case 48:turnleft45(220);break; //4
case 24:turnright45(220);break; //5
case 16:turnleft45(50);break; //7
case 56:turnright45(50);break; //8
case 224:speeddown();break;
case 144:speedup();break;
}
else
{
ZYSTM32_back(100);
delay_us(50);
ZYSTM32_brake(100);
}
}
}