尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Arduino UNO R4 ——电压电流参数计算

Arduino UNO R4 ——电压电流参数计算 1 Arduino UNO R4 定时器中断为了准确计算出电压电流的有效值需要计算单周期内的电压电流有效值因此需要精确确定工频周期内的采样点数考虑到后续可能要进行的FFT测试以32点或64点为主因此实际的采样频率为1600Hz或3200Hz。1.1 定时器代码#includeFspTimer.hFspTimer timer;// 中断回调函数voidonTimerOverflow(timer_callback_args_t*p_args){// 中断周期1600HzdigitalWrite(2,!digitalRead(2));// 翻转引脚测量周期}voidsetup(){Serial.begin(115200);pinMode(2,OUTPUT);// 将 D2 设置为输出模式digitalWrite(2,0);// 初始化引脚为低电平uint8_ttimerTypeGPT_TIMER;int8_tchannelFspTimer::get_available_timer(timerType);if(channel0){Serial.println(无法获取定时器);while(1);}// 设置频率为 1600 Hz即周期为 625 µsbooloktimer.begin(TIMER_MODE_PERIODIC,timerType,channel,1600.0f,0.0f,onTimerOverflow);if(!ok){Serial.println(定时器初始化失败);while(1);}// 务必调用以下三个函数来启动定时器timer.setup_overflow_irq();timer.open();timer.start();Serial.println(1600Hz 定时器已启动);}voidloop(){// 主循环可以执行其他任务}1.2 定时器测试串口显示启动成功示波器显示测量中断时间GPIO翻转在799Hz接近实际800Hz。1.3 ADC配置1.3.1 代码修改全局变量增加intvoltage_value0;intcurrent_value0;设置增加Serial1.begin(115200);// D1接串口模块RX// 设置14位分辨率analogReadResolution(14);主循环增加Serial1.print(voltage_value);Serial1.print(,);Serial1.println(current_value);1.3.2 ADC参数校准ADC采集的电压是2.5V左右转换为电压电流数据后需要将减去2.5V的采集值输出交流电压电流数值采用多次采集求平均值的方式去除偏置在设置中多次采集数据并求平均值全局变量增加// 增加偏置代码intSAMPLES_offset200;// 计算ADC偏置采集样本数intvoltage_offset0;intcurrent_offset0;设置增加// 放置在定时器启动前measureOffset(voltage_offset,current_offset);函数编写// 计算ADC偏置电压voidmeasureOffset(intvoltage_offset,intcurrent_offset){Serial.println( Measuring Offset );delay(2000);intoffset10;intoffset20;for(inti0;iSAMPLES_offset;i){offset1analogRead(A0);offset2analogRead(A1);delay(10);}voltage_offsetoffset1/SAMPLES_offset;current_offsetoffset2/SAMPLES_offset;Serial.print(voltage_offset is :);Serial.println(voltage_offset);Serial.print(current_offset is :);Serial.println(current_offset);}中断修改digitalWrite(2,1);// 引脚高电平开始测量代码周期voltage_valueanalogRead(A0)-voltage_offset;current_valueanalogRead(A1)-current_offset;digitalWrite(2,0);// 引脚第电平结束测量代码周期Arduino IDE显示结果VOFA显示结果此时数据正负对称2 电器参数计算增加参数计算代码// 修订代码floatvoltage_value0;// 开始为int 浮点计算时改为floatfloatcurrent_value0;// 开始为int 浮点计算时改为float// 参数计算代码#defineSAMPLES32volatilefloatvoltageBuffer[SAMPLES];// 电压采样缓冲区volatilefloatcurrentBuffer[SAMPLES];// 电流采样缓冲区volatileintsampleIndex0;// 采样缓冲区索引floatVrms0;// 电压有效值voltage rmsfloatIrms0;// 电流有效值current rmsfloatS0;// 视在功率apparent powerfloatP0;// 有功功率active powerfloatPF0;// 功率因数power factor2.1 电压电流系数计算为了计算电压电流参数需要将采样值转换为实际电压电流根据计算难度实现有两种方式2.1.1 粗略估计如果手头没有任何工具将电压采样峰值除以220理论值或230左右插排显示器显示供参考电流测量如果没有电流探头或其他测量设备以大功率电器的最大功率计算出电流Imax然后将电流采样峰值除以Imax以上仅为大致估计值用于验证功能2.1.2 精确测量通过差分电压探头、电流探头测量实际幅值后计算得到中断代码修订digitalWrite(2,1);// 引脚高电平开始测量代码周期voltage_value(analogRead(A0)-voltage_offset)/6.28;// 转换为实际电压值current_value(analogRead(A1)-current_offset)/236.4;// 转换为实际电流值// 工频周期样本缓冲区缓冲一个周期数据计算电气参数 V_rms I_rms S P PF// 存储到缓冲区if(sampleIndexSAMPLES){voltageBuffer[sampleIndex]voltage_value;currentBuffer[sampleIndex]current_value;sampleIndex;}// 索引置位if(sampleIndexSAMPLES){sampleIndex0;}// 计算有效值 有功功率函数Vrmsrms(voltageBuffer,SAMPLES);Irmsrms(currentBuffer,SAMPLES);SVrms*Irms;PP_rms(voltageBuffer,currentBuffer,SAMPLES);PFP/S;digitalWrite(2,0);// 引脚第电平结束测量代码周期定义计算函数// 计算参数floatrms(volatilefloatdata[],intn){floatsum0;for(inti0;in;i){sumdata[i]*data[i];}returnsqrt(sum/n);}floatP_rms(volatilefloatdata_V[],volatilefloatdata_I[],intn){floatsum0;for(inti0;in;i){sumdata_V[i]*data_I[i];}return(sum/n);}2.2 电压有效值Vrmsrms(voltageBuffer,SAMPLES);2.3 电流有效值Irmsrms(currentBuffer,SAMPLES);2.4 有功功率计算PP_rms(voltageBuffer,currentBuffer,SAMPLES);2.5 视在功率计算SVrms*Irms;2.6 功率因数计算PFP/S;3 VOFA显示3.1 VOFA串口输出代码voidloop(){digitalWrite(3,1);// 测试循环代码时间 约1msSerial1.print(voltage_value);Serial1.print(,);Serial1.print(current_value);Serial1.print(,);Serial1.print(Vrms);Serial1.print(,);Serial1.print(Irms);Serial1.print(,);Serial1.print(S);Serial1.print(,);Serial1.print(P);Serial1.print(,);Serial1.println(PF);digitalWrite(3,0);}3.2 VOFA动态显示结果VOFA大概显示每个工频周期20个点左右。随负载增加得到的各个参数变化结果如下图所示随负载增加可以看到电流逐渐增加这里电流数据为了显示效果将瞬时值放大了20倍实际计算值可以看Irms参数4 电流电流相位校正到这里基本已经完成接入的设备仅室内加热器应该是纯电阻为什么功率因素仅在85%附近呢因为电压模块的采集电压与实际的电压存在相位差因此需要对相位进行校正才能计算出正确有功功率P、功率因数PF。更新记录日期版本作者修改描述2026-08-271.0镜花水月初始版本2026-XX-XX1.1镜花水月增加相位校准内容待续2026-XX-XX1.2镜花水月修订 待续
返回列表