术语“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. 2023.2.26【模板】扩展Lucas定理

    2023.2.26[模板]扩展Lucas定理 题目概述 求\(\binom {n}{m} mod\) \(p\) 的值,不保证\(p\)为质数 算法流程 (扩展和普通算法毫无关系) 由于\(p\)不是 ...

  2. NOIP2017 - D2T3 - phalanx

    按照思维难度加大和代码难度减小的顺序,我们来看这道题的不同做法. 若你无畏,我亦无畏 - 平衡树 平衡树简直是天然用来维护这种操作的--合并两个区间,提取一个值.我们可以对每个行的前 \(m-1\) ...

  3. js手动触发页面元素点击事件,自定义点击事件模拟点击

    // initEvent事件已经弃用1. 创建MouseEvents事件const clickEvent = document.createEvent('MouseEvents')2. 初始化点击事件 ...

  4. 容忍和污点Taint和Toleration

    说明: Taint在一类服务器上打上污点,让不能容忍这个污点的Pod不能部署在打了污点的服务器上. Toleration是让Pod容忍节点上配置的污点,可以让一些需要特殊配置的Pod能够调用到具有 污 ...

  5. url 获取 值

    https://blog.csdn.net/weixin_50878675/article/details/126348725

  6. python服务返回text与json

    json.dumps(),loads()和jsonify()的区别 使用方法不同: dumps和loads方法,来自json模块,而json模块是python中的,可以直接导入: import jso ...

  7. 记一次SpringBoot整合WebSocket 找不到ServerEndpointExporter类的问题

    package com.mengxiangnongfu.cms.framework.configure; import org.springframework.context.annotation.B ...

  8. GitHub访问缓慢

    参考:https://www.cnblogs.com/liuchao888/p/11733996.html

  9. Linux docker 安装nginx 配置ssl证书

    Linux docker 安装nginx 配置ssl证书 如果觉得样式不好:跳转即可 md文件复制过来有些样式会不一样) 原文地址:https://lifengying.site/archives/b ...

  10. k8s升级导致hostPath type check failed

    一.问题背景 当前Cluster K8s Version: v1.17.4 需要升级到K8s Version:v1.19.3 在升级过程中,有个Pod卡在ContainerCreating状态 api ...