术语“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. WPF HandyOrg DataGrid 表格内容和标题居中显示

    表格内容居中 对于文本显示列DataGridTextColumn需要设定文本内容水平居中或者水平居右,而不是HandyControl中设定的样式默认显示为居左时,需要继承DataGridCellSty ...

  2. fabric学习笔记5

    fabric学习笔记5 20201303张奕博 2023.1.15 fabric中的docker命令 1.查看本机的镜像列表 docker images 2.拉取镜像 docker pull hype ...

  3. vue中当数据改变时更新DOM

    具体场景: 当vue中使用swiper, better-scroll时候,我们需要去new Swiper,new [better-scroll]来获取实例,通常我们页面的数据都是异步获取的, 会导致我 ...

  4. Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available

    题外话:标题直接用了微软开发博客的标题.近期需要调研一个项目的可行性,github上有个相似度很高的方案,但项目是写在jupyter里的C#代码.为了能跑起来看看效果,不得已搭了套相关的环境.本来以为 ...

  5. mysql 5.7 gtid 主从复制

    GTID中slave端的binlog是必须开启的,目的是记录执行过的GTID 主库#开启gtidlog-bin=mysql-binexpire_logs_days = 5binlog_format=r ...

  6. jenkins目录

    Jenkins目录详解: jobs目录:创建的所有jenkins工程.并含有所有构建历史记录和日志.其中config.xml为具体配置. plugins:所有插件 workspace:构建工程本机源码 ...

  7. go iris框架文件上传下载

    在 Iris 框架中,可以使用内置的 iris 包中的 Context 对象来处理文件上传和下载.以下是一个简单的示例代码: package main import ( "github.co ...

  8. grafana+prometheus+tomcat 监控tomcat

    一.前提 1.tomcat作为java项目首选的部署容器.但是,在做测试,或者是在运维管理生产服务器的时候,想要监控tomcat的实时运行情况,却不是那么容易的 2.grafana(已安装和prome ...

  9. (python笔记)python使用JS定位css元素

    from selenium import webdriver from selenium.webdriver.common.keys import Keys import time import da ...

  10. 靶机练习4: SolidState

    信息收集阶段 全端口扫描,查询目标靶机开放端口和服务 sudo nmap -p- -n -v -sS --max-retries=0 172.16.33.35 进行服务版本扫描 nmap -p22,2 ...