一种用单片机AD采样方式来检测交流市电电压的方法
下面介绍一种用单片机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采样方式来检测交流市电电压的方法的更多相关文章
- 4种检测是否支持HTML5的方法,你知道几个?
4种检测是否支持HTML5的方法,你知道几个? 1,检查特定的属性是否存在于全局的对象里面,比如说window或navigator. 比如geolocation,它是HTML5新加支持的新特性:它是由 ...
- 几种常用单片机I/O口线的驱动能力
摘要: 详细分析了几种常见单片机的I/O口结构,并据此分析其驱动能力大小 在控制系统中,经常用单片机的I/O口驱动其他电路.几种常用单片机I/O口驱动能力在相关的资料中的说法是:GMS97C2051. ...
- kaggle信用卡欺诈看异常检测算法——无监督的方法包括: 基于统计的技术,如BACON *离群检测 多变量异常值检测 基于聚类的技术;监督方法: 神经网络 SVM 逻辑回归
使用google翻译自:https://software.seek.intel.com/dealing-with-outliers 数据分析中的一项具有挑战性但非常重要的任务是处理异常值.我们通常将异 ...
- return的一种用法:如果当前判断为true则跳出这个方法。
package rom; import java.lang.*; /* * return的一种用法:如果当前判断为true则跳出这个方法. */ public class Xamle_5 { stat ...
- #51单片机#蓝牙模块(ATK-SPP-HC06从机串口)的使用方法
#include <AT89X51.H> #include <intrins.h> // 函数原形定义 #define uchar unsigned char #define ...
- 【C语言】单片机上的按键检测框架
又好久没来写blog,最近在做项目发现之前写的stm32操作都忘了,还好做了个记录,回来看了下很多忘了的就又知道怎么做了. 下面是我之前写的一个按键检测的框架,适合比较多的按键操作,从信号接收.滤波. ...
- 一种提高单片机i/o口驱动能力的方法
一.简述问题 当你用单片驱动发光二极管的时,你还感觉不到P0.P1口的差别.(10-20mA之间,当中P0驱动能力最强,但对于驱动直流电机依旧非常弱.其结果就是电机不转).那么有什么办法提高驱动能力吗 ...
- 检测浏览器是否支持cookie方法
cookie 摘自: http://www.cnblogs.com/fish-li/archive/2011/07/03/2096903.html Cookie是什么? Cookie 是一小段文本信息 ...
- 单片机项目中使用新IC芯片的调试方法
前两天,一位小伙伴咨询我一款新IC芯片怎么使用,借此机会我顺便把我日常工作中经常用到的一种调试方法介绍给小伙伴们,希望对对大家有所帮助.准备仓促,文中难免有技术性错误,欢迎大家给予指正,并给出好的建议 ...
随机推荐
- 自定义鼠标Cursor转变成图片
今天无意做到项目遇到一个好玩的事情,就是当我鼠标移到一个链接上面,并不是像正常那样出现一个小手,而是变成一个小十字架, 下面看图当时第一眼看到总感觉哪里不对,噢噢噢噢 这样的 小手没了,居然是一个图片 ...
- ie6-7 overflow:hidden失效问题的解决方法
即使父元素设置了overflow:hidden.解决这个bug很简单,在父元素中使用position:relative; zoom: 1;触发haslayout 即可解决该BUG.
- MySQL无法登录服务器解决方法
提示:#2000 无法登录 MySQL 服务器 今天用本机装了个phpMyAdmin,版本3.4.8,想用它来连一台内网服务器上的Mysql,于是乎修改phpMyAdmin配置文件config.inc ...
- amCharts 破解
官网下载 http://www.amcharts.com 然后找到amcharts.js , 打开搜索关键字 “utm_source=swf&utm_medium=demo&utm_c ...
- iOS9 中的一些适配问题
1.URL scheme白名单:在info文件中加入LSApplicationQueriesSchemes(Array),添加需要的scheme,如微信:weixin.wechat 支付宝:alipa ...
- C# Double String互转
/// <summary> /// str转金额 元 /// </summary> /// <param name="money"></p ...
- cas sso单点登录系列1_cas-client Filter源码解码(转)
转:http://blog.csdn.net/ae6623/article/details/8841801?utm_source=tuicool&utm_medium=referral /* ...
- cocos2dx lua调用C++类.
最近需求所迫, 终于着手传说中的 lua 了. 折腾了4天, 总算大概搞明白了用法. 细节咱们就别谈了, 直接说项目里怎么跑起来. 准备工作 我们需要一系列繁琐的前奏. tolua++: 这是必备工具 ...
- openMPI小集群安装
经过一天的努力,终于完成了openMPI的多节点安装,即小集群安装.本文使用的是openmpi-1.6.5,下载地址见:http://www.open-mpi.org/software/ompi/v1 ...
- Hadoop 中 IPC 的源码分析
最近开始看 Hadoop 的一些源码,展开hadoop的源码包,各个组件分得比较清楚,于是开始看一下 IPC 的一些源码. IPC模块,也就是进程间通信模块,如果是在不同的机器上,那就可以理解为 RP ...