|
本帖最后由 yimisunrise 于 2021-9-25 12:51 编辑
我后面抽空试一试这个设置。不知道能解决我的问题?
以下是复制网友的博文内容,写得挺不错的,分享给大家也学习学习。
穿越机飞控CLI指令里,串行反相命令set serialrx_inverted=on这个命令下,单片机都干了啥?
我查了反相器芯片,但这东西怎么受程序控制的呀?
可能有些较真的小伙伴在研究S.port或者F.port时就会产生这种疑问。
这里首先给出一个结论,除了F3飞控,常见的F4、F7飞控上受程序控制的反相器是一个独立的IC,或者叫小芯片,但是他并不是严格意义电路上讲的“反相器”(电路上狭义来说反相器单指非门电路),而是“异或门”芯片。
常见的有曼巴飞控上面用的单路异或门SN74LVC1G86DCKR(丝印CH5),以及omnibus F4 V3/V3S上用的双路异或门SN74LVC2G86(丝印L86,不知道是不是国内山寨的)。
首先说up只是控制科学与工程学科检测技术与自动化装置专业的一名渣渣,稍微和单片机多打了一些交道,所以斗胆去挖了一下betaflight的源码,发现serialrx_inverted这个命令在源码当中分为了两种情况处理,一种是针对外置异或门电路的,一种是不带有外置异或门电路的。
这两种处理方法有什么不同呢?经过up对单片机手册的查阅,发现STM32F303系列芯片的UART模块,已经带有invert电平反转功能,甚至还有swing即收发引脚互换的功能,这就有点可怕了哈哈。也就是说对于F3系列的飞控,调用serialrx_inverted指令的时候,程序只需要对STM32F303芯片中USART_CR2寄存器的16和17位进行修改既可以实现对反转电平的UART信号的读取。F722的芯片也同样具有电平反转等UART模块高级功能(借助HAL库编译的固件源码里会很清晰的标明),但是由于up手头只有F3和F4飞控,在没有对F7飞控进行核实以前不能够给出确切结论,F7到底是用哪种方案。
目前主流的STM32F405本身的UART模块是不具有电平反相功能的,那么程序便指定了额外的引脚(以早期常见的F4 V3S飞控为例,其C8引脚和C9引脚控制UART6的RX和TX电平与焊盘的信号之间是否反转)参与外接的额外异或门电路的操作,通过控制这个被指定的额外的引脚GPIO输出高低电平,与来自焊盘的信号(针对RX通路来说)或来自芯片TX引脚(针对TX通路来说)进行异或,最后结果送入芯片或送出到焊盘,从而控制芯片收发的电平和焊盘上的电平是否反转。(注:异或操作可以自行百度查阅其真值表,即可很容易的理解)因此,对于F4系列飞控,执行serialrx_inverted指令的时候,实质上是操作了芯片的某一个指定的引脚,切换了其输出电平的高低。有兴趣的小伙伴可以自行实验,测量一下异或门电路上的电平变化。
这里简单的介绍一下普通UART电平逻辑,SBUS电平逻辑,以及F.PORT电平逻辑。首先普通UART电平逻辑和F.PORT电平逻辑是相同的,都是总线静息时为高电平(3.3或5V)数据起始位为1个低电平,八个数据位低电平为逻辑“0”,高电平为逻辑“1”,停止位一般设置为了1个低电平,没有校验位。然而SBUS信号则不同,它的静息状态,起始位数据位和停止位校验位等等的电平逻辑,全部与普通UART逻辑相反,因此利用普通UART读取SBUS信号时,就需要在通路上加一个额外的电平反相器件(最简单的就是一个npn三极管或n沟道mos管配合一个上拉电阻,其实也就是简单的非门电路,有条件的还可以上一些带有滞回特性的施密特反相器)才能够正常使用。
但是如果使用非门电路的话,为了兼容普通与sbus信号的需求,就需要在反相器的前后各引出一个焊盘,这样电路设计上总会多出一个平时用不上的焊盘,而且信号是否反转还不能够受到软件的任意控制,这就很让强迫症的设计师头疼。从正向研发的角度看,这时我们应该需要找到一种可以受控的反相器,平时反相器受控透传信息,需要时可以受控的反相电平传输信息。但我们可以查到的受控的反相器,多数设计是使能时(enable,使其工作时)反相器工作,反转电平,失能时反相器的输出端呈高阻态(及一种等效成为什么都没有连接的状态,仿佛连接线断开,或者说压根就没有这条信息通路的状态)。这种受控的反相器并不能满足我们的要求,于是便有了异或逻辑电路的解决方案。异或电路是一个两输入单输出的逻辑电路,可以由其中一个输入的高低电平,决定另一个输入与最终输出电平之间是顺延(透传)还是反相的关系,这样便可以做到我们希望的受控反相啦。
文章的最后再送出一个小福利,除了上述的反相命令之外,设置F.PORT口的时候还会用到一个命令叫set serialrx_halfduplex=on的指令,这个指令具体实现的是什么呢?
根据up目前对源码的了解,这个指令是调用STM32硬件UART模块中的“单线半双工”通信模式。但是STM32原厂的单线半双工模式,默认使用的是UART模块中的TX引脚,因此对于一些没有引出TX引脚的飞控,打开半双工模式后,还需要玩家自己找到对应的TX引脚才能够正确接线哦~
|
来自安卓客户端
|