专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
PIC单片机
急:谁有用单片机测量交流电压的程序?
2020-02-06 09:46
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
9225
98
98
谁有用单片机测量交流电压的程序?220V电压经过处理,电压抬高了2.5V,问各位大侠客有类似的经验。
我现在做的测量的很不准确。
电压一会是220,一会是250,一会是180,一会是012V
我很头疼?
下午大侠帮忙。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
98条回答
jacky1982512
2020-02-08 01:03
void Deal_AD(void)
{
unsigned char HI,Low,i;
//static uchar k;
unsigned long data,j,a,b;
unsigned int c,m1,Adresult_avg;
//float m2;
// double m;
// for(i=0;i<20;i++) // 20
// AD_Reseve
=AD_Sample
; // 读采样值,以免在计算时被新的采样值覆盖
///*
for(i=0;i<20;i++) // 读采样值,以免在计算时被新的采样值覆盖
{
if(AD_Sample
>512)
{
AD_Reseve
=AD_Sample
-512;
}
else
{
AD_Reseve
=512-AD_Sample
;
}
}
//*/
data=0; // data先清零
for(i=0;i<20;i++) // 计算16[20]点采样值平方和
{
HI=AD_Reseve
>>8; // 高2位
Low=AD_Reseve
&0xff; // 低8位,隐形转换Low=AD_Reseve
;
a=HI*HI;
a=a<<16;
b=(HI*Low);
b=b<<9;
c=Low*Low;
j=a+c+b;
/* a为高2位,b为低8位,j=(a<<8+b)*(a<<8+b)= (a*a)<<16+2*(a<<8*b)+b*b=(a*a)<<16+(a*b)<<9+b*b. */
data+=j; // 累加平方和
}
data=data*0.05; // data除以20
//data=262144;
//m=sqrt(data); // 开平方根
//m=576.123;
//m=data*0.001953125;
//data=2600;
data=(data*10000); // 放大一万倍
m1=sqrt_16(data); // m1是unsigned int类型数据,等于扩大了100倍
//m2=m1*0.01; // 缩小一百倍
//m1=Adresult;
//Adresult=(unsigned int)m; // 转换为整形数据
//Adresult=(unsigned int)m2; // 转换为整形数据
Adresult=(m1*5)>>10; /* 将AD采样结果转换为两位数表示的值,即放大10倍,乘以满该度值5V,除以满刻度转换值10位(1024) */
/*
//取采样值的平均值
for(k=0;k<20;k++)
{
AD_Reseve_Average
=Adresult;
AD_Average_Point++;
}
if(AD_Average_Point>20)
{
AD_Average_Point=0;
AD_Average_Finish_Flag=1;
}
//=================================================
for(k=0;k<20;k++)
{
AD_Average_Reseve_Progression+=Adresult;//累加AD采样值
AD_Average_Point++;
}
if(AD_Average_Point>20)
{
AD_Average_Point=0;
AD_Average_Finish_Flag=1;
}
*/
//=====================================
/*
for(k=0;k<20;k++)
{
AD_Average_Reseve_Progression+=Adresult;//累加AD采样值
AD_Average_Point++;
break;
}
if(AD_Average_Point>20)
{
k=0;
AD_Average_Point=0;
AD_Average_Finish_Flag=1;
}
*/
//for(k=0;k<20;k++)
//{
AD_Average_Reseve_Progression+=Adresult;//累加AD采样值
AD_Average_Point++;
// break;
//}
if(AD_Average_Point>32)
{
//k=0;
AD_Average_Point=0;
AD_Average_Finish_Flag=1;
}
//Adresult=(((Adresult/10)<<4)&0xf0)+(Adresult % 10);/* 转换为带一位小数的BCD码实际值如25表示2.5V */
}
/* **************************************************************
** 函 数 名: AD_Average_Deal()
** 功 能:AD转换完成结果取平均值处理数据子程序
** 编 制: 大兵
** 日 期: 2010-5-29
****************************************************************** */
void AD_Average_Deal(void)
{
//AD_Average_Reseve_End = (AD_Average_Reseve_Progression>>5);
AD_Average_Reseve_End = (AD_Average_Reseve_Progression/32);
AD_Average_Reseve_End_Transfer=AD_Average_Reseve_End;
AD_Average_Reseve_Progression = 0;
AD_Average_Reseve_End=0;
}
加载中...
查看其它98个回答
一周热门
更多
>
相关问题
PIC单片机不同的IO口驱动74HC573驱动共阴极的数码管,有的段不亮
1 个回答
一种简单精确的pic延时方法
21 个回答
谁熟悉PIC的产品发布时间的,帮看看PIC18F47K40啥版本IDE能开发
12 个回答
求AN1078对应的源代码下载地址
5 个回答
PIC单片机应用技巧
4 个回答
相关文章
一种用PIC单片机主时钟驱动的老式挂钟
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
PIC单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
{
unsigned char HI,Low,i;
//static uchar k;
unsigned long data,j,a,b;
unsigned int c,m1,Adresult_avg;
//float m2;
// double m;
// for(i=0;i<20;i++) // 20
// AD_Reseve=AD_Sample; // 读采样值,以免在计算时被新的采样值覆盖
///*
for(i=0;i<20;i++) // 读采样值,以免在计算时被新的采样值覆盖
{
if(AD_Sample>512)
{
AD_Reseve=AD_Sample-512;
}
else
{
AD_Reseve=512-AD_Sample;
}
}
//*/
data=0; // data先清零
for(i=0;i<20;i++) // 计算16[20]点采样值平方和
{
HI=AD_Reseve>>8; // 高2位
Low=AD_Reseve&0xff; // 低8位,隐形转换Low=AD_Reseve;
a=HI*HI;
a=a<<16;
b=(HI*Low);
b=b<<9;
c=Low*Low;
j=a+c+b;
/* a为高2位,b为低8位,j=(a<<8+b)*(a<<8+b)= (a*a)<<16+2*(a<<8*b)+b*b=(a*a)<<16+(a*b)<<9+b*b. */
data+=j; // 累加平方和
}
data=data*0.05; // data除以20
//data=262144;
//m=sqrt(data); // 开平方根
//m=576.123;
//m=data*0.001953125;
//data=2600;
data=(data*10000); // 放大一万倍
m1=sqrt_16(data); // m1是unsigned int类型数据,等于扩大了100倍
//m2=m1*0.01; // 缩小一百倍
//m1=Adresult;
//Adresult=(unsigned int)m; // 转换为整形数据
//Adresult=(unsigned int)m2; // 转换为整形数据
Adresult=(m1*5)>>10; /* 将AD采样结果转换为两位数表示的值,即放大10倍,乘以满该度值5V,除以满刻度转换值10位(1024) */
/*
//取采样值的平均值
for(k=0;k<20;k++)
{
AD_Reseve_Average=Adresult;
AD_Average_Point++;
}
if(AD_Average_Point>20)
{
AD_Average_Point=0;
AD_Average_Finish_Flag=1;
}
//=================================================
for(k=0;k<20;k++)
{
AD_Average_Reseve_Progression+=Adresult;//累加AD采样值
AD_Average_Point++;
}
if(AD_Average_Point>20)
{
AD_Average_Point=0;
AD_Average_Finish_Flag=1;
}
*/
//=====================================
/*
for(k=0;k<20;k++)
{
AD_Average_Reseve_Progression+=Adresult;//累加AD采样值
AD_Average_Point++;
break;
}
if(AD_Average_Point>20)
{
k=0;
AD_Average_Point=0;
AD_Average_Finish_Flag=1;
}
*/
//for(k=0;k<20;k++)
//{
AD_Average_Reseve_Progression+=Adresult;//累加AD采样值
AD_Average_Point++;
// break;
//}
if(AD_Average_Point>32)
{
//k=0;
AD_Average_Point=0;
AD_Average_Finish_Flag=1;
}
//Adresult=(((Adresult/10)<<4)&0xf0)+(Adresult % 10);/* 转换为带一位小数的BCD码实际值如25表示2.5V */
}
/* **************************************************************
** 函 数 名: AD_Average_Deal()
** 功 能:AD转换完成结果取平均值处理数据子程序
** 编 制: 大兵
** 日 期: 2010-5-29
****************************************************************** */
void AD_Average_Deal(void)
{
//AD_Average_Reseve_End = (AD_Average_Reseve_Progression>>5);
AD_Average_Reseve_End = (AD_Average_Reseve_Progression/32);
AD_Average_Reseve_End_Transfer=AD_Average_Reseve_End;
AD_Average_Reseve_Progression = 0;
AD_Average_Reseve_End=0;
}
一周热门 更多>