PPM高精度收发示例

来自Microduino Wikipedia
Wasdpkj@hotmail.com讨论 | 贡献2017年7月26日 (三) 09:26的版本 (创建页面,内容为“{| style="width: 800px;" |- | <p style="color: #4F4E4E;font-size:220%">'''PPM高精度收发示例'''</p> <br> 本示例试验了高精度的PPM编码和解码的通...”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

PPM高精度收发示例


本示例试验了高精度的PPM编码和解码的通讯方法

相比普通精度的8通道编码与解码,本例子精度更高,但通道更少(4通道)

如果需要通道更多的通讯方法,见:PPM普通收发示例

下载完以后,打开接收端串口监视,查看数据



所需硬件





电路搭建

分别以mBattery、Core、Hub堆叠在一起,准备两套;将两套HUB的D2/D3引脚通过传感器线连在一起。
通过MicroUSB数据线接入电脑,分别下载接收和发送的程序。初次使用请参考:Getting Started




发送代码

#include <Microduino_PPM.h>

PPM PPM;

#define OUTPUT_PIN 2
#define CHAN_NUM  4

uint16_t value[4] = {
  128, 256, 384, 512
};

void setup () {
  Serial.begin(115200);
  PPM.beginWrite(OUTPUT_PIN, CHAN_NUM * 2); //引脚,通道数(可选,默认8)
  PPM.setFix(-5);    //发送数据修正,单位us
}

void loop () {
  writePrecisionData(value, CHAN_NUM);
  delay(20);
}

void writePrecisionData(uint16_t* _value , uint8_t _num) {
  uint16_t _data[8];
  for (uint8_t a = 0; a < _num; a ++) {
    _data[a * 2] = _value[a] >> 5;
    _data[a * 2 + 1] = _value[a] & 0x1f;
  }

  for (int i = 0; i < CHAN_NUM * 2; i++) {
    int pulseWidth = map(_data[i], 0, 31, 1000, 2000);
    PPM.Write(i, pulseWidth);
  }
}




接收代码

#include <Microduino_PPM.h>

PPM PPM;

#define INPUT_PIN 2	//必须为中断脚

uint16_t value[4];

void setup () {
  Serial.begin(115200);
  PPM.beginRead(INPUT_PIN); //必须为中断脚
}

void loop () {
  uint8_t numChannel = PPM.getChannel() / 2; //获取通道数
  Serial.print("numChannel:");
  Serial.println(numChannel);
  readPrecisionData(value, numChannel);
  for (int i = 0; i < numChannel; i++) {
    Serial.print(value[i]);
    if (i < numChannel - 1) {
      Serial.print(",");
    }
  }
  Serial.println("");
  delay(20);
}

float f_map(float x, float in_min, float in_max, float out_min, float out_max) {
  return float((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min);
}

void readPrecisionData(uint16_t* _value , uint8_t _num) {
  uint16_t _data[8];
  PPM.Read(_data);
  float _f_data[_num * 2];

  for (uint8_t a = 0; a < _num * 2; a++) {
    _f_data[a] = f_map( _data[a], 1000, 2000, 0, 31);
    _f_data[a] += 0.5f;
    _data[a] = (uint16_t) _f_data[a];
  }
  for (uint8_t a = 0; a < _num; a ++) {
    _value[a] = (_data[a * 2] << 5) + _data[a * 2 + 1];
  }
}




相关案例




返回PPM_Reference页面