下面介绍一种用单片机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. .net mvc datatables中orderby动态排序

    今天在做项目中用datatables的排序来做筛选,不过人比较懒,不想写那么多的关于排序的代码,于是寻思这在度娘上找找,结果不负有心人啊,更感谢贴出此贴的哥们,来源:http://blog.csdn. ...

  2. document.all用法

    document.all用法 一. document.all是页面内所有元素的一个集合.例如:       document.all(0)表示页面内第一个元素二.document.all可以判断浏览器 ...

  3. java 跳转地址栏地址改变

    在strtus1 中,很多都是直接的action 配置后进行跳转的 这样地址栏是不会改变的 如果需要进行浏览器跳转 ActionForward actionForward = new ActionFo ...

  4. YII框架开发一个项目的通用目录结构

    YII框架开发一个项目的通用目录结构: 3 testdrive/ 4 index.php Web 应用入口脚本文件 5 assets/ 包含公开的资源文件 6 css/ 包含 CSS 文件 7 ima ...

  5. 标量类型(scalar)

    (ISO C11 §6.2.5) Arithmetic types and pointer types are collectively called scalar types. Array and ...

  6. cxf WebService整理 (基于注解)

    http://blog.csdn.net/zjw10wei321/article/details/39889823

  7. Linux sed命令在指定行前后添加内容

    一.在匹配行前后加内容在包含www.baidu.com的行前面或后面添加多一行内容www.qq.com#匹配行前加sed -i '/www.baidu.com/i www.qq.com' domain ...

  8. 实时错误 '91' :对象变量或with块变量未设置

    大家这几天在做学生信息管理系统的时候,出现最多的应该就是这个问题了,“实时错误‘91’:对象变量或with块变量未设置”.如右图: 遇到这个问题,我们首先应该去参考MSDN,不过这时候MSDN似乎没有 ...

  9. javascript获取地址栏参数/值

    //URL: http://www.example.com/?var1=val1&var2=val2=val3&test=3&test=43&aaa=#2 //wind ...

  10. The Managed Metadata Service or Connection is currently not available

    Does the following error message looks familiar to you?  when you go to site Actions -> Site Sett ...