DSHOT600电调协议Verilog

news/2024/11/21 2:35:05/

DSHOT600电调协议

Dshot,一种全新的电调协议。穿越机,真的是航模发展的奇迹之一。 Cleanflight,Raceflight,Betaflight,Kiss,四大开发团队,发展目标不太一样。大家知道,在遥控接收机上面,有PWM,PPM,这些都是模拟信号;而SBUS和IBUS等这些xxxBus协议就是数字协议,走的是单片机的串行接收端口。那么由Futaba和Frsky等遥控器厂家大力推行串行数字接收协议,大家也看到他们的牛逼之处。但是我们现在用的电调都是模拟PWM方波信号,于是,由Flyduino(Kiss飞控的公司)联合Betaflight开发团队共同研发了Dshot数字电调协议。

数字电调协议的组成
16位 = 11位油门信号 + 1位电调信息回传 + 4位循环冗余校验

11位 - 2048步骤的分辨率油门值
1位 -遥测要求
4位 - CRC校验(检查信号的正确性)

在这里插入图片描述
在这里插入图片描述
如何代表0和1呢?
拿Dshot600来说,一位信号就大概是1.67微秒,那么通过对时间的占空比代表0或者1.
如果表示0:高电平占据625纳秒,
如果表示1:高电平占据1250纳秒

在这里插入图片描述
Dshot数字电调协议的优点
1.不再需要校准电调油门行程
2.精准的电调信号,数字信号的最大优点,由于PWM是模拟信号,容易出现传输过程中出现的波形变形问题
3.相比目前“1000-2000”的值,Dshot的行程由“0-2048”扩展(从00000000000到11111111111),毕竟有11位二进制数,2的11次方就是2048
4.速度上面,比Oneshot电调协议快太多
5.安全性,Dshot自带四位循环冗余校验(CRC)

与Oneshot和Mutishot的对比
Dshot完全是数字信号,Oneshot和Mutishot是模拟信号,如果在使用上,电调硬件或者软件多多少少需要进行滤波设置,去除由于传输过程中带来的噪声,大家如果想用bls电调升级到dshot,估计就得手动把电调是的电容去除掉,而这颗电容或电阻就是用于硬件滤波的,而Dshot除了省去校准电调行程外,在传输过程中根本不需要进行滤波!毕竟0就是0,1就是1,且带有循环冗余校验位,很爽。

速度对比(全油门情况下的对比)

Oneshot125 – 250 uS
DShot150 – 106.7 uS
Oneshot42 – 84 uS
DShot300 – 53.3 uS
DShot600 – 26.7 uS
Multishot – 25 uS

以上转载至:https://www.pianshen.com/article/7004689118/


//	Module Name:	dshot600
//	Author Name:	Yang Cheng Yu 杨成煜
//	Project Name:	DSHOT600
//	University		NanJing University or Information Science & Technology
//					南京信息工程大学 电子与信息工程学院
//					Xi An University of Technology
//					西安理工大学 自动化与信息工程学院
//	DATE:			2021/5/4
//	Describe:
//	DSHOT600协议,0-10位为油门数据,11位为遥
//	测信号规定,此处默认为1,12-15位为循环冗余
//	校验码。
//
module	dshot600(input			i_sys_clk,input			i_sys_rst_n,output	reg		o_out,input	[10:0]	i_value
);localparam		CNT_1_67US = 83;//1.67uslocalparam		CNT_LOW = 31;//表示0时,高电平时间625nslocalparam		CNT_HIGH = 62;//表示1时,高电平时间1250nsreg[7:0]		cnt_cycle;reg[4:0]		cnt_bit;reg[10:0]		r_value;reg[7:0]		cnt_high_temp;reg[3:0]		crc;reg				r_i_crc_valid;wire[3:0]		w_crc_in;wire[3:0]		w_crc_out;wire[10:0]		w_value;assign			w_value = r_value;assign			w_crc_in = crc;wire			w_i_crc_valid;wire			w_o_crc_valid;assign			w_i_crc_valid = r_i_crc_valid;CRC4_D11 CRC4_D11_inst(.i_sys_clk			(i_sys_clk),.i_sys_rst_n		(i_sys_rst_n),.i_data				(w_value),.i_crc				(w_crc_in),.o_crc_new			(w_crc_out),.i_valid			(w_i_crc_valid),.o_valid			(w_o_crc_valid)
);	always	@(posedge i_sys_clk or negedge i_sys_rst_n)beginif(~i_sys_rst_n)begincnt_bit <= 5'd0;r_value <= 11'd0;endelse case(cnt_bit)5'd0:begin//采集一次输入的油门值cnt_bit <= cnt_bit + 1'b1;r_value <= i_value;enddefault:begin//第1位if(cnt_cycle==CNT_1_67US&&cnt_bit==5'd16)cnt_bit <= 5'd0;else if(cnt_cycle==CNT_1_67US)cnt_bit <= cnt_bit + 1'b1;endendcaseendalways	@(posedge i_sys_clk or negedge i_sys_rst_n)beginif(~i_sys_rst_n)begincnt_cycle <= 8'd0;endelse case(cnt_bit)5'd0:begincnt_cycle <= 8'd0;enddefault:begin//第1位if(cnt_cycle==CNT_1_67US)cnt_cycle <= 8'd0;elsecnt_cycle <= cnt_cycle + 1'b1;endendcaseendalways	@(posedge i_sys_clk or negedge i_sys_rst_n)beginif(~i_sys_rst_n)cnt_high_temp <= 8'd0;		else case(cnt_bit)0:cnt_high_temp <= CNT_LOW;1,2,3,4,5,6,7,8,9,10,11:beginif(r_value[cnt_bit-1]==1'b1)cnt_high_temp <= CNT_HIGH;else if(r_value[cnt_bit-1]==1'b0)cnt_high_temp <= CNT_LOW;end12:cnt_high_temp <= CNT_HIGH;13,14,15,16:beginif(crc[cnt_bit-13]==1'b1)cnt_high_temp <= CNT_HIGH;else if(crc[cnt_bit-13]==1'b0)cnt_high_temp <= CNT_LOW;endendcaseendalways	@(*)beginif(cnt_bit==5'd0)o_out = 1'b0;else if(cnt_bit<=5'd16&&cnt_cycle<=cnt_high_temp)o_out = 1'b1;else if(cnt_bit<=5'd16&&cnt_cycle>cnt_high_temp)o_out = 1'b0;	end/*crc获取行为*/always	@(posedge i_sys_clk or negedge i_sys_rst_n)beginif(~i_sys_rst_n)beginr_i_crc_valid <= 1'b0;crc <= 4'd0;endelse begincase(cnt_bit)5'd1:r_i_crc_valid <= 1'b1;5'd2:r_i_crc_valid <= 1'b0;endcaseif(w_o_crc_valid==1'b1)//获取一帧CRCcrc <= w_crc_out;endend
endmodule

