sbus 代码怎么写 stm32

sbus 代码怎么写 stm32,第1张

起始字节startbyte = 11110000b (0xF0),但实际上用STM32(据说ARM核)收到的是0x0F。中间22个字节就是16个通道的数据了,为什么是16个通道?因为22x8=11x16,每个通道用11bit表示,范围是0-2047。不信看波形图:

什么,还看不清?

两帧之间的时间间隔4ms(高速模式),约7ms一帧。

基本而言,data1为ch1的低8位,data2的低3位为ch1的高三位,data2的高5位是ch2的低5位,data3的低6位是ch2的高6位,以此类推,如下图所示:

flags的结构如下所示:

flags:

bit7 = ch17 = digital channel (0x80)

bit6 = ch18 = digital channel (0x40)

bit5 = Frame lost, equivalent red LED on receiver (0x20)

bit4 = failsafe activated (0x10)

bit3 = n/a

bit2 = n/a

bit1 = n/a

bit0 = n/a

endbyte为0x00。

一、程序实现:

在STM32中的具体实现,除了如上述内容配置串口参数,还需要写好中断函数,写好解析函数。思路很简单,利用间隔时间来区分两帧,收到一帧数据后,做如下检查:

1. 字节数够不够?

2. 第一个字节是不是0x0f?

3. 最后一个字节是不是0x00?

4. 检查flag中的标志位

举个中断函数栗子:

void UART4_IRQHandler(void)

