概述:项目用到的主控芯片为stm32f103rct6,编译环境为keil5,用到的一些其他的软件有汉字取模软甲、图片取模软件、虚拟串口驱动软甲以及仿真软件。所使用到一些传感器或者模块有3路(或者更多路)的寻迹模块、超声波模块、2自由度舵机云台、1.8寸TFTLCD显示模块(采用spi通信)、WiFi视频透传模块、红外接收模块、电机驱动模块等。整个项目所实现的功能为:小车的自动循迹、红外遥控、避障等。因为个人能力有限项目并不是特别完整,所实现的功能也特别有限,但是项目提供了一个可以搭建的小车平台。项目来源于我生产实习信盈达的智能循迹避障小车项目,因为实习过程比较段所以我得到的项目本身就不是特别完整,实习的工程师只是讲了各个模块的使用并没有进行功能的合并和实现既定功能。因为疫情的原因采用了线上实习的方式所以并没有看到实物小车而是以仿真软件的形式调试各个功能虽然和实物还是有一些区别但是大体上都是相同的。以下是我自己对整个项目的整理并加入了自己的一些东西,和一些自己在学习过程中的理解。
首先就是点灯了,作为任何一款单片机学习的第一步点灯当然是必不可少的,这个也是比较简单的在这里不做过多的赘述。这里主要讲一讲关于点灯所用到的几种GPIO输入输出模式的不同点,初学者比较难以理解他们之间到底有哪些区别应该在那些场合应用那些模式。往后面学习的时候对GPIO的配置不需要我们去做过多的理解,但是我们还是应该清楚GPIO的几种输出输入模式之间的区别,可以帮助我们更好的理解硬件和软件之间的联系。GPIO分别有四种输出和四种输入模式,下面是f1系列的中文参考手册中的I/O端口位的基本结构图:
四种输出模式分别为:
通用开漏输出 :IO 口不能输出高电平,可以输出低电平。
通用推挽式输出:IO 口可以输出高电平,也能输出低电平。
复用推挽式 :IO 口可以输出高电平,也能输出低电平。
复用开漏:IO 口不能输出高电平,可以输出低电平。
通用 GPIO:直接由 IO 口控制器来进行控制
复用 AFIO:是由片上外设来进行控制的 IO——》比如定时器周期性的状态。
四种输入模式为:
输入浮空 :芯片内部没有上下拉电阻,外部电路电平不能确定,就可以使用浮空输入。
输入上拉 :芯片内部有上拉电阻,如果外部电平空闲状态为高,就可以配置上拉输入。
输入下拉 :芯片内部有下拉电阻,如果外部电平空闲状态为低,就可以配置下拉输入。
模拟输入 :单片机只能处理数字量,不能处理模拟量,需要通过 ADC(模数转换器),模拟输入。
了解了基本的输入输出模式就可以根据自己具体想要实现的功能而选择相应的输入输出模式。
按键
按键的检测也是来说相对比较简单的,这里分别介绍两种按键的检测,一种为单个按键的检测,另一种为4*4矩阵键盘的按键检测。按理说按键的检测和点灯操作都是一样的比较简单的一个是输出配置一个为输入配置。但是我们所使用的机械按键在按下的一瞬间都会有比较严重的机械抖动,虽然这个抖动时间比较的短但是单片机的运行速度也是相当快的是完全可以检测到这种抖动的,所以按键的机械抖动对于单片机对按键信号的检测的影响还是比较显著的。要消除这种抖动有两种方法,一是机械消抖,二是软件消抖,机械消抖比较难以实现按键的机械性能也是难以改变的所以通常我们都采取软件进行消抖。做法就是先读取按键的状态,如果得到按键按下之后,延时10ms,再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下,其中延时10ms就是软件消抖处理。具体的程序实现如下:
u8 KEY_Scan(u8 mode)
{
static u8 key=1;
if(key==1&&(K_UP==1||K_0==0||K_1==0))
{
delay_ms(10);
key=0;
if(K_UP==1)
{
return KEY_UP;
}
else if(K_0==0)
{
return KEY_O;
}
else
return KEY_1;
}
else if(K_UP==0&&K_0==1&&K_1==1)
{
key=1;
}
if(mode==1)
{
key=1;
}
return 0;
}
这里说明一下因为这个独立按键基本每一个单片机开发板都会带有几个,独立按键的检测程序也是各不相同但是原理基本一致。
由于项目没有具体实物采用的是仿真软件进行仿真所以这个按键并没有抖动是一个理想的按键模型,所以在软件设计的时候也没有考虑到按键抖动的情况。具体的按键检测程序如下:
/**
* @brief 按键检测函数
* @param 无
* @retval 0 没有按下;
* 1 按键1按下;
* 2 按键2按下;
* 3 两个按键同时都按下
*/
uint8_t Key_GetValue(void)
{
uint8_t value = 0;
if(GPIO_ReadInputDataBit(KEY1_PORT, KEY1_PIN) == 0) {
value = value | (1<<0);
}
if(GPIO_ReadInputDataBit(KEY2_PORT, KEY2_PIN) == 0) {
value = value | (1<<1);
}
return value;
}
(这个循迹小车并没有涉及到矩阵键盘,矩阵键盘详情可以看我另外一篇文章)
附件中有keil5软件的安装包和具体的安装教程,以及项目的原理图和使用的mcu的一些资料。
全部评论