stm32之外设控制

Posted steed

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32之外设控制相关的知识,希望对你有一定的参考价值。

本文将提到以下内容:

  • 蜂鸣器
  • 按键控制
  • 电容触摸
  • 温度传感器
  • 红外
  • TFTLCD触摸屏
  • MPU6050传感器
  • SPI-FLASH
  • SDIO_SD卡
  • ucos-III移植

 

一、蜂鸣器

  蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,主要分为以下两种:

  • 有源:电磁式
  • 无源:压电式

  这里的有源,不是指电源的意思,而是指蜂鸣器内部是否含有振荡电路,有源蜂鸣器内部自带振荡电路,

只需提供电源即可。无源蜂鸣器需要提供1.5-5KHz之间的频率脉冲才能发声。

  我们可以通过以下两个方面来让蜂鸣器发出美妙的音乐:

  • 频率:控制音调
  • 占空比:控制声音大小

 

二、按键控制

  按键是一种电子开关,通常的按键所用的开关为机械弹性开关,当机械触点断开、闭合时,电压信号

如下图所示:

  可以看出,机械开关唯一要注意的点就是按键抖动,一般抖动时间为5ms到10ms,我们可以通过两种方

式进行消抖:

硬件消抖:较复杂,一般不太推荐。

软件消抖:按键按下后,延时10ms,再次读取按键状态,比较简单,推荐。

 

三、电容触摸

  电容触摸按键,原理是通过检测电容充放电时间,即可判断是否有触摸,如下图所示,A未触摸,B触摸,

B的充放电时间明显长于A,即可判断B触摸。触摸时,手指和TOUCH之间形成电容,会影响充放电时间。

 

 

四、温度传感器

  stm32芯片内部带有温度传感器,但是内部的温度传感器受芯片内部温度影响较大,所以一般不采用内部

的温度传感器。

  我们一般采用DS18B20,其是单总线器件,一般单总线器件都要求采用严格的信号时序,以保证数据的完

整性。一般有以下几个信号的时序:

  • 初始化时序
  • 写时序
  • 读时序

 

五、红外

  比红光波长还长的光叫做红外线,红外线遥控就是利用波长为0.76~1.5um之间的近红外线来传送控制信号

的,抗干扰能力强,信息传输可靠。

  由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在设计红外线遥控时,不

必要像无线电遥控那样,每套(发射器和接收器)要有不同的遥控频率或编码(否则,就会隔墙控制或者干扰),所

以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现串门的情况。

  主要分为两部分:

  (1)红外发射设备

  红外发射电路的主要元器件是红外发光二极管。红外遥控器常用载波的方式传送二进制编码,常用的载波频率

为38KHz,二进制脉冲码的形式有很多种,红外遥控器最常使用的是NEC协议(PWM码脉冲宽度调制),NEC码位

的定义时序图如下图所示,其中0.56ms是连续载波脉冲:

  NEC遥控指令的数据格式为:引导码、地址码、地址反码、控制码、控制反码。其中反码是为了增加传输的可靠

性(可用于校验)。数据格式如下图所示:

  NEC码还规定了连发码(由9ms低电平+2.5ms高电平+0.56ms低电平+97.94ms高电平组成),如果在一帧数据传

送完毕之后,按键仍没有放开,则发射连发码。

  一般红外遥控器按键出产的时候就已经底层编码了,不过我们可以通过修改遥控器配置文件来修改按键编码。

  (2)红外接收设备

  根据载波频率和编码方式,即可定制一体化红外设备。红外遥控接收设备由红外接收电路、红外解码等组成,主要

作用是将发射来的红外光信号转换为电信号,再放大、限幅、检波、整形,形成指令脉冲,输出值遥控微处理器。

  红外没接收到信号时为高电平,收到脉冲时为低电平,通过外部中断的下降沿触发中断,在中断处理函数内计算高

电平时间来判断接收到的数据是0还是1,或者判断是否是引导信号。其中计算高电平时间可以采用延时函数delay。

 

六、TFTLCD触摸屏

  TFT-LCD是薄膜管液晶显示器(thin film transistor-liquid crystal display),每个像素都设有一个薄膜晶体管,

每个像素都可以通过点脉冲直接控制,且相互独立。常用的通信模式主要有6800模式和8080模式,TFT彩屏一般都使用

8080并口模式。数据线的数量主要看液晶屏使用的是几位模式,有8根、9根、16根、18根四种类型,功能如下图所示,

其中有5根控制线和多根数据线。

  接下来看一下8080接口模式的时序图:

  实现TFT液晶显示的步骤如下:

  • IO口与TFTLCD模块相连接
  • 初始化TFTLCD模块
  • 写入内容

  以前,我们使用51单片机就是通过单片机的IO口模拟8080时序进行TFT彩屏控制,但是stm32F4自带了FSMC接口,

FSMC的NOR/PSRAM存储器控制器的接口信号与TFT彩屏类似,所以可以将TFTLCD当做SRAM设备使用。因为TFTLCD

的读写速度相差较大,一般是将读写时序分开。

  触摸屏分为电阻式和电容式,电阻式触摸屏是通过压力感应原理来实现的,电容式触摸屏是利用人体感应进行触点

检测控制。TFTLCD屏上除了FSMC控制的信号线之外,还带有触摸屏的控制线,可以单独进行控制。

 

七、MPU6050传感器

  MPU6050是一款6轴运动处理组件,整合了3轴陀螺仪和3轴加速度传感器,其内部结构框图如下图所示:

  使用步骤如下:

  • 初始化I2C接口
  • 复位MPU6050
  • 设置角速度传感器(陀螺仪)和加速度传感器的满量程范围
  • 设置其他参数
  • 配置系统时钟并使能
  • 利用DMP进行姿态解算

  从上述步骤中,我们看到MPU6050中自带数字运动处理器DMP,DMP能够将我们得到的原始数据直接转换成四元数