{

static uint8_t byteCNT = 0

static uint32_t lastTime = 0

uint32_t curTime

uint32_t interval = 0

HAL_NVIC_ClearPendingIRQ(UART4_IRQn)

//如果时间间隔大于3毫秒,则认为是新的一帧

if(lastTime == 0)

{

curTime = HAL_GetTick()

lastTime = curTime

}

else

{

curTime = HAL_GetTick()

interval = curTime - lastTime

lastTime = curTime

if(interval >= 3)

{

if(byteCNT == 25 &&uart4_cache1[0] == 0x0f &&uart4_cache1[24] == 0x00)

{

rc_captured = 0

memcpy(uart4_cache2, uart4_cache1, byteCNT)

rc_captured = 1

}

byteCNT = 0

}

}

if(RESET != __HAL_UART_GET_FLAG(&huart4, UART_FLAG_ORE))

{

__HAL_UART_CLEAR_FLAG(&huart4, UART_FLAG_ORE)

uart4_cache1[byteCNT++] = huart4.Instance->DR

}

if(RESET != __HAL_UART_GET_FLAG(&huart4, UART_FLAG_RXNE))

{

uart4_cache1[byteCNT++] = huart4.Instance->DR

}

第1步:选择框架

首先:它们坚韧且防撞击,你可以轻松地将它们粘合成一个完整的工作状态好几次。我有全油门碰撞,需要一个袋子来收集在球场上传播的所有碎片,但是有很多胶水总是设法再次飞行它们。

最后的选择是翼永Z-84框架,这是一个便宜但非常受欢迎的框架,具有良好的动态形状和高效的翼型。考虑过EveryineBlackwing,但Z-84因为它的翼展更大(然后更少的机翼载荷)而领先。此外,一个名叫MarkQvale的家伙也很欣赏它,你可以相信,如果他对一个框架感到满意,那么这是一个很好的框架。

第2步:基本组件

MOTOR(MT):为了保持低价我决定使用四轴飞马达。这将是足够好的,我也希望有螺纹电机轴,不需要任何其他东西来固定螺旋桨(“飞机电机”通常有一个光滑的轴,需要一个道具适配器/支架)。常见的22042300KV电机是一个不错的选择。2205或2206电机也可以工作,但没有特别的原因它们会更加沉重和昂贵。您可以/将尝试减少KV,以便使用更大的道具而不会使ESC或电池过载。更大更慢的道具效率更高,但你必须处理你的框架可用空间。

ESC:这个组件从电池获取电能并将其送到电机,具体取决于在收到的信号上。没有理由在这里变大,12Amps足以毫无困难地飞行,30Amps允许无限制的垂直飞行。我将保持良好的平衡,20AESC可以为循环和其他杂技手段提供充足的动力。

一个重要的ESC功能是它的BEC,电池消除电路。它基本上是一个电压调节器,可以为RX,伺服器和其他电子设备提供合适的电压。BEC是相关的,因为大多数专家都认为伺服系统应该由专用电路供电,该电路不能为FC和/或RX供电。

PROPELLER:迄今为止我发现的最佳折衷方案是Dalprop5046C三刀片。两个刀片6040或6030可以提供更高的效率,但它们将非常靠近框架这会产生噪音。这不是“大声熄灭空中客车”,但它肯定是响亮的,当我在高尔夫俱乐部和其他安静的地方飞行时,我宁愿保持低调。无论如何,这只是个人选择。你不能进一步将直径增加到7“或更多,你会碰到框架。你可以减少支柱直径,但你会失去效率。效率很高。无论如何,5050到4045之间的道具应该得到如果你手边只有四个支柱,你仍然可以使用它们。

BATTERY:任何击球手可以提供20-25A的y是可以的,容量应该在1000到1800mAh之间。我想1300mAh20C3S锂电池将是最佳选择,价格/性能明智。

SERVOMOTORS:这些小部件会移动副翼,所以他们将控制飞机的飞行路径。你可以想象这不是省钱的最佳组件,放弃质量。如果您对esc或电机有问题,您仍然可以尝试着陆进行受控制的滑行,如果您的伺服器没有响应,则飞机将失控。好消息:你只需要其中两个,所以优质伺服系统不是预算的一大块。任何带有金属齿轮的良好数字伺服都是合适的选择,合适的尺寸是9g伺服。

RADIOTRANSMITTER/RECEIVER(TX/RX):我不会谈论这个组合,因为主要有两个选项。选项一:你已经拥有一个,所以你已经知道我在说什么以及如何使这个项目适应你的收音机。选项二:你没有收音机,那么你应该坚持使用建议的收音机。一个不错的选择是FlyskyFS-I6搭配FS-X6B。这些廉价的收音机有很多改装潜力,你可以看到我的其他教程,所以你可以提高性能,并可以添加很多功能只是为了几块钱。无论如何,使用这个接收器,你可以轻松地发送超过1.5公里的飞机,这对于休闲飞行来说并不坏。其他收音机更好吗?是的,但价格高出好几倍,所以这没有意义。最后,唯一的要求是有一个可以输出串行总线的接收器(用于Flysky的i-bus,还有sbus和其他工具也可以工作)或至少PPM输出。建议使用串行总线!

CAMERA(CAM):这个选择非常主观,可能会对您的钱包产生显着影响。你可以用5到100美元的相机飞行,这里的性能与价格紧密相关。一些评论说没有最好的一个你不能飞。这是假的,你实际上可以飞,舒适性更差,颜色可能会褪色和/或不真实,但仍然足够好。

VIDEOTRANSMITTER(VTX):不同的地方有不同的规则,请检查你的。我的选择是便宜但足够好的EeachneTX526。它可以在通常的5.8GHz范围内工作,它可以设置为不同的传输功率,并且它具有最小的占位面积之一。

VIDEOANTENNA:您有两个主要选择:线性和圆极化。股票天线,直线型“类似路由器”,是线性极化天线,如果您想要最远的视频范围,这是最佳选择,但它需要您的飞机大部分是平坦的。建议的“蘑菇状”天线使用圆形极化,如果您有活跃的飞行,这些天线是最佳选择。线性极化要求两个天线几乎对齐,圆极化不关心。我想做循环和转弯(高倾斜角度),因此我选择使用圆极化天线。在发射器和接收器上具有相同的偏振非常重要,并注意圆偏振可以是“左或右”偏振,不要混合它们。长话短说:在发射器和接收器上使用相同的天线,你不会犯错。

飞行控制器(FC):有很多不同的型号,你可以有完全可选和昂贵的或您可以拥有基本功能,但如果您需要一些高级功能,则需要其他组件。我的选择是OmnibusF4ProV3,这是一个很好的混合嵌入式功能,价格合理。首先它是F4而不是F3CPU,这对于目前为止的所有内容来说已经足够了。它有一个嵌入式OSD芯片,可以直接从主配置器中轻松设置。它具有3A5VBEC,足以轻松为其他所有设备供电。它有一个嵌入式电压传感器(通用)和电流传感器(不常见)。有三个物理串口,你可以连接很多额外的设备,如GPS,遥测,串行总线RX输入。你可以节省一些钱购买SPF3板或PicoBlk板,但你需要购买和设置外部OSD模块,外部电流传感器,软件无法达到相同的循环速度。更不用说使用“外部”软件配置外部组件的额外工作量,额外的重量和时间要求附加布线。

GPS:这是自主航班所必需的,我们主要用它来覆盖我们的屁股,并有一架可以返回家的飞机在视频/无线电信号丢失的情况下。最常见的模块也有一个嵌入式指南针,但这适用于直升机。由于我们的飞机必须至少具有一定的飞行速度,因此通过坐标减法来定义其方向总是很容易的。最好的选择是BN-180或BN-220模块。

第3步:可选组件

第4步:框架组装

发送者: 把结构体对象 通过 序列化 变成二进制缓存,然后 传输这个缓存。

接受者: 把接受二进制缓存 通过序列化 再组建成结构体对象

这个是现在最通用的标准

建议你使用下boost::serialization


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7919871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存