一种用单片机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芯片怎么使用,借此机会我顺便把我日常工作中经常用到的一种调试方法介绍给小伙伴们,希望对对大家有所帮助.准备仓促,文中难免有技术性错误,欢迎大家给予指正,并给出好的建议 ...
随机推荐
- jquery之隐藏div
1.$("#demo").attr("style","display:none;");//隐藏div $("#demo" ...
- AS Gradle构建工具与Android plugin插件【大全】
Android plugin version 与 gradle version 的关系 Gradle是一种构建工具,它通过编写一个名为build.gradle的脚本文件对项目进行设置,再根据这个脚本对 ...
- python面对对象编程----------7:callable(类调用)与context(上下文)
一:callables callables使类实例能够像函数一样被调用 如果类需要一个函数型接口这时用callable,最好继承自abc.Callable,这样有些检查机制并且一看就知道此类的目的是c ...
- Linq101-Generation
using System; using System.Linq; namespace Linq101 { class Generation { /// <summary> /// This ...
- JTree用法及JTree使用经验总结
import java.awt.Dimension; import java.awt.Color; import javax.swing.JFrame; import javax.swing. ...
- asp.net 图片质量压缩(不改变尺寸)
private static ImageCodecInfo GetEncoderInfo(String mimeType) { int j; ImageCodecInfo[] encoders; en ...
- Hive学习之四 《Hive分区表场景案例应用案例,企业日志加载》 详解
文件的加载,只需要三步就够了,废话不多说,来直接的吧. 一.建表 话不多说,直接开始. 建表,对于日志文件来说,最后有分区,在此案例中,对年月日和小时进行了分区. 建表tracktest_log,分隔 ...
- Taxi Cab Scheme POJ && HDU
Online Judge Problem Set Authors Online Contests User Web Board Home Page F.A.Qs Statistical Charts ...
- Linux 0.11下信号量的实现和应用
Linux 011下信号量的实现和应用 生产者-消费者问题 实现信号量 信号量的代码实现 关于sem_wait和sem_post sem_wait和sem_post函数的代码实现 信号量的完整代码 实 ...
- ASP.Net MVC4排序检索分页的实现
前言 上一节我们做到了如下的一个基础查询页面.本节我们向这个页面中加入排序.搜索和分页功能. 排序 从上图中的地址栏中可以看到这个页面调用的是Company Controller下的Index Act ...