Dshot是一种飞控和电调之间的数字通讯协议,DSHOT600 就是每秒传输600k比特,DSHOT300就是每秒传输300K比特,个人感觉Dshot600有点类似红外协议,用电平时间表示“0”“1”。
0:高电平大概占据625ns,
1:高电平大概占据1250ns,
一个bit周期大概为1.67us。
(有一些误差是可以接受的)
Dshot600一帧为18bit,
0-10bit为油门数据(高位在前),
11bit设置为“0”(好像有个什么功能,我不care),
12-15bit为CRC校验位,
16-17bit为两个周期的低电平,表示帧间间隔。
//定时器 4分频72/4=18mhz ;分频不固定,可自行调整
//pwm波周期 1.67us ;对应的pwm分辨率 1.67us /(1/18)= 30;
// 0.625us/(1/18) = 11; 0的占空比11/30
// 1.250us/(1/18) = 22; 1的占空比22/30
#define ESC_BIT_0 11
#define ESC_BIT_1 22
#define ESC_CMD_BUF_LEN 18
u8 ESC_CMD[ESC_CMD_BUF_LEN]={0};
需要输出周期为1.67us的PWM波,由协议可知,一次要发18个PWM周期,也就是要每1.67us改变一下PWM占空比,为了减轻CPU压力,占空比数据放在占空比数组ESC_CMD,用DMA将数据自动搬运到定时器CCR中。
代码实现DSHOT600(