ADC采样信号RMS测量值的Verilog实现
术语“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实现的更多相关文章
- STM32中基于DMA的ADC采样实例之MQ-2烟雾传感器
最近学习了一下STM32中的ADC采样,由于手头正好有一个MQ-2的烟雾传感器,所以正好可以测试一把.体验ADC采样的过程.下面介绍一下这个MQ-2烟雾传感器. 1.MQ-2烟雾传感器简介 MQ-2气 ...
- 使用STM8SF103 ADC采样电压(转)
源:使用STM8SF103 ADC采样电压 硬件环境: STM8SF103 TSSOP20封装 因为项目需要用到AD采样电池电压,于是便开始了使用STM8S ADC进行采样,也就有了下文. 手册上对S ...
- ADC采样对MIC的干扰
使用EFM8SB的MCU做ADC采样,检测MIC Bias的电源,解码android耳机的线控.初始时, ADC的采样频率2KHz, 在录音时后播放,能固定的听到接近2K的一个噪声.示波器探测不到明显 ...
- 【转载】使用STM8SF103 ADC采样电压
源:使用STM8SF103 ADC采样电压 硬件环境: STM8SF103 TSSOP20封装 因为项目需要用到AD采样电池电压,于是便开始了使用STM8S ADC进行采样,也就有了下文. 手册上对S ...
- STM32 多通道ADC采样,采用Timer1进行采样率控制,利用DMA进行传输
http://blog.csdn.net/varding/article/details/17559399 http://www.51hei.com/stm32/3842.html https://w ...
- DSP基础学习-ADC采样
DSP基础学习-ADC采样 彭会锋 2015-04-27 22:30:03 在查看ADC采样例程的时候我发现了下面的代码挺有意思的 EALLOW; GpioCtrlRegs.GPAMUX2.bit.G ...
- 利用基准电压效正Vcc做参考电压的ADC采样计算方法
利用基准电压效正Vcc做参考电压的ADC采样计算方法
- STM32的ADC采样时间
STM32的ADC采样时间与其ADC的时钟频率密不可分. 例:STM32F103系列的ADC的时钟是在APB2(最大72MHZ)上.我们可以对其分频: RCC_PCLK2_Div2: ADC cloc ...
- 定时器同步+触发三ADC采样+输出6路PWM波
为了熟悉定时器定时器和ADC 用STM32F407DIS做了一个简单的工程: 通过高级定时器TIM1溢出更新时间作为触发输出信号(TRGO),触发TIM8开始计数: 同时TIM1的通道1.2.3以及分 ...
- [ADC]TI am4378 ADC采样设置问题(am335x类似)
这段时间在调试AM4378的ADC问题,发现采样到的数据和真实输入波形有所出入,比如输入是1ms的周期,50%占空比的信号,但是采样的数据描点总是偏差较大,数据如下 iio device number ...
随机推荐
- 自己从零写操作系统GrapeOS系列教程——4.GrapeOS开发环境介绍
1. 开发环境简介 为了减少开发过程中不必要的麻烦,希望大家的开发环境尽量与我的保持一致. 我的开发环境如下: Windows10电脑一台 Visual Studio Code(最好是最新版) Vir ...
- vue的两种服务器端渲染方案
作者:京东零售 姜欣 关于服务器端渲染方案,之前只接触了基于react的Next.js,最近业务开发vue用的比较多,所以调研了一下vue的服务器端渲染方案. 首先:长文预警,下文包括了两种方案的实践 ...
- LeetCode算法训练 93.复原IP地址 78.子集 90.子集II
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练 93.复原IP地址 78.子集 90.子集II LeetCode 93. 复原 IP 地址 分析 字符串全部由数字组成,ipv4每一段数字不 ...
- python编辑excel表格文件的简单方法练习
一.创建一个Excel文件from openpyxl import Workbook #需要用到openpyxl模块来操作Excel文件.openpyxl需要先安装.#实例化对象wb = Workbo ...
- java-tocsv
1.依赖 <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artif ...
- 【问题】Windows(CR LF)和Unix(LF)
问题描述: 在获取一张JPG图片的信息数组后, 再将这些信息存入新建JPG文件, 却发现新建图片异常. image.jpg为原图 image1.jpg为新建图片 原因: 在Windows环境下, 使用 ...
- 深入理解 JVM -- 垃圾收集器与内存分配策略
程序计数器.虚拟机栈.本地方法栈 3个区域随线程而生,随线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作.每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行 ...
- CAN 接线参考
汽车CAN总线详解 - 汽车人大空翼 - 博客园 (cnblogs.com) 汽车CAN总线 - helloWorld017 - 博客园 (cnblogs.com) CAN总线布线规范 - 不明白就去 ...
- SAP 交货单抬头客制化界面以及字段
需求 因为涉及系统之间的家伙但传输,方便业务查看该交货单是否已经发送,因此再交货单的抬头页面进行增强,给出一个是否发送的字段显示.如下: 业务加载项 LE_SHP_TAB_CUST_HEAD se19 ...
- stm32 出入栈
Start.S 一般指定栈顶指针及栈大小 1.硬件中断 有硬件入栈和软件入栈部分 硬件入栈寄存器: R0,R1,R2,R3,R12,PSR 软件入栈寄存器: r4 - r11 2.程序切换入栈 ...