术语“RMS”代表“Root-Mean-Squared”。大多数书籍将此定义为“产生与等效直流电源相同的加热效果的交流电量”,或者沿着这些线路类似的东西,但RMS值不仅仅是这个。 RMS值是瞬时值的平方函数的平均值(平均值)的平方根。
  笔者的印象中第一次接触到交流电是初中,具体是初二还是初三就不太清楚了。交流电动势的表达式为e=E(m)sinωt,其中E(m)为交流电动势的最大值,那么交流电动势的有效值为 E=E(m)/√2
  同理得交流电压的有效值和交流电流的有效值分别为:
    U = U(m)/√2
    I   = I(m)/√2
  以上的方法是以前中学课本里头理想情况下计算正弦余弦的有效值方法。而在实际的ADC采样中,采集到的信号可能并不是标准的正弦余弦信号,甚至可能是些杂乱的噪声信号。根据有效值的基本定义:周期量在一个周期内的均方根值。可以用以下的公式表示:

        

  根据该公式可以把ADC采集到的信号直接用代码计算出来

  1 //**************************************************************************
2 // *** file name : RMS_measure.v
3 // *** version : 1.0
4 // *** Description : ADC RMS measure
5 // *** Blogs : https://www.cnblogs.com/WenGalois123/
6 // *** Author : Galois_V
7 // *** Date : 2022.10.26
8 // *** Changes : Initial
9 //**************************************************************************
10 `timescale 1ns/1ps
11 module RMS_measure
12 #(
13 parameter DWIDTH = 18
14 )
15 (
16 input i_sys_clk ,
17 input i_sys_rstn ,
18 input [DWIDTH-1:0] i_adc_data ,
19 input i_adc_valid ,
20 input i_measure_enable ,
21 output reg [31:0] o_adc_data_cnt ,
22 output reg [63:0] o_adc_square_sum ,
23 output reg [47:0] o_adc_sum ,
24 output reg o_adc_sum_valid
25 );
26 wire [DWIDTH+1:0] w_adc_data ;
27 wire [2*(DWIDTH+1)+1:0] w_mult_data ;
28 wire w_adc_add_en ;
29 wire w_adc_notend ;
30 wire w_square_overflow ;
31
32 reg signed [DWIDTH+1:0] r_adc_data ;
33 reg signed [2*(DWIDTH+1)+1:0] r_mult_data ;
34 reg [5:0] r_adc_end_detection ;
35
36 assign w_adc_data = (i_adc_valid & i_measure_enable) ? {{2{i_adc_data[DWIDTH-1]}},i_adc_data} : 'd0;
37 assign w_square_overflow = &o_adc_square_sum[63:54];
38 assign w_adc_notend = i_measure_enable && w_square_overflow;
39 assign w_adc_add_en = i_adc_valid && w_adc_notend;
40 /******************************************************************************\
41 Calculate sum of squares
42 \******************************************************************************/
43 always@(posedge i_sys_clk)
44 begin
45 if(~i_sys_rstn)
46 begin
47 r_adc_data <= 'd0;
48 r_mult_data <= 'd0;
49 end
50 else
51 begin
52 r_adc_data <= w_adc_data;
53 r_mult_data <= r_adc_data * r_adc_data;
54 end
55 end
56
57 assign w_mult_data = r_mult_data;
58
59 always@(posedge i_sys_clk)
60 begin
61 if(~i_sys_rstn)
62 begin
63 o_adc_square_sum <= 'd0;
64 end
65 else
66 begin
67 o_adc_square_sum <= o_adc_square_sum + w_mult_data;
68 end
69 end
70 /******************************************************************************\
71 Count ADC points
72 \******************************************************************************/
73 always@(posedge i_sys_clk)
74 begin
75 if(~i_sys_rstn)
76 begin
77 o_adc_data_cnt <= 'd0;
78 end
79 else if(w_adc_add_en)
80 begin
81 o_adc_data_cnt <= o_adc_data_cnt + 1'b1;
82 end
83 end
84 /******************************************************************************\
85 Statistical ADC accumulation sum
86 \******************************************************************************/
87 always@(posedge i_sys_clk)
88 begin
89 if(~i_sys_rstn)
90 begin
91 o_adc_sum <= 'd0;
92 end
93 else if(w_adc_add_en)
94 begin
95 o_adc_sum <= o_adc_sum + {{(47-DWIDTH-1){w_adc_data[DWIDTH+1]}},w_adc_data};
96 end
97 end
98 /******************************************************************************\
99 Output the effective signal of the result to ensure the stability of the result
100 \******************************************************************************/
101 always@(posedge i_sys_clk)
102 begin
103 if(~i_sys_rstn)
104 begin
105 r_adc_end_detection <= 'd0;
106 end
107 else
108 begin
109 r_adc_end_detection <= {r_adc_end_detection[4:0],w_adc_notend};
110 end
111 end
112
113 always@(posedge i_sys_clk)
114 begin
115 if(~i_sys_rstn)
116 begin
117 o_adc_sum_valid <= 'd0;
118 end
119 else if(~r_adc_end_detection[4] && r_adc_end_detection[5])
120 begin
121 o_adc_sum_valid <= 1'b1;
122 end
123 else
124 begin
125 o_adc_sum_valid <= 'd0;
126 end
127 end
128
129 endmodule

  以上代码分别算出有效时间内(i_measure_enable为时间阈值设置信号)ADC信号的点数,平方和以及ADC的累加值。计算出的这些值可以通过axi4_lite总线的传给soc,对数据根据公式进行浮点型计算得出信号的平均值,有效值。

ADC采样信号RMS测量值的Verilog实现的更多相关文章

  1. STM32中基于DMA的ADC采样实例之MQ-2烟雾传感器

    最近学习了一下STM32中的ADC采样,由于手头正好有一个MQ-2的烟雾传感器,所以正好可以测试一把.体验ADC采样的过程.下面介绍一下这个MQ-2烟雾传感器. 1.MQ-2烟雾传感器简介 MQ-2气 ...

  2. 使用STM8SF103 ADC采样电压(转)

    源:使用STM8SF103 ADC采样电压 硬件环境: STM8SF103 TSSOP20封装 因为项目需要用到AD采样电池电压,于是便开始了使用STM8S ADC进行采样,也就有了下文. 手册上对S ...

  3. ADC采样对MIC的干扰

    使用EFM8SB的MCU做ADC采样,检测MIC Bias的电源,解码android耳机的线控.初始时, ADC的采样频率2KHz, 在录音时后播放,能固定的听到接近2K的一个噪声.示波器探测不到明显 ...

  4. 【转载】使用STM8SF103 ADC采样电压

    源:使用STM8SF103 ADC采样电压 硬件环境: STM8SF103 TSSOP20封装 因为项目需要用到AD采样电池电压,于是便开始了使用STM8S ADC进行采样,也就有了下文. 手册上对S ...

  5. STM32 多通道ADC采样,采用Timer1进行采样率控制,利用DMA进行传输

    http://blog.csdn.net/varding/article/details/17559399 http://www.51hei.com/stm32/3842.html https://w ...

  6. DSP基础学习-ADC采样

    DSP基础学习-ADC采样 彭会锋 2015-04-27 22:30:03 在查看ADC采样例程的时候我发现了下面的代码挺有意思的 EALLOW; GpioCtrlRegs.GPAMUX2.bit.G ...

  7. 利用基准电压效正Vcc做参考电压的ADC采样计算方法

    利用基准电压效正Vcc做参考电压的ADC采样计算方法

  8. STM32的ADC采样时间

    STM32的ADC采样时间与其ADC的时钟频率密不可分. 例:STM32F103系列的ADC的时钟是在APB2(最大72MHZ)上.我们可以对其分频: RCC_PCLK2_Div2: ADC cloc ...

  9. 定时器同步+触发三ADC采样+输出6路PWM波

    为了熟悉定时器定时器和ADC 用STM32F407DIS做了一个简单的工程: 通过高级定时器TIM1溢出更新时间作为触发输出信号(TRGO),触发TIM8开始计数: 同时TIM1的通道1.2.3以及分 ...

  10. [ADC]TI am4378 ADC采样设置问题(am335x类似)

    这段时间在调试AM4378的ADC问题,发现采样到的数据和真实输入波形有所出入,比如输入是1ms的周期,50%占空比的信号,但是采样的数据描点总是偏差较大,数据如下 iio device number ...

随机推荐

  1. Hbase一:Hbase介绍及特点

    转载请注明出处: 1.Google的三篇论文 2003年,Google发布Google File System论文,(GFS)这是一个可扩展的分布 式文件系统,用于大型的.分布式的.对大量数据进行访问 ...

  2. swiper列数 slidesPerView属性决定

    swiper轮播一行有几列如下决定 slidesPerView为3是三列,不写一列 // 初始化文章swiper var newsSwiper = new Swiper('#news-swiper', ...

  3. spring boot 3.x 配置spring security

    参考文章:https://spring.io/guides/gs/securing-web/ 导入maven <dependency> <groupId>org.springf ...

  4. Occlusion(遮挡剔除)

    Occlusion 1.视锥体剔除(Frustum Culling) 根据摄像机的视见体的范围对场景模型进行剔除操作,在视见体以外的物体不被渲染,但是在视见体中的物体会以离摄像机最远的物体开始渲染,逐 ...

  5. CF1404D 题解

    题意 传送门 给定 \(2n\) 个数 \(1,2,\dots,2n\),A 和 B 进行交互,如下规则: A 需要将元素分成 \(n\) 组 \(\texttt{pair}\): B 从每组 \(\ ...

  6. 将视图直接转换成表的SQL语句

    将视图直接转换成表的SQL语句 sqlserver: select * into tablename from viewname

  7. PHP面向对象(二)

    构造函数 PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作. 代码如下: <?php//类的 ...

  8. Vuex 部分

    Vuex 部分 官网链接 https://vuex.vuejs.org/zh/ 先说一下vuex到底是什么? vuex 是一个专门为vue.js应用程序开发的状态管理模式. 这个状态我们可以理解为在d ...

  9. 如果还有问ARKIME不会部署安装,你就把这篇丢给他!

    前言 关于在线安装和离线安装的配合方式,在本文中不再赘述.基本就是准备在线.离线两个一模一样的环境,在在线环境中边安装边借助yumdownloader.wget等解析依赖和下载安装包,然后再离线环境中 ...

  10. k8s暂停一个pod

    模拟k8s暂停一个服务:kubectl scale --replicas=0 deployment/[deployment]  -n [namespace](如要恢复设置参数--replicas=1即 ...