SBUS协议:SBUS解析与合成

本文详细介绍SBUS协议的工作原理和技术细节,包括串口配置参数、数据帧格式、取反操作的重要性及其实现方式、数据发送与解析函数实现等,并提供STM32应用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在说协议之前,我想强调一点:信号要取反,硬件取反!!!!!至于为什么强调,我会在后面解释,你们先记住。

SBUS协议:使用的是串口的通讯,直接可以用串口发出,但有几点仍需要注意:
1.串口配置:100k波特率,8位数据位(在stm32中要选择9位),偶校验(EVEN),2位停止位,无控流,25个字节,
2.协议格式:(8字节)
[startbyte] [data1][data2]…[data22][flags][endbyte]
startbyte=0x0f;
endbyte=0x00;
flags标志位我没有用到;
data1…data22:对应16个通道(ch1-ch16),每个通道11bit(228=1611=176);
数据范围在0-2047之间,基本上是1102~1927,中值为1500;

ch1的11位=data2的低3位+data1的8位;
例如:data1=00110110,data2=11001111;
这时ch1=111 00110110=1846;通道1 的值就为1846;
ch2=data3的低6位+data2的高5位;
ch3=data5的低1位+data4的8位+data3的高2位;
ch4=4 7;
ch5=7 4;
ch6=2 8 1;
ch7=5 6;
ch8=8 3;
ch9=6 5;
ch10=1 8 2;
ch11=4 7;
ch12=7 4;
ch13=2 8 1;
ch14=5 6;
ch15=8 3;
ch16=6 5;
3.接下来要说的就是我开头提起的取反问题;
用stm32中给px4发时,需要取反,并且是硬件取反,软件取反是无效的(我在这个上面栽了跟头);硬件取反的电路图我贴上了,(这时转自 雪域Sky的狼窝 的博客;网址http://www.360doc.com/content/16/0818/08/35267583_584012245.shtml)
这里写图片描述

4.接下来要说的是它的间隔问题:它分两种模式(我记得是叫高速模式和普通模式)
高速模式:每隔7ms一帧数据,因为两帧的间隔只有超过3ms,才会被接受;
而根据波特率计算一下,发送25字节需要的时间+3~4ms=7ms
普通模式:每隔14ms一帧数据;

5.数据的解析跟合并我都下载了px4的源码,写成.c格式,
详细代码,我已经上传到我的博客下载页上,有兴趣的小伙伴,可以去下载一下;

#include "Sbus.h"
#include "bsp_usart1.h"
#include "string.h"

uint16_t values[16]={0};

void sbus_out(uint16_t num_values)
{
	int i=0;
	uint16_t value=0;
	uint8_t byteindex = 1;
	uint8_t offset = 0;
	uint8_t oframe[25] = { 0 };
	memset(oframe,0,25);
	oframe[0]=0x0f;
	oframe[24]=0x00;

	for (i = 0; (i < num_values) && (i < 16); ++i)
	{
		value = (unsigned short)(((values[i] - SBUS_SCALE_OFFSET) / SBUS_SCALE_FACTOR) + .5f);
		if (value > 0x07ff)
		{
			value = 0x07ff;
		}

		while (offset >= 8)
		{
			++byteindex;
			offset -= 8;
		}
		
		oframe[byteindex] |= (value << (offset)) & 0xff;
		oframe[byteindex + 1] |= (value >> (8 - offset)) & 0xff;
		oframe[byteindex + 2] |= (value >> (16 - offset)) & 0xff;
		offset += 11;
	}
	
	for (i=0;i<25;i++)
	{
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
		USART_SendData(USART1, (uint16_t)oframe[i]);     
	}
}


void sbus_decode(unsigned char *frame)
{
	unsigned int pick=0,channel=0,value1=0,piece=0;
	const struct sbus_bit_pick *decode;
	for (channel = 0; channel < 16; channel++) 
	{
		value1 = 0;

		for (pick = 0; pick < 3; pick++) 
		{
			decode = &sbus_decoder[channel][pick];

			if (decode->mask != 0) 
			{
				piece = frame[1 + decode->byte];
				piece >>= decode->rshift;
				piece &= decode->mask;
				piece <<= decode->lshift;

				piece &= 0x07ff;

				value1 |= piece;
			}
		}
		values[channel] = (uint16_t)(value1 * SBUS_SCALE_FACTOR + .5f) + SBUS_SCALE_OFFSET;
		if(channel==1)
		{
			values[channel]=3029-values[channel];
		}
	}
}


合成函数:
void sbus_out(uint16_t num_values);//参数为通道数;
values[16]就是对应的16个通道;
解析函数:
void sbus_decode(unsigned char *frame);
//frame为25个u8位数据;

看大家有几个问题,统一回答一下:
1.宏定义具体是多少:
#define SBUS_FRAME_SIZE 25
#define SBUS_RANGE_MIN 200.0f
#define SBUS_RANGE_MAX 1800.0f
#define SBUS_TARGET_MIN 1000.0f
#define SBUS_TARGET_MAX 2000.0f
#define SBUS_SCALE_FACTOR ((SBUS_TARGET_MAX - SBUS_TARGET_MIN)/(SBUS_RANGE_MAX-SBUS_RANGE_MIN))//0.625f
#define SBUS_SCALE_OFFSET (int)(SBUS_TARGET_MIN - (SBUS_SCALE_FACTOR * SBUS_RANGE_MIN + 0.5f)) //874.5f

2.下载页是多少:
https://download.csdn.net/download/peach_orange/9667070
需要下载积分,没有积分的兄弟给我发个邮件,我邮件给你:
pantaojiacheng@163.com

3.flags标志位的具体作用:
flags标志位是用来检测控制器与px4是否断开的标志位。
flags=1:控制器与接收器保持连接
flags=0:控制器与接收器断开(失控),px4会控制电机停转。
炸过一次机,就是因为遥控器与接收器之间断开连接了,结果这一位没有设置,导致四轴一直按照最后一次指令在飞。

### 关于Cadence 17.2版本中Pspice的教程 #### 安装指南 对于希望安装Cadence PSpice 17.2版本的用户来说,需注意几个关键步骤。当点击安装Cadence软件时,应指定添加安装包路径以及设定不含空格和汉字字符的安装路径[^1]。完成基础软件部署后,还需通过加入Hotfix文件的方式安装必要的更新补丁。最后,在一切设置妥当之后,务必记得重启计算机以使更改生效。 #### 绘制原理图 一旦上述准备工作就绪,则可以在重新启动后的环境中利用OrCAD Capture CIS工具着手绘制所需的电路原理图。此阶段涉及的具体操作包括但不限于元件的选择、放置及其间的连接构建等动作。 #### 创建自定义电路模块 针对那些想要进一步定制化工作流或者提高效率的技术人员而言,掌握如何基于个人需求创建专属的电路组件显得尤为重要。在Cadence PSpice环境下,这意呸着能够把一系列预设好的子电路打包成独立单元以便重复调用或分享给团队成员。具体实现过程涵盖了从草稿构思到最后成品导出的一系列环节[^2]。 #### 设计流程概览 在整个电子设计自动化领域里,由概念验证直至最终产品成型往往遵循一套既定的工作模式。对于采用Cadence平台开展工作的工程师们来讲,这套方法论通常始于案例研究进而过渡至详尽的设计实施;期间会经历诸如原理图表绘、错误检测修正、性能测试评估等多个重要节点直到所有目标达成为止[^3]。 #### 原理图设计概述 深入探讨一下项目结构的话就会发现,“Design Resources”部分主要负责存储整个项目的配置信息。“Outputs”则用于汇总各类中间产物或是终期报告文档。“Referenced Projects”允许设计师轻松关联其他辅助性的外部资料库从而促进跨部门协作交流活动顺利展开。值得注意的是如果当前任务涉及到仿真的话那么这里还会额外显示出专门用来支持此类作业的相关条目——即所谓的“PSpice Resources”。 ```python # Python代码示例仅作为装饰用途,并不实际参解释说明逻辑 def example_function(): pass ```
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值