简易测试文件

`timescale	1ns/1ns		//时间精度
`define clock_period 20	//时钟周期
module tb_dshot600;	//实体名称//=====================<系统端口>=============================reg			i_sys_clk		;reg			i_sys_rst_n		;wire		o_out			;reg	[10:0]	i_value			;dshot600 dshot600_inst(.i_sys_clk			(i_sys_clk),.i_sys_rst_n		(i_sys_rst_n),.o_out				(o_out),.i_value			(i_value)
);//=====================<时钟信号>=============================
initial begini_sys_clk = 1;forever#(`clock_period/2)	i_sys_clk = ~i_sys_clk;
end//=====================<复位信号>=============================
initial begini_sys_rst_n = 0;#(`clock_period*20+1);i_sys_rst_n = 1;
end//=====================<激励信号>=============================
initial begini_value = 11'd0;#(`clock_period*20+1);//初始化i_value = 11'd386;
end	endmodule

Wave

在这里插入图片描述


http://www.ppmy.cn/news/541339.html

相关文章

GE凝胶成像 AI600

欢迎来到数字工业时代 | GE China http://www.ge.com/cn/ AI 600——帮您告别暗室和X胶片AI600,凝胶成像,GE解决方案_中国化工仪器网 http://www.chem17.com/Tech_news/Detail/780529.html 您是否还在暗室里苦苦的摸索——反复曝光、显影、定影、洗片、失败、再曝光、显影、定…

AM600用户程序编写与调试过程

一个基本的伺服控制程序&#xff0c;是由 CPU 模块、IS620N 伺服系统、RTU-ETC 及 0016ERN 扩展模块组成&#xff1a; 要求编写一个简单的程序&#xff0c;让 AM600CPU 控制器实现如下功能&#xff1a; ①让伺服马达 1 能够点动运行&#xff1b; ②每触发一次命令标志&#x…

oracle600错误,ora-600错误如何处理

ORACLE ORA-00600错误不是你的程序错误.是ORACLE内部的错误,一般来说,大部分的ORA-00600错误均是由ORACLE 软件的bug所导致,因此对于这样的错误需要及时联系ORACLE技术支持工程师.对于这种类型的ORA-00600错误, 一个简单的处理方式就是打补丁,将数据库升级到一个稳定的版本,…

FT600开发笔记

FT600Q开发笔记 为什么选择FT600Q电路图FT600Q引脚时序FPGA接收数据时序说明 FPGA发送时序时序说明 FT600中止(abort)接收FT600中止(abort)发送 Verilog代码运行结果FPGA接收FPGA发送FT600中止接收FT600中止发送接收速率发送速率 为什么选择FT600Q 为将SDR中FPGA处理后的IQ数据…

600、000、002、200、300、400等开头的股票代表什么?

600开头的股票是上证A股&#xff0c;属于大盘股&#xff0c;其中6006开头的股票是最早上市的股票&#xff0c;6016开头的股票为大盘蓝筹股;   900开头的股票是上证B股;   000开头的股票是深证A股&#xff0c;001、002开头的股票也都属于深证A股&#xff0c;其中002开头的…

浏览器请求接口弹窗报错600处理

背景 近期有开发一个广告模块&#xff0c;用来在用户loading的时候展示一些新品动图&#xff0c;接口开发完成后&#xff0c;自测冒烟都跑的没问题&#xff0c;提测后突然接到测试的反馈&#xff0c;有个接口调不通&#xff0c;浏览器用的chrome。 现场情况 调用接口查询时出…

GeoServer配置字体图标(Centos环境下)

CentOS下安装字体 在GeoServer安装的服务器上面安装字体文件&#xff1b; 进入centos的字体目录&#xff0c;新建文件夹&#xff0c;并把自己的字体上传 cd /usr/share/fonts mkdir <your_font_folder>上传字体后&#xff0c;目录结构如下&#xff0c;我的字体文件为ot…

oppoReno4se怎么样

OPPOreno4se搭载6.43英寸AMOLED直面显示器&#xff0c;分辨率是2400X1080。 oppoReno4se新品活动 优惠力度空前 机会不容错过&#xff1a;https://www.oppo.com/4se 外观设计与影像功能上&#xff0c;OPPO Reno4 SE延续了OPPO Reno4系列产品特色&#xff0c;带来了 “小光芒”…