拓冰建站拓冰建站
首页 / 资讯中心 / 正文

D223全链路数据流追踪:从传感器到屏幕的完整旅程

www.z-linear.com一个ADC采样值从传感器到上位机屏幕显示需要经过AD7606采集→FPGA缓冲→QSPI四线传输→DMA搬运→双缓冲打包→CRC校验→USB发送→C#解析→ScottPlot绘制。本文追踪一个数据点的完整旅程。一、全链路全景图传感器 ──→ 信号调理 ──→ AD7606 ──→ FPGA FIFO ──→ QSPI四线 ──→ DMA ──→ 双缓冲 ① ② ③ ④ ⑤ ⑥ ⑦ 双缓冲 ──→ 帧打包 ──→ CRC16 ──→ USB CDC ──→ C#接收 ──→ 帧解析 ──→ ScottPlot ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬二、阶段①②传感器与信号调理2.1 传感器输出温度传感器 Pt100 → 4-20mA变送器 → 240Ω取样电阻 → 0.96~4.8V电压参数值说明传感器类型Pt100 变送器温度→电流输出范围4-20mA工业标准取样电阻240ΩD223电流型输入阻抗转换后电压0.96~4.8VI×R2.2 信号调理0.96~4.8V → 1MΩ限流电阻 → TVS箝位 → RC低通滤波(16kHz) → AD7606输入环节参数作用限流电阻1MΩ过压保护TVS6.4V击穿瞬态保护RC滤波1kΩ10nF16kHz抗混叠三、阶段③AD7606 ADC采样3.1 采样过程CONVST信号 → AD7606启动转换 → 8通道同步采样 → 转换完成 → BUSY拉低参数值ADC类型AD7606BBSTZ16位SAR采样率500KSPSD223最高通道数8通道同步转换时间~2μs量程±5V/±10V可配输入阻抗1MΩ电压/ 240Ω电流基准电压REF5050 5.000V ± 0.005V3.2 数据输出AD7606并行总线 → FPGA读取16位数据 → 存入FPGA内部FIFOAD7606输出16位补码5V → 0x7FFF (32767) 0V → 0x0000 (0) -5V → 0x8000 (-32768)四、阶段④FPGA FIFO缓冲4.1 FIFO写入AD7606 BUSY↓ → FPGA读取8通道数据 → 写入FIFO[writeIndex] FIFO格式: [index(4B)] [CH1_0][CH1_1][CH1_2][CH1_3] ... [CH8_0]...[CH8_3] 共66字节4字节索引 8通道×4组×2字节4.2 FIFO读取时机// TIM13中断中voidqspiAdcTimTask(){// 计算FIFO新数据量_uadc.adc_BufIndex_qspiAdcBuf.index0xff;_uadc.adc_BufIndexGap计算索引差值;_uadc.adc_BufIndexGapmin(_uadc.adc_BufIndexGap,4);// 最多4组// 读取DIN状态搭便车_dioParam.dinAll(_qspiAdcBuf.index8)0xff;// 触发QSPI DMA读取QSPI_ReadDatas_DMA(0x81,2,(u8*)_qspiAdcBuf,0,66);}FPGA在FIFO数据中嵌入了DIN状态索引高8位STM32读取ADC数据时同时获取DIN状态无需单独SPI读取。五、阶段⑤QSPI四线传输5.1 QSPI命令[CS↓] [0x81命令] [地址(2B)] [数据(66B)] [CS↑] ←─单线─→ ←─单线─→ ←─四线──→ 50MHz时钟阶段线数时钟数耗时50MHz命令1线8160ns地址1线16320ns数据4线1322.64μsCS切换—~5100ns合计—~1613.22μs5.2 传输效率有效数据率 66字节 / 3.22μs 20.5 MB/s 需求带宽 500K × 8通道 × 2B 8 MB/s 余量 20.5 / 8 2.56倍 ✓六、阶段⑥DMA搬运6.1 DMA配置QSPI外设 → DMA1 Stream5 → 内存_qspiAdcBuf 方向: 外设→存储器 宽度: 8位字节 大小: 66字节 模式: 正常非循环 优先级: 4级高于TIM13的5级6.2 DMA完成通知voidHAL_QSPI_RxCpltCallback(QSPI_HandleTypeDef*hqspi){// DMA已完成66字节传输_adcFunctionParam.qspiDmaComplete1;// 设置标志}DMA传输完全由硬件完成CPU在传输期间可以处理其他任务如DAC输出、DIO刷新。七、阶段⑦双缓冲与数据过滤7.1 双缓冲写入// TIM13中断中处理DMA完成的数据for(j0;j_uadc.adc_BufIndexGap;j){for(i0;i8;i){if(通道i使能){// 大端转换int16 adcDataSWAP16(_qspiAdcBuf.data[j][i]);// 更新256点滤波缓冲区getAdcFilter24[i]-getAdc_Buf256[i][buf256Index];getAdc_Buf256[i][buf256Index]adcData;getAdcFilter24[i]adcData;// 更新双缓冲区if(recordAB_flag0)// A缓冲_adcBuf.data[adc_collectIndex][i]adcData;else// B缓冲_adcBufB.data[adc_collectIndex][i]adcData;}}}7.2 缓冲区满切换if(adc_collectIndex200){// 缓冲区满200点×8通道if(recordAB_flag0){adc_collectFullFlag2;// A满recordAB_flag1;// 切换到B}else{adc_collectFullFlag3;// B满recordAB_flag0;// 切换到A}adc_collectIndex0;}八、阶段⑧⑨帧打包与CRC8.1 帧组装// 主线程检测到缓冲区满if(adc_collectFullFlag2){// A缓冲满 → 组装发送帧_adcBuf.msgHeadSWAP16(0x55aa);// 帧头_adcBuf.cmdId_cmdId_getAdc_waveData;// 命令ID_adcBuf.frameLenSWAP16(sizeof(_adcBuf));// 帧长度_adcBuf.adc_ch_Enable_framDatas._adcParam.adc_ch_Enable;_adcBuf.adcSignalType_framDatas._adcParam.adcSignalType;_adcBuf.adcRange_framDatas._adcParam.adcRange;_adcBuf.samplingRateSWAP16(samplingRate);// CRC计算_adcBuf.crcSWAP16(getCrc16WithTail((u8*)_adcBuf,SWAP16(_adcBuf.frameLen)));// 发送usb_sendMsg((u8*)_adcBuf,SWAP16(_adcBuf.frameLen));adc_collectFullFlag0;}8.2 CRC计算u16getCrc16WithTail(unsignedchar*puchMsg,unsignedshortusDataLen){u8 crcL0xFF,crcH0xFF;usDataLen-2;// 减去CRC本身2字节while(usDataLen--){uIndexcrcH^*puchMsg;crcHcrcL^tableH[uIndex];crcLtableL[uIndex];}return(crcH8|crcL);}8.3 发送帧结构┌──────┬───────┬──────────┬──────┬────────┬──────┬────────────┬──────┐ │0x55AA│ cmdId │ frameLen │chEn │sigType │ range │sampleRate │waveData│CRC│ │ 2B │ 1B │ 2B │ 1B │ 1B │ 1B │ 2B │3200B │2B│ └──────┴───────┴──────────┴──────┴────────┴──────┴────────────┴──────┘ 总长度: 212111232002 3212字节九、阶段⑩⑪USB发送与C#接收9.1 USB发送voidusb_sendMsg(u8*data,u16 len){CDC_Transmit_FS(data,len);// USB Bulk传输3212字节分7个512B包}9.2 USB传输时间3212字节 / 40MB/s ≈ 80μs9.3 C#接收voidUsbReceiveThread(){intlenusbStream.Read(rxBuffer,0,4096);lock(usbRxMsgBuf){for(inti0;ilen;i)usbRxMsgBuf.Add(rxBuffer[i]);}}十、阶段⑫⑬帧解析与波形显示10.1 帧解析void_deviceRxMsg(byte[]rxData){// 结构体映射msgGetAdcDatasmsg(msgGetAdcDatas)BytesToDataStruct(rxData,typeof(msgGetAdcDatas));// 提取参数bytechEnablemsg.adc_ch_Enable;bytesignalTypemsg.adcSignalType;byterangemsg.adcRange;ushortsamplingRateSWAP16(msg.samplingRate);// 提取波形数据intdataOffset12;// 帧头参数长度intdataLenSWAP16(msg.frameLen)-dataOffset-2;// 减CRCshort[][]waveDatanewshort[8][];intpointsPerChdataLen/2/CountEnabledChannels(chEnable);// 解交错for(inti0;ipointsPerCh;i){for(intch0;ch8;ch){if((chEnable(1ch))!0){intidxdataOffset(i*CountEnabledchIdx)*2;waveData[ch][i](short)((rxData[idx]8)|rxData[idx1]);}}}// 转换为电压double[][]voltagenewdouble[8][];for(intch0;ch8;ch){for(inti0;ipointsPerCh;i){voltage[ch][i]ADC2Voltage(waveData[ch][i],range,signalType);}}// 显示DrawWaveform(voltage,samplingRate);}10.2 ADC值转电压doubleADC2Voltage(shortadcValue,byterange,bytesignalType){doublevref(range0)?5.0:10.0;if(signalType0){// 电压型returnadcValue*vref/32768.0;}else{// 电流型// 240Ω取样电阻 → 电压转回电流return(adcValue*vref/32768.0)/240.0*1000.0;// mA}}// 校准后转换doubleADC2VoltageCalibrated(shortadcValue,...){// 两点线性插值doubleresult((adcValue-d1)*(a2-a1)/(d2-d1))a1;returnresult*0.00001;// ×10^7存储}10.3 ScottPlot波形绘制voidDrawWaveform(double[][]voltage,intsamplingRate){waveform.Plot.Clear();doubletimeStep1.0/samplingRate;double[]xAxisnewdouble[200];for(inti0;i200;i)xAxis[i]i*timeStep;Color[]colors{Colors.Brown,Colors.Blue,Colors.Green,Colors.Red,Colors.Purple,Colors.Orange,Colors.Gray,Colors.Magenta};for(intch0;ch8;ch){if((chEnable(1ch))!0){waveform.Plot.Add.ScatterLine(xAxis,voltage[ch],colors[ch]);}}waveform.Plot.Axes.SetLimitsY(-vref*1.1,vref*1.1);waveform.Refresh();}十一、全链路延迟分析11.1 单次采样到显示的延迟阶段耗时累计① 传感器响应~100μs100μs② 信号调理~10μs110μs③ AD7606转换2μs112μs④ FPGA FIFO写入~100ns112.1μs⑤ QSPI传输3.22μs115.3μs⑥ DMA搬运3.22μs118.5μs⑦ 双缓冲填满200点200×采样周期—⑧ 帧打包~1μs—⑨ CRC计算~2μs—⑩ USB传输~80μs—⑪ C#接收~100μs—⑫ 帧解析~10μs—⑬ ScottPlot绘制~1ms—11.2 关键延迟延迟类型值说明单点延迟~200μs从采样到到达内存帧延迟200×采样周期3ms从首点到显示500KSPS帧率200/500K 0.4ms采集3ms传输~2.5ms/帧帧率~400帧/s500KSPS下十二、数据完整性保障保障措施实现方式硬件CRCCRC16-Modbus校验整个帧帧头搜索0x55AA定位脏数据丢弃大端转换SWAP16/SWAP32确保跨平台DMA零拷贝硬件搬运无CPU干预双缓冲防丢帧A/B交替发送时不阻塞采集过采样降噪256点滑动平均提升精度DIN搭便车FIFO索引嵌入DIN状态十三、总结一个ADC数据点从传感器到屏幕的完整旅程阶段处理者耗时数据格式传感器物理量100μs4-20mA信号调理RCTVS10μs0.96~4.8VAD7606SAR ADC2μs16位补码FPGA FIFOFPGA硬件100ns66字节帧QSPI四线STM32 QSPI3.2μsDMA搬运双缓冲固件软件—200点×8通道CRC16查表法2μs2字节校验USB CDCBulk传输80μs3212字节帧C#解析Marshal映射10μs结构体ScottPlot图表库1ms屏幕像素从传感器的物理量到屏幕上的像素点经过13个阶段的转换和传输D223的数据采集链路实现了从模拟到数字、从硬件到软件、从固件到上位机的完整闭环。下篇预告《D223通信协议命令字典完整版》
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门