一种用单片机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芯片怎么使用,借此机会我顺便把我日常工作中经常用到的一种调试方法介绍给小伙伴们,希望对对大家有所帮助.准备仓促,文中难免有技术性错误,欢迎大家给予指正,并给出好的建议 ...
随机推荐
- 构建可比较的对象(IComparable)
IComparable接口 System.IComparable接口指定了一种允许一个对象可基于某些特定键值进行排序的行为. namespace System { [ComVisible(true)] ...
- System.Management命名空间
提供对大量管理信息和管理事件集合的访问,这些信息和事件是与根据 Windows 管理规范 (WMI) 结构对系统.设备和应用程序设置检测点有关的.应用程序和服务可以使用从 ManagementObje ...
- 关于php优化的方法
1. 如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.2.$row[’id’] 的速度是$row[id]的7倍.3.echo 比 print快,并且使用echo的 ...
- 知识点总结之HTML篇
1.标签语义化: ①.在不依赖样式的情况下,页面能够呈现清晰的结构. ②.如果使用者有视觉障碍,屏幕阅读器会完全根据你的标记来选择读取你的网页. ③.有利于搜索引擎依赖于标记来确定上下文和各个关键字的 ...
- 你好,C++(12)如何管理多个类型相同性质相同的数据?3.6 数组
3.6 数组 学过前面的基本数据类型之后,我们现在可以定义单个变量来表示单个的数据.例如,我们可以用int类型定义变量来表示公交车的216路:可以用float类型定义变量来表示西红柿3.5元一斤.但 ...
- date命令详解与练习
date : 用来打印或设置系统日期和时间. 它在linux shell编程中经常会用到.比如每天生成随日期变化的档案名,尤其在银行业务中每天都会生成流水文件.eg:datefile=$(date & ...
- JS判断鼠标从哪个方向进入DIV容器
写的不够高大上 , 不要介意哦... Js: //进去 $(".flash").bind("mouseenter",function(e){ /** the w ...
- python学习之旅:array 转 list
最近学习python,记录学习的点滴. >>> import numpy as np >>> a = np.array([[1,2],[3,4]]) >> ...
- 使用Gson进行json数据转换(list to json 和json to list)
文章借鉴自:http://blog.csdn.net/binyao02123202/article/details/7540407 下面是一个简单的例子: Java代码 public class Pe ...
- Can't connect to local MySQL server through socket
今天上午在测试代码的时候发现在执行写mysql的时候总是超时,然后失败,使用mysql命令 show processlist; 发现有两条update的sql语句已经执行了很长时间,以为是这两个程序把 ...