飞控驱动层原理与设计实现

飞控驱动层原理与设计实现

 

 

 

 

 

 

 

我们了解驱动层是建构在微处理器、板载传感器与交互模块之上的软件层,那么飞控驱动层原理是什么,该如何设计,这一篇就和大家一起看一下

 

STM32ARM CORTEX系列内核外围,板载各种硬件控制器支持时钟、中断和各种主流通信协议,并在存储器方面支持高速存取DMA机制减少轮询造成的传感器数据等待,同时支持FMC使用外部SDRAM对内存做拓展来解决内存不足问题

 

软件层面,固件库也对这些外设的引脚初始化和寄存器参数配置做了封装,用户可以方便地调用这些API完成初始化、参数配置和使用

 

固件库通常称为HALHardware Abstract Layer)硬件抽象层,调用HAL驱动外设流程通常如下

 

 

前两步借助HAL API完成,后三步是针对传感器等外部设备需要完成的工作

 

时钟、中断

 

STM32时钟包括外部高速外设、低速外设总线时钟与系统时钟

 

总线时钟决定了程序执行的速度。系统滴答时钟与中断是程序周期执行的核心。一些简单的无操作系统小飞控,采用周期回调任务执行方式,原理是系统滴答时钟定时时间到,进入中断处理回调完成滤波控制等任务。中断使得程序可以响应异步发生的事件,并自定义处理函数。一个典型应用场景就是,采集传感器数据如果使用中断方式替代轮询方式,就可以提高处理器利用率不会让数据等待太久

 

通信协议

 

通信协议是MCU与外设数据传输的的方式,通信协议完成传输速率控制,数据校验等功能

 

常见通信协议包括

 

I2C,SPI,UART,USB,CAN等。其中I2C,SPI用于MCU与高速传感器之间通信,如果没有特别的要求,一般权衡一下引脚位置和MCU上可用资源选用对应的协议即可,它们的传输速率一般都可以满足对这些传感器采样频率要求;串口协议简单应用广泛,除了常见TTL标准之外,在物理层有很多变种,如电脑上常见的RS232标准与抗干扰能力强,多用在工业界的RS485变种;CAN总线因为采用差分信号传输,抗干扰能力强,有些步进电机,DJI Robomaster可以控制转速、转角的电机就是采用CAN接口

 

 

此外还有一些专用的协议,如用于支持液晶显示屏显示的LTDC,用于音频数据传输的I2S,用于支持SD卡的SDIO,板载ETH外设用于支持以太网MAC层的功能,用于图像数据传输的DCMI接口等,在飞控上应用不多,暂不赘述

 

存储

 

STM32支持DMAData Memory Access)直接存储器访问,可以实现内存-内存、内存-外设之间的数据直接访问,无需CPU处理,因此可以大大提升数据处理效率

 

对于存储器,根据断电后是否会丢失存储内容,可以分为易失性存储器和非易失性存储器,非易失类通常用于离线程序数据存储,而易失类读写速度快,是运行时程序数据的缓存区

 

易失类存储器最常见的就是随机访问存储器RAM,根据存储原理又细分为两类:DRAMSRAM,其中DRAM存储的基础是电荷保持,需要定期刷新;而SRAM存储基础是锁存器结构不需要动态保持,这种存储设备数据存取较快,但集成度不如DRAM,并且价格更昂贵

 

 

FLASH即常见程序离线存储器

 

MASK ROM是出厂时通过特殊工艺固化,如一些启动引导程序

 

PROM则是可擦除重编程ROM存储器,早期Multiwii飞控,使用EEPROM保存PID等调试参数

 

如果RAM不够用,可以使用FMC机制进行外部SDRAM拓展,不过经验上讲,受到总线等限制,这样速率比使用内部SRAM要慢很多

 

其他外设

 

STM32还支持一些其他外设,如AD转换,TIM定时器,看门狗等,它们的原理和应用场景如下描述

 

ADC通常用于外部模拟信号测量,如电压;而DAC转换器一般用于给定数值,输出电压来驱动执行器件

 

TIM定时器用于PWM方波输出,常见的舵机、航模无刷电调、空心杯电机MOSFET输入信号就是采用PWM方波;也可用于电容按键输入捕获,呼吸灯显示控制

 

看门狗原理很简单,在倒数计数器到达阈值前,需要刷新计数器,否则触发复位,可以用来检测周期执行的任务是否正常运行没有发生卡住或程序跑飞

 

好啦,了解内核和片上支持的机制,就可以设计想要的外设并读写数据了。不过这样还是不够好用,我们希望再有个软件抽象层,帮助向下进行资源调度,向上提供任务和通信接口,这就是操作系统的功能,下一篇推送,一起看下操作系统如何完成这项任务的