直流电压电流采样仪整套产品生产方案,系本人2014年设计的产品,已量产1000余套,最大可测1000V100A,电路板、BO M单、外围所有器件清单、外壳、STM单片机程序等所有,配上位机电脑软件,可记录采样存储8组电压电流数据,带触发模式

十年前折腾的这个直流电压电流采样仪,现在想起来手还隐隐作痛——被1000V电过的人都知道那种酸爽。这玩意儿核心就两大难题:怎么让单片机扛住高压,还有采样数据怎么不飘。当年在深圳华强北跑断腿找元器件,最终方案定的是电阻分压+霍尔传感器的组合拳。

先看硬件怎么扛揍。1000V直接进ADC?怕不是要放烟花。我的方案是用1MΩ+10kΩ分压,搭配TVS管和自恢复保险丝。代码里处理时得补偿电阻误差:

// 电压计算补偿
float get_real_voltage(uint16_t adc_val){
    float k = 1.02f; // 实测修正系数
    return (adc_val * 3.3f / 4096) * 110 * k; 
}

电流采样更刺激,ACS712霍尔传感器在100A时发热严重,后来换成闭环霍尔才稳住。PCB布局要特别注意,大电流路径直接开窗镀锡,有次偷懒没做,板子运行时飘出烤肉味...

直流电压电流采样仪整套产品生产方案,系本人2014年设计的产品,已量产1000余套,最大可测1000V100A,电路板、BO M单、外围所有器件清单、外壳、STM单片机程序等所有,配上位机电脑软件,可记录采样存储8组电压电流数据,带触发模式

触发模式是软件设计的亮点,要求任意时刻捕捉异常波动。在STM32F103里搞了个环形缓冲区,配合DMA双缓冲模式:

#define BUFF_SIZE 512
volatile uint16_t adc_buff[BUFF_SIZE*2]; //双缓冲

void DMA1_Channel1_IRQHandler(void){
    if(DMA_GetITStatus(DMA1_IT_TC1)){
        // 触发判断逻辑
        if(adc_buff[BUFF_SIZE-10] > threshold){
            save_to_flash(); //存8组数据
        }
        DMA_ClearITPendingBit(DMA1_IT_TC1);
    }
}

上位机用C#撸的,串口通信协议被坑惨了——刚开始没加校验,现场各种数据错乱。后来改成带CRC的帧结构:

byte[] BuildFrame(byte cmd, float[] data){
    List<byte> bytes = new List<byte>();
    bytes.Add(0xAA); //帧头
    bytes.Add(cmd);
    foreach(float val in data){
        byte[] b = BitConverter.GetBytes(val);
        bytes.AddRange(b);
    }
    bytes.Add(CRC8(bytes.ToArray())); //自家改良的CRC
    return bytes.ToArray();
}

外壳开模才是血泪史,第一版没留散热孔,夏天现场死机频繁。后来在顶部加了鲨鱼腮散热槽,底部装微型风扇,才算过关。生产时最坑的是接插件——某批次端子台接触不良,导致整套召回,从此BOM里接插件只用进口货。

这套系统最骚的操作是掉电存储,利用STM32的Flash模拟EEPROM。但要注意写操作时机:

void save_to_flash(){
    FLASH_Unlock();
    FLASH_ErasePage(0x0801F000);
    for(int i=0;i<8;i++){
        FLASH_ProgramHalfWord(addr, data[i]);
        addr +=2;
    }
    FLASH_Lock(); 
}

现场调试时发现,大电流突变会干扰ADC基准电压,后来在基准脚加了个钽电容才消停。这套东西教会我:高压产品设计,理论只是门票,真正的学问都在烧板的青烟里。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