应用与硬件有关的法子简化嵌入式体系设计:根

- 编辑:足球滚球app下载 -

应用与硬件有关的法子简化嵌入式体系设计:根

简介本文援用地点:经由过程应用与硬件有关的驱动顺序,计划职员能够自在抉择微把持器或处置器的范例来治理传感器,而不受硬件的限度。这种方式的上风在于,除了供给商供给的基础软件层外,还能够增加额定的软件层,同时简化传感器的集成。本文将以惯性丈量单位(IMU)传感器为例,阐明怎样实现与硬件有关的驱动顺序,不外,这种方式同样实用于其余范例的传感器跟器件。驱动顺序采取C言语编写,并在一款通用微把持器长进行了测试。器件抉择IMU传感器重要用于活动检测,以及经由过程减速度跟角速率来丈量活动强度。本示例抉择应用ADIS16500 IMU传感器(图1),由于与庞杂且昂贵的分破计划计划比拟,该传感器可能为准确的多轴惯性检测与产业体系的集成供给简略且经济高效的方式。图1 ADIS16500评价板重要利用包含:■   导航、稳固性跟仪器仪表■   无人机跟主动驾驶车辆■   智能农业跟施工机器装备■   工场/产业主动化、呆板人■   虚构/加强事实■   活动物联网图2 ADIS16500框图ADIS16500是一款精细微型机电体系(MEMS) IMU,内置一个三轴陀螺仪、一个三轴减速度计跟一个温度传感器。拜见图2。该IMU的敏锐度、偏置、瞄准、线性减速度(陀螺仪偏置)跟坐标轴原点(减速度计地位)已在工场校准。这象征着在种种前提下都能供给准确的传感器丈量。经由过程该接口,微把持器能够写入跟读取用户把持存放器,并读取输出数据存放器,从而取得减速度计、陀螺仪或温度传感器数据。为此,治理该接口所需的全体软件跟固件均已实现开辟。图2所示为数据停当(DR)引脚。该引脚是一个数字旌旗灯号,唆使何时可从传感器读取新数据。DR引脚可被视为经由过程通用输入/输出(GPIO)端口的输入,因而可经由过程微把持器轻松治理。从硬件的角度来看,IMU传感器跟微把持器将应用SPI接口衔接,该接口是由nCS、SCLK、DIN跟DOUT引脚构成的4线接口。DR引脚应衔接到微把持器的此中一个GPIO。别的,IMU传感器须要3 V至3.6 V的电源电压,因而3.3 V就充足了。懂得嵌入式体系的典范软件构造图3 嵌入式体系的软件/固件构造懂得嵌入式体系的通用软件跟固件构造对与传感器驱动顺序衔接至关主要。这将辅助计划职员构建一个机动且易于集成就任何名目的软件模块。别的,驱动顺序必需以模块化的方法实现,以使计划职员可能依附于现有函数增加更高等的函数。嵌入式体系的软件构造如图3所示。在图3中,档次构造从利用层开端,利用代码就是在这一层编写的。利用层包含main文件、依附于传感器的利用模块,以及依附于治理处置器设置的外设驱动顺序的模块。别的,在利用层中,另有与微把持器必需处置的义务相干的全部模块。比方,经由过程中止或轮询、状况机等治理义务的全部软件。利用层级别依据名目的范例而有所差别,因而差别名目中实现的代码也差别。在利用层,体系的全部传感器依据其数据手册停止初始化跟设置。传感器驱动顺序供给的全部大众函数均可挪用。比方,读取担任输出数据的存放器,或许写入一个存放器以变动设置/校准的顺序。利用层上面是传感器的驱动层,这一层有两品种型的接口。可从利用层挪用的全部函数都在这一层实现。别的,函数的原型拔出到驱动顺序标头文件(.h)中。因而,经由过程检查传感器驱动顺序的标头文件,你能够懂得驱动顺序的接口以及可从较高层级挪用的函数。较初级其余层将与特定外设驱动顺序衔接,这些外设驱动顺序依附于治理传感器的微把持器。外设驱动顺序包含治理微把持器外设的全部模块,比方SPI、I2C、UART、USB、CAN、SPORT等,或治理处置器外部模块的模块,比方准时器、内存、ADC等。因为它们与硬件严密相干,因而称为初级函数。比方,因为微把持器差别,因而每个SPI驱动顺序都是差别的。咱们以ADIS16500为例。接口是SPI,因而其驱动顺序将与微把持器的SPI驱动顺序封装在一同。对差别的传感器跟差别的接口也是如斯。比方,假如另一个传感用具有I2C接口,那么同样地,将在传感器的初始化进程中与微把持器的I2C驱动顺序封装一同。传感器驱动顺序的上层是外设驱动顺序,各种微把持器的外设驱动顺序各不雷同。如图3所示,外设驱动顺序跟初级驱动顺序是离开的。实质上,外设驱动顺序经由过程可用的通讯协定供给读写函数。因为初级驱动顺序将治理旌旗灯号的物理层,因而它十分依附于计划职员所应用的硬件。外设跟初级驱动层每每经由过程可视化东西从微把持器的集成开辟情况(IDE)天生,详细取决于装置微把持器的评价板。驱动顺序实现与硬件有关的方式支撑在差别利用、差别微把持器或差别处置器中应用雷同的驱动顺序。这种方式取决于驱动顺序的实现方法。要懂得驱动顺序的实现方法,起首要看接口,或图4中的传感器标头文件(adis16500.h)。标头文件包括有效的大众宏。此中包含存放器的地点、SPI最年夜速率、默许输出数据速度(ODR)、位掩码,以及减速度计、陀螺仪跟温度传感器的输出敏锐度,这些宏与用于表现数据的位数(16或32)有关。图4表现了这些宏,此中仅表现了多少个存放器的地点作为示例。本文援用的代码可拜见附录。图4 ADIS16500标头文件(adis16500.h)中表现的宏附录中的图3表现了包含adis16500.h在内的每个模块均可应用的全部大众变量跟大众范例申明,此中界说了新的范例,以便更无效地治理数据。比方,ADIS16500_XL_OUT范例被界说为包括三个浮点的构造,每个轴(x、y跟z)一个浮点。别的,还经由过程罗列来支撑差别的传感器设置,使计划职员可能机动地抉择合乎本身需要的设置。最值得存眷的是使驱动顺序与硬件有关的局部。在大众变量局部的扫尾(附录中的图3),有三个要害的范例界说:指向三个基础函数的指针,或许SPI发送跟接受函数,以及为天生准确的停转时光,两次SPI拜访之间所需的耽误函数。这些代码还表现了可指向的函数的原型。SPI发送函数将指向待发送值的指针作为输入,而后前往可供检讨的内容,以断定发送能否胜利。SPI接受函数也是如斯,该函数将指向变量的指针作为输入,这个指针将存储接受时读取的值。耽误函数以浮点数作为输入,表现计划职员想要等候的微秒数,不前往任何内容(void)。经由过程这种方法,计划职员能够在利用层(比方在main文件中)应用这些特定的原型来申明这三个函数。申明后,他们能够将这三个函数赋值给ADIS16500_INIT私有构造的字段。附录中的图2罗列了一个示例,以辅助更好地舆解最后一步。SPI发送器、接受器函数跟耽误函数在main文件中申明为静态函数,因而属于利用层。这些函数依附于外设驱动顺序函数,因而传感器驱动顺序自身与硬件有关。这三个函数被调配给一个变量的字段,而这些字段是指向函数的指针。如许一来,计划职员能够封装传感器跟微把持器,而无需修正传感器驱动顺序代码。假如计划职员调换微把持器,他们只要将三个静态函数内的初级函数调换为新微把持器的响应函数,从而调剂main文件。经由过程这种方式,驱动顺序变得与硬件有关,由于计划职员不须要变动传感器的驱动顺序代码。微把持器的IDE中平日包括spiSelect、spiReceive、spiUnselect、chThdSleepMicroseconds等初级函数。在本例中,所用的微把持器评价板是SDP-K1,它嵌入了STM32F469NIH6 Cortex®-M4微把持器。该IDE是ChibiOS,这是一个收费的Arm®开辟情况。附录中的图4表现了利用级其余可挪用函数原型。这些原型以及附录中图2跟图3探讨的全部其余软件跟固件都可在传感器驱动顺序的标头文件(adis16500.h)中找到。起首,初始化函数(adis16500_init)将指向ADIS16500_INIT构造的指针作为输入,并前往状况代码,以唆使初始化能否胜利。初始化函数的实当初传感器驱动顺序的源文件(adis16500.c)中实现。附录中的图5所示为adis16500_init函数的代码。起首,界说名为ADIS16500_PRIV的范例,此中至少包括ADIS16500_INIT构造的全部字段,而后申明一个属于该范例的私有变量_adis16500_priv。在初始化函数中,利用层通报的ADIS16500_INIT构造的全部字段将赋值给私有变量_adis16500_priv的字段。这象征着,对传感器驱动顺序的任何后续挪用都将应用由利用层传入的SPI读写函数跟处置器耽误函数。这一点很要害,正因如斯,传感器驱动顺序才干与硬件有关。假如计划职员想要变动微把持器,只要变动通报给adis16500_init函数的函数即可,不须要修正传感器驱动顺序代码自身。在初始化函数扫尾,_adis16500_priv变量的已初始化字段设置为false,由于初始化进程尚未实现。在该函数停止时,该字段将设置为true,而后前往。计划职员每次挪用另一个大众函数(附录中的图4)时,都市履行以下检讨:假如_adis16500_priv.initialized为true,能够持续;假如为false,将破即前往ADIS16500_RET_VALERROR过错。这是为了避免用户在不先初始化传感器驱动顺序的情形下挪用函数。持续探讨初始化函数,履行以下步调:1.经由过程读取ADIS16500_REG_ PROD_ID存放器,检讨事后已知的产物ID。2.将利用层(main.c)通报的值写入ADIS16500_REG_MSC_CTRL存放器的响应位字段,设置数据停当(DR)引脚极性。3.将利用层(main.c)通报的值写入ADIS16500_REG_MSC_CTRL存放器的响应位字段,设置同步形式。4.将利用层(main.c)通报的值写入ADIS16500_REG_DEC_RATE存放器,设置抽取率。初始化函数取决于读写存放器函数(附录中的图6)。因而,为_adis16500_priv变量赋值之后,须要实现上述四个例程。不然,在挪用读取或写入存放器函数时,它们不晓得该应用哪个SPI发送器、接受器跟处置器耽误函数。参考附录中的图4,在初始化函数之后,还能够挪用其余大众函数。上面是已实现例程的功效描写,所示为初级别例程。本文的第二局部将具体先容驱动顺序的其余已实现函数。以下全部函数只能在初始化函数之后挪用。为此,将在每个函数扫尾细心检讨,以断定传感器能否已初始化。假如未初始化,顺序会破即前往过错。■   adis16500_rd_reg_16该函数用于读取16位存放器。该函数实现可拜见附录中的图6。输入包含ad,这是一个uint8_t变量,表现要读取的存放器的地点,以及*p_reg_val,这是指向uint16_t范例变量的指针,表现读取值将赋值的目的。要经由过程SPI协定读取存放器,须要拜访两次SPI;第一次拜访是为了发送地点,第二次是为了读回被寻址存放器的值。两次拜访之间须要有停转时光,因而须要耽误函数。在第一次拜访进程中,咱们发送读/写位,在本例中为1(R = 1,W = 0),存放器地点移位8位,再弥补8位0,因而序列如下:R/W | AD6 | AD5 | AD4 | AD3 | AD2 | AD1 | AD0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |此中AD代表地点,R/W代表读/写位。经由耽误后,函数经由过程SPI读取值,并将该值通报给输入指针。ADIS16500的存放用具有一个包括高位值(8个最高无效位)的洼地址跟一个包括低位值(8个低无效位)的低地点。为了取得16位的完全值(低位跟高位),应用低地点作为ad曾经充足,由于低地点跟洼地址是持续的。■   adis16500_wr_reg_16该函数用于写入16位存放器。该函数实现可拜见附录中的图6。输入包含ad,这是一个uint8_t范例变量,表现要写入的存放器的地点,以及reg_val,这是uint16_t范例变量,表现要写入存放器的值。对读取函数,须要斟酌低地点跟洼地址以及低位值跟高位值。因而,依据数据手册,要想写入ADIS16500的存放器,须要在发送时拜访两次SPI。第一次拜访将发送即是0的R/W位,接着是低存放器地点,而后是低位值,因而序列如下:R/W | AD6 | AD5 | AD4 | AD3 | AD2 | AD1 | AD0 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |,此中D代表数据。第二次SPI发送器拜访将发送即是0的R/W位,接着是高存放器地点,而后是高位值,因而序列如下:R/W | AD14 | AD13 | AD12 | AD11 | AD10 | AD9 | AD8 | D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 |。写入跟读取存放器函数现实上也能够界说为私有,因而从驱动顺序软件模块外部弗成见,也弗成挪用。将它们界说为大众是为了可能调试。如许一来,计划职员可能疾速拜访传感器中的任何存放器以停止读取或写入,从而辅助处理成绩。■   adis16500_rd_acc该函数从输出数据存放器读取x、y、z减速度数据,并前往它们的值,单元为[m/sec2]。该函数实现可拜见附录中的图7。输入是指向ADIS16500_XL_OUT构造的指针,它只嵌入三个字段:以浮点范例表现的x、y、z减速度。在这三个轴上,读取减速度的方法是雷同的,独一的差别在于要读取的存放器。每个轴有其各自要读取的存放器:x轴必需在x减速度输出数据存放器上读取,y跟z轴也在响应存放器上读取。减速度值将用32位值来表现,因而要读取的存放器有两个。一个读取高16位,一个读取低16位。因而,经由过程检查代码可知,将停止两次存放器读取拜访,再加上恰当的移位跟OR位运算,失掉全部二进制值并存储在名为_temp的私有int32_t变量中。而后,数据将经由二进制转二进制补码的转换。转换后,用二进制补码值除以敏锐度(单元为[LSB/(m/sec2)]),如许终极将取得以[m/sec2]为单元的减速度值。此值将记载到指针的x、y或z字段,该指针指向已作为输入通报的构造。■   adis16500_rd_gyro陀螺仪读取函数与减速度读取函数的实现方式完整雷同。毫无疑难,该函数将读取x、y、z陀螺仪数据,单元为[°/sec]。实在现方式可拜见附录中的图8。与减速度函数相似,函数的输入是指向ADIS16500_GYRO_OUT构造的指针,该构造嵌入以浮点范例表现的x、y跟z陀螺仪数据。读取的存放器是陀螺仪输出数据存放器。二进制值将用32位表现,要取得二进制补码值,须要实现与减速度函数雷同的步调。实现二进制到二进制补码转换后,用失掉的值除以敏锐度(单元为[LSB/(°/sec)]),终极失掉以[°/sec]为单元的值,而后该值将记载到指针的x、y或z字段,该指针指向已作为输入通报的构造。论断本文论述了嵌入式体系的典范软件/固件客栈,先容了IMU传感器的驱动顺序实现。与硬件有关的方式为种种传感器或器件供给了可反复应用的方式,即便接口(SPI、I2C、UART等)差别也不要紧。后续文章“应用与硬件有关的方式简化嵌入式体系计划:驱动顺序实现”进一步具体说明了传感器驱动顺序的实现方式。作者简介Giacomo Paterniani领有博洛尼亚年夜先生物医学工程学位,并在摩德纳-雷焦·艾米里亚年夜学取得电子工程硕士学位。结业后,他在摩德纳-雷焦·艾米里亚年夜学担负了一年研讨员。2022年4月,他作为研讨生现场利用工程师参加ADI公司的研讨生名目。2023年4月,他成为一名现场利用工程师。