下面介绍一种用单片机AD采样的方式检测市电电压的方法
 要检测交流市电的电压,通常有两种方法
一、通过频繁的采样后再求平均值来获得实际电压值
二、通过采样交流市电的峰值,再通过算法得出实际电压值

这里我们讲述峰值采样法的步骤:
1、在正半波时,频繁采样市电AD值,在每次采样后进行
从小到大排序并保存几个最大值的结果,分别放在R_SaveVolAC[0]..R_SaveVolAC[3]
2、在负半波时,把刚才所采样到的几个值中,提取R_SaveVolAC[1]的值作为
上个正半波的的最大值。(R_SaveVolAC[2]、R_SaveVolAC[3]当作干扰给滤掉)
3、把N个上述这些正半波的最大值进行累加后除以N得到一个平均值,这个值就是峰值电压值

电路图如下:

以下为参考源代码实例:

uint8   R_VolAc = 0 ;	//输入电压值
uint8 R_SaveVolAC[4] = {0,0,0,0} ;//保存读AD时的峰值
//**************************************
// 函数名称:ReadZ0
// 函数功能:检测过零信号
// 入口参数:无
// 出口参数:无
//*************************************** void ReadZ0(void)
{
uint8 Tcon=0 ;
uint8 F_OK=0 ; do{
ReadVol_AC() ; //上半波时读AC电压值 Nop(5);
if((P_ZER0 == 0)&&(F_PZL))
{ Tcon++; }
else if((P_ZER0 == 1)&&(!F_PZL))
{ Tcon++; }
else
{ Tcon = 0 ; } if(Tcon >= 5)F_OK = 1 ; }while(F_OK == 0); if(F_PZL) F_PZL = 0 ;
else F_PZL = 1 ; }
//*************************************
// 函数名称:Order_Byte_F2
// 函数功能:选择法对数组从小到大排序
// 直接对传递的地址进行操作
// 入口参数:排序数据的首地址
// 出口参数:无
// 返 回 值:该列数据是的中间值
//***************************************
uint8 Order_Byte_F2(uint8 *a,uint8 DataLong)
{ uint8 i,j,k;
uint8 tmp; for(i=0;i<DataLong-1;i++)
{
k=i; /*给记号赋值*/ for(j=i+1;j<DataLong;j++)
{
if(a[k]>a[j]) k=j; /*是k总是指向最小元素*/
}
if(i!=k)
{ /*当k!=i是才交换,否则a[i]即为最小*/ tmp = a[i];
a[i] = a[k];
a[k] = tmp;
}
} i = DataLong >> 1 ;
return a[i] ; }
//*************************************
// 函数名称:TestVolage
// 函数功能:检测电源电压
// 入口参数:无
// 出口参数:无
//***************************************/
void ReadVol_AC(void)
{
if(F_PZL) //正半波检测电压
{
Adc_Mode_Scan(DIS) ;//ADC
AdcSwitch(ADC_Chanel2) ; R_SaveVolAC[0] = ADC_DRH ;
Order_Byte_F2(R_SaveVolAC,4) ;//从小到大排序 }
}
//=======================================
void CalculateVol_AC(void)
{
uint8 Tmp ;
static uint16 R_SaveSum = 0 ;
static uint8 Tcon = 0 ; if(!F_PZL) //在负半波时计算AC值
{
//AC的在上半波的最大值-已经是最大值的中值
Tmp = R_SaveVolAC[1] ;
R_SaveSum += Tmp ; ClrDataBuf_Byte(R_SaveVolAC,4) ; //清除AC缓冲区 Tcon ++ ;
if(Tcon >= 32)
{
Tcon = 0 ; R_VolAc = R_SaveSum >> 5 ; //AC电压对应的AD值 R_SaveSum = 0 ; //再通过查表或算法得到实际AC电压值
}
}
} //********************************************
//********** 主函数 ***********
//********************************************
void main(void)
{
Init_Device() ; while(1)
{
ReadZ0() ; //读过零信号 CalculateVol_AC() ; //计算AC电压
}
}

一种用单片机AD采样方式来检测交流市电电压的方法的更多相关文章

  1. 4种检测是否支持HTML5的方法,你知道几个?

    4种检测是否支持HTML5的方法,你知道几个? 1,检查特定的属性是否存在于全局的对象里面,比如说window或navigator. 比如geolocation,它是HTML5新加支持的新特性:它是由 ...

  2. 几种常用单片机I/O口线的驱动能力

    摘要: 详细分析了几种常见单片机的I/O口结构,并据此分析其驱动能力大小 在控制系统中,经常用单片机的I/O口驱动其他电路.几种常用单片机I/O口驱动能力在相关的资料中的说法是:GMS97C2051. ...

  3. kaggle信用卡欺诈看异常检测算法——无监督的方法包括: 基于统计的技术,如BACON *离群检测 多变量异常值检测 基于聚类的技术;监督方法: 神经网络 SVM 逻辑回归

    使用google翻译自:https://software.seek.intel.com/dealing-with-outliers 数据分析中的一项具有挑战性但非常重要的任务是处理异常值.我们通常将异 ...

  4. return的一种用法:如果当前判断为true则跳出这个方法。

    package rom; import java.lang.*; /* * return的一种用法:如果当前判断为true则跳出这个方法. */ public class Xamle_5 { stat ...

  5. #51单片机#蓝牙模块(ATK-SPP-HC06从机串口)的使用方法

    #include <AT89X51.H> #include <intrins.h> // 函数原形定义 #define uchar unsigned char #define ...

  6. 【C语言】单片机上的按键检测框架

    又好久没来写blog,最近在做项目发现之前写的stm32操作都忘了,还好做了个记录,回来看了下很多忘了的就又知道怎么做了. 下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收.滤波. ...

  7. 一种提高单片机i/o口驱动能力的方法

    一.简述问题 当你用单片驱动发光二极管的时,你还感觉不到P0.P1口的差别.(10-20mA之间,当中P0驱动能力最强,但对于驱动直流电机依旧非常弱.其结果就是电机不转).那么有什么办法提高驱动能力吗 ...

  8. 检测浏览器是否支持cookie方法

    cookie 摘自: http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html Cookie是什么? Cookie 是一小段文本信息 ...

  9. 单片机项目中使用新IC芯片的调试方法

    前两天,一位小伙伴咨询我一款新IC芯片怎么使用,借此机会我顺便把我日常工作中经常用到的一种调试方法介绍给小伙伴们,希望对对大家有所帮助.准备仓促,文中难免有技术性错误,欢迎大家给予指正,并给出好的建议 ...

随机推荐

  1. Spring.Net+NHibernate+asp.net mvc + easyui

    毕业4个月的入手项目..前段时间在公司一直做的维护..为了弄明白自己也就跟着写了一个,目前也正在学习:不对的或者是有更好的还请各位赐教. 在学习的过程中主要参考::http://www.cnblogs ...

  2. php5.2通过saprfc扩展远程连接sap730成功案例

    公司刚上sap系统,由于资金有限,sap与其它系统的数据交换需要公司内部实现.于是,领导决定入库申请流程需要在sap与OA系统里实现电子签核流,重担果然落到我的身上.好在我只负责OA,还一位同事负责s ...

  3. Python 函数的使用 外加引入文件

    #coding=utf-8 #!user/bin/python import sys import test2 def functionsss(name,sex,age=25): print name ...

  4. Android-SVN

    服务器启动svn服务 svnserve -d -r /home/wbp/svn/actia/ 1 .svn  重新定位location , 改变新仓库的uuid , 今天操作SVN Client 发现 ...

  5. js 验证表单 js提交验证类

    附加:js验证radio是否选择 <script language="javascript">function checkform(obj){for(i=0;i< ...

  6. Hibernate 多对多关联Demo

    以学生[Student ]与课程[Course ]之间的关系为例: //Course .java public class Course implements Serializable { priva ...

  7. QComboBox实现复选功能

    需求: 下拉列表有复选功能 不可编辑 显示所有选中项   关于QComboBox的复选功能有几种方案: QStandardItemModel + QStandardItem QListWidget + ...

  8. 原创 HTML5:JS操作SVG实践体会

    在工业信息化系统里,常常需要动态呈现系统的数据在一张示意图里,用于展现系统状态,分析结果等.这样用JavaScript操作svg 元素就有现实意义.本人近期做了一些实践,现分享一下. 需求: 你下面这 ...

  9. DOM&BOM笔记

    day01正课:1. DOM概述2. ***DOM树3. *查找 1. DOM概述: DHTML:动态网页技术的统称 DHTML=HTML+CSS+JS 鄙视题: HTML XHTML DHTML X ...

  10. Caffe Python特征抽取

    Caffe Python特征抽取 转载 http://www.cnblogs.com/louyihang-loves-baiyan/ Caffe大家一般用到的深度学习平台都是这个,关于Caffe的训练 ...