PPM高精度收发示例
Wasdpkj@hotmail.com(讨论 | 贡献)2017年7月26日 (三) 09:26的版本 (创建页面,内容为“{| style="width: 800px;" |- | <p style="color: #4F4E4E;font-size:220%">'''PPM高精度收发示例'''</p> <br> 本示例试验了高精度的PPM编码和解码的通...”)
PPM高精度收发示例
相比普通精度的8通道编码与解码,本例子精度更高,但通道更少(4通道) 如果需要通道更多的通讯方法,见:PPM普通收发示例 下载完以后,打开接收端串口监视,查看数据
所需硬件
电路搭建 分别以mBattery、Core、Hub堆叠在一起,准备两套;将两套HUB的D2/D3引脚通过传感器线连在一起。
发送代码 #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];
}
}
相关案例 |