输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到航向角、横滚角和俯仰角,即得到了我们想要的姿态

(其中四元数是q30格式)。要使用DMP,需要将InvenSense提供的MPU6050运动驱动库移植过来。

  以下有一些概念需要理清楚:

  • 加速度计:对震动较敏感,短时间的数据不可靠,需要进行滤波;
  • 陀螺仪:对震动不敏感,但是会不断积累误差,产生漂移,长时间数据(积分)不可靠,过段时间需要用加速度数据来矫正角度。
  • 电子罗盘:一般不能保持绝对水平,需要加速度计进行倾斜补偿。此外,可以用于矫正陀螺仪航向角误差的不足。

  一般MPU6050可用于无人机,简单的无人机可以分为以下几个部分:

  • 机架:一般机型有四旋翼十字型、四旋翼X型、六旋翼I型等等,根据需要选择;
  • 飞控板:飞控板是控制核心,里面一般包括陀螺仪、气压计、磁力计、加速度仪、GPS、超声波测距等传感器;
  • 电机:需要考虑拉力、重量、电池容量、体积等来选择,通常选择无刷电机,需要用电子调速器来驱动;
  • 电池:一般用锂电池,考虑功率、电压等,注意进行低压检测,防止造成损失;
  • 螺旋桨:考虑电机转速、功率、电池电压等,电压越高,转速越快;
  • 遥控器:一般用的是Fvtaba,jr之类的。

  此外,有时候控制方向不单纯靠电机的转速来实现,还可以加舵机,这里做一下概念的讲述:

  • 伺服电机:内含(电机、传感器、控制系统等),可以用于精密控制位置、速度、力矩;
  • 舵机:类似低配版的伺服电机,主要用于控制位置;
  • 步进电机:依靠定子的线圈序列通电,不需要位置传感器,力矩小,功耗大,效率低。

 

八、SPI-FLASH

  stm32自带的Flash较小,有时候不够用。这时候我们就需要接外部Flash,用来存储程序或者数据,一般是采用SPI

进行读写通信。很多新手都不知道外部Flash具体可以用来做什么,甚至没有考虑过自带Flash不足的情况。这里举一个例

子,比如存储字库,当我们需要用到各种语言的字符时,就需要进行字库存储,然而自带的Flash大小根本不够。

  以GBK编码的字库为例,以下是运用字库的的步骤:

  • 读取汉字GBK编码;
  • 根据GBK编码寻找到该文字在字库中的偏移地址;
  • 根据字库编译地址转换为改文字的点阵数据在Flash中的偏移地址;
  • 根据Flash的地址,将文字的点阵数据读到LCD中显示即可。

  至于如何将字库存进外部Flash中,其实很简单,先将字库存入SD卡中,再通过FATFS文件系统函数以及SPI将自己制

作的字库文件读写进外部Flash中。

 

九、SDIO_SD卡

  stm32F4的SDIO提供了APB2外设总线与多媒体卡(MMC)、SD卡、SDIO卡以及CE-ATA设备之间的接口。总线的

通信是基于命令和数据的传输,多媒体卡/SD/SDIO总线上的基本事务是命令/响应事务。SDIO由两部分组成:APB2接口

和SDIO适配器,其结构框图如下:

  操作步骤如下:

  • 初始化SD卡
  • SD卡读写块函数
  • 编写主函数

   SDIO接口采用的是命令/响应的方式对SD卡、多媒体卡等进行传输数据,并带有命令、数据、时钟等通道。不同的

卡的标准不一样,我们可以从它们的官网查看:

  • 多媒体卡协会网站 www.mmca.org
  • SD卡协会网站 www.sdcard.org
  • CE-ATA工作组网站 www.ce-ata.org

  stm32带的固件库函数里面可以选择使用哪种类型的卡,避免了与卡底层标准的直接接触,操作较为方便。我们通

过SDIO接口可以很方便地进行SD卡读取操作。

  但是,为了能更好地定位SD卡下面的文件,更简便地操作文件,我们还需要加入Fatfs文件系统模块,它可以减轻SD

的工作量,方便地定位和读写文件或者图片。以上操作都可以用Fatfs的函数进行执行,比如执行在一个目录下扫描各个

文件名等。这里要注意的是,Fatfs可以支持多个卷(物理驱动器或分区),所以需要对设备进行根目录编号,一般SD为0,

EX_FLASH为1,U盘为2(并不固定,按自己喜好配置即可)。那么SD卡的根目录为“0:/”。

  Fatfs库可以通过官网下载 http://elm-chan.org/fsw/ff/00index_e.html

注:当SD卡采用FATFS系统存储bmp图片时,都是从最后开始存的,所以LCD显示扫描时,从下面开始扫较好。

 

十、ucos-III移植

  说到ucos,我们就能想到Micrium公司,这个公司专注于嵌入式产品领域,拥有十几款嵌入式领域的软件,比如RTOS

中的ucos-III,ucos-III的性能比之前的几代强了很多。ucos-III的移植教程在网上有很多,这里就不详细介绍了。我们都知道

要使用ucos-III,那必须得去官网https://www.micrium.com/上下载相应的ucos-III库,根据不同的平台、不同的CPU等来选

择对应的可移植版本,其次,我们还要注意修改启动文件,这意味着你是否需要启动ucos-III。

以上是关于stm32之外设控制的主要内容,如果未能解决你的问题,请参考以下文章

STM32外设:GPIOEXIT

STM32之DMA

STM32外设

STM32标准库与HAL库对照学习教程外设篇--红外避障传感器

stm32控制LED的亮灭

STM32CubeMX学习笔记(41)——ETH接口+LwIP协议栈使用(DHCP)