怎么用ad0832和过零电压比较器芯片采集一个周期的电压

AD7865的交流采样技术及其应用_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
AD7865的交流采样技术及其应用
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩5页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢第11章 数模与模数转换器 习题与参考答案_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第11章 数模与模数转换器 习题与参考答案
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩7页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢后使用快捷导航没有帐号?
查看: 7382|回复: 13
请问如何用51单片机和ADC0832或者和AD7520控制电阻值
在线时间6 小时
威望780 分
TA的帖子TA的资源
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
请问如何用51单片机和ADC0832或者和AD7520控制电阻值呢?
谢谢各位了...........
在线时间6 小时
威望780 分
TA的帖子TA的资源
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
各位大侠帮我讲讲程控放大器是如何用单片机控制反馈电阻的也行,真是谢谢各位了...................
在线时间53 小时
威望2837 分
芯币308 枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2837, 距离下一级还需 663 积分
五彩晶圆(初级), 积分 2837, 距离下一级还需 663 积分
你指的应该是自动控制增益技术(AGC:Auto Gain Control)。
AGC技术是指:单片机根据第一次采集(或开始一定时间内采集)的信号数据大小(这里会用上A/D转换器件),判断其信号所在区间范围,然后以一定的的算法得到使测量精度最高的放大倍数(这里的算法是指考虑信号幅值、测试的满量程值、A/D转换精度等),再控制数字电位器(数字电位器的控制方式,根据厂家的DataSheet说明进行,例如双向串行接口I2C),而此数字电位器正好设计为电路增益控制的反馈电阻,从而达到AGC目的。
注意:数字电位器有一定的响应时间(大约在数十毫秒),因此增益的调节是有一定延时的,在应用设计中需要注意。
[ 本帖最后由 dswybs 于
16:30 编辑 ]
<p id="rate_" onmouseover="showTip(this)" tip="谢谢分享&威望 + 10 分
芯币 + 10 枚
" class="mtn mbn">
在线时间6 小时
威望780 分
TA的帖子TA的资源
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
我在一本书上看见可以用DAC0832作程控放大器,其中就把DAC0832作为反馈电阻来看,讲的不是很详细,所以不太明白
我想问一下可不可以把这种方法用在别的地方,比如我需要一个滑动变阻器,但是我想用单片机来控制阻值,是不是可以直接就用DAC0832来作为这个滑动变阻器呢?
在线时间53 小时
威望2837 分
芯币308 枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2837, 距离下一级还需 663 积分
五彩晶圆(初级), 积分 2837, 距离下一级还需 663 积分
再画个示意草图,应该更清楚点。
本帖子中包含更多资源
才可以下载或查看,没有帐号?
在线时间53 小时
威望2837 分
芯币308 枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2837, 距离下一级还需 663 积分
五彩晶圆(初级), 积分 2837, 距离下一级还需 663 积分
你说的把DAC0832用做反馈电阻,应该是依靠DAC0832自己的比较电阻,实际上也就是数字电位器。你需要使用DAC0832来代替其他滑动变阻器,实际上是选择合适的数字电位器来代替滑动变阻器,这需要判断数字电位器的阻值范围、抽头多少已决定是否合适来代替你的滑动变阻器(实际上,不建议在实时要求高、精度要求高的地方使用这种方法)。附上DAC的输出电路的示意图,可看出可把其当作数字电位器来用。
[ 本帖最后由 dswybs 于
17:39 编辑 ]
本帖子中包含更多资源
才可以下载或查看,没有帐号?
在线时间6 小时
威望780 分
TA的帖子TA的资源
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
那在实时要求高,精度要求高的情况下应该使用哪种方法比较好呢?
在线时间6 小时
威望780 分
TA的帖子TA的资源
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
我也传一张0832构成的程控放大器的图,如果我想把其中的可程控的反馈电阻用在别的使用滑动变阻器的地方,我应该怎么做呢?
本帖子中包含更多资源
才可以下载或查看,没有帐号?
在线时间6 小时
威望780 分
TA的帖子TA的资源
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
本帖子中包含更多资源
才可以下载或查看,没有帐号?
在线时间6 小时
威望780 分
TA的帖子TA的资源
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
本帖子中包含更多资源
才可以下载或查看,没有帐号?
在线时间53 小时
威望2837 分
芯币308 枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 2837, 距离下一级还需 663 积分
五彩晶圆(初级), 积分 2837, 距离下一级还需 663 积分
Vref作为数字电位器电阻的一端,Iout1作为另一端,接到你需要的地方,电阻值控制参考6楼的图,单片机给0832的不同数字值将改变Vref和Iout1之间的阻值,具体的阻值可按6楼的图进行串并联计算得出。
<p id="rate_" onmouseover="showTip(this)" tip="谢谢分享&威望 + 5 分
芯币 + 5 枚
" class="mtn mbn">
在线时间6 小时
威望780 分
TA的帖子TA的资源
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
那Rfb还用接什么吗?
在线时间6 小时
威望780 分
TA的帖子TA的资源
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
纯净的硅(初级), 积分 780, 距离下一级还需 20 积分
按照11楼的方法我仿真了一下,不管怎么改变0832数据端的值,他两端的电压都没有变化,是不是在连接电路的时候还要注意什么呢?
像Rfb,ILE,XFER等这些口应该怎么接呢?
在线时间1535 小时
威望23075 分
芯币9598 枚
E金币380 枚
TA的帖子TA的资源
原来DAC0832可以做 数字电位器 。
就是不知道贵不贵,学习了~
本人变态,生物勿近
Powered by
逛了这许久,何不进去瞧瞧?第50节:利用ADC0832采集电压信号,用平均法和区间法进行软件滤
10:07:07&&&来源:eefocus &&
是一款常用的8位AD采样芯片,通过它可以把外部的模拟转换成数字信号,然后给进行换算,显示等处理。
这一节要教会大家五个知识点:
第一个:分辨率的算法。有些书上说8位AD最高分辩可达到256级(0xff+1),当输入电压是0---5V时,电压精度为19.53mV(5000mV除以256),我认为这种说法是错误的。8位AD的最高分辨率应该是255级(0xff),当输入电压是0---5V时,电压精度为19.61mV(5000mV除以255)。
第二个:用求平均值的滤波法,可以使AD采样的数据更加圆滑,去除小毛刺。
第三个:用区间滤波法,在一些干扰很大的场合,可以避免末尾小数点的数据频繁跳动。
第四个:如何使系统可以采集到更高的电压。由于ADC0832直接采集的电压最大不能超过5V,如果要采集的最大电压是25V该怎么办?我们只要在外部多增加1个10K的电阻和1个40K的电阻组成分压电路,把25V分压成5V,然后再让ADC0832采样,这时采样到的数据只要乘以5的系数,就可以得到超过5V的实际电压。选择分压电阻时,阻值尽量不要太小,一般要10K级别以上,阻值大一点,对被采样的系统干扰影响就越小。
第五个:如何有效保护AD通道口。我在一些电压不稳定的工控场合,一般是在AD通道口对负极反接一个瞬变二极管SA5.0A。当电压超过5V时,瞬变二极管会导通吸收掉多余的能量,把电压降下来,避免AD通道口烧坏。
具体内容,请看源代码讲解。
(1) 硬件平台.
基于朱兆祺51单片机学习板。
(2)实现功能:
本程序有2个局部显示。
第1个局部是第8,7,6,5位数码管,显示没有经过滤波处理的实际电压值。此时能观察到未经滤波的数据不太稳定,末尾小数点数据会有跳动的现象
第2个局部是第4,3,2,1位数码管,显示经过平均法,区间法滤波的实际电压值。此时能观察到经过滤波后的数据很稳定,没有跳动的现象
系统保留3位小数点。手动调节可调电阻时,可以看到显示的数据在变化。
(3)源代码讲解如下:
#include "REG52.H"
#define const_voice_short 40 //蜂鸣器短叫的持续时间
void initial_myself(void);
void initial_peripheral(void);
void delay_short(unsigned int uiDelayShort);
void delay_long(unsigned int uiDelaylong);
//驱动数码管的74HC595
void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01);
void display_drive(void); //显示数码管字模的驱动函数
void display_service(void); //显示的窗口菜单服务程序
//驱动的74HC595
void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01);
void T0_time(void); //定时中断函数
void ad_sampling_service(void); //AD采样与处理的服务程序
sbit _dr=P3^5; //LED灯
sbit beep_dr=P2^7; //蜂鸣器的驱动IO口
sbit dig_hc595_sh_dr=P2^0; //数码管的74HC595程序
sbit dig_hc595_st_dr=P2^1;
sbit dig_hc595_ds_dr=P2^2;
sbit hc595_sh_dr=P2^3; //LED灯的74HC595程序
sbit hc595_st_dr=P2^4;
sbit hc595_ds_dr=P2^5;
sbit 0832_clk_dr = P1^2; // 定义adc0832的引脚
sbit adc0832_cs_dr = P1^0;
sbit adc0832_data_sr_dr = P1^1;
unsigned char ucDigShow8; //第8位数码管要显示的内容
unsigned char ucDigShow7; //第7位数码管要显示的内容
unsigned char ucDigShow6; //第6位数码管要显示的内容
unsigned char ucDigShow5; //第5位数码管要显示的内容
unsigned char ucDigShow4; //第4位数码管要显示的内容
unsigned char ucDigShow3; //第3位数码管要显示的内容
unsigned char ucDigShow2; //第2位数码管要显示的内容
unsigned char ucDigShow1; //第1位数码管要显示的内容
unsigned char ucDigDot8; //数码管8的小数点是否显示的标志
unsigned char ucDigDot7; //数码管7的小数点是否显示的标志
unsigned char ucDigDot6; //数码管6的小数点是否显示的标志
unsigned char ucDigDot5; //数码管5的小数点是否显示的标志
unsigned char ucDigDot4; //数码管4的小数点是否显示的标志
unsigned char ucDigDot3; //数码管3的小数点是否显示的标志
unsigned char ucDigDot2; //数码管2的小数点是否显示的标志
unsigned char ucDigDot1; //数码管1的小数点是否显示的标志
unsigned char ucDigShowTemp=0; //临时中间变量
unsigned char ucDisplayDriveStep=1; //动态扫描数码管的步骤变量
unsigned char ucWd1Part1Update=1; //在窗口1中,局部1的更新显示标志
unsigned char ucWd1Part2Update=1; //在窗口1中,局部2的更新显示标志
unsigned char ucTemp1=0; //中间过渡变量
unsigned char ucTemp2=0; //中间过渡变量
unsigned char ucTemp3=0; //中间过渡变量
unsigned char ucTemp4=0; //中间过渡变量
unsigned char ucTemp5=0; //中间过渡变量
unsigned char ucTemp6=0; //中间过渡变量
unsigned char ucTemp7=0; //中间过渡变量
unsigned char ucTemp8=0; //中间过渡变量
unsigned char ucAD=0; //AD值
unsigned char ucCheckAD=0; //用来做校验对比的AD值
unsigned long ulTemp=0; //参与换算的中间变量
unsigned long ulTempFilterV=0; //参与换算的中间变量
unsigned long ulBackupFilterV=5000; //备份最新采样数据的中间变量
unsigned char ucSamplingCnt=0; //统计采样的次数 本程序采样8次后求平均值
unsigned long ulV=0; //未经滤波处理的实时电压值
unsigned long ulFilterV=0; //经过滤波后的实时电压值
//根据原理图得出的共阴数码管字模表
code unsigned char dig_table[]=
0x3f, //0 序号0
0x06, //1 序号1
0x5b, //2 序号2
0x4f, //3 序号3
0x66, //4 序号4
0x6d, //5 序号5
0x7d, //6 序号6
0x07, //7 序号7
0x7f, //8 序号8
0x6f, //9 序号9
0x00, //无 序号10
0x40, //- 序号11
0x73, //P 序号12
void main()
initial_myself();
delay_long(100);
initial_peripheral();
ad_sampling_service(); //AD采样与处理的服务程序
display_service(); //显示的窗口菜单服务程序
void ad_sampling_service(void) //AD采样与处理的服务程序
ucAD=0; //AD值
ucCheckAD=0; //用来做校验对比的AD值
/* 片选信号置为低电平 */
adc0832_cs_dr = 0;
/* 第一个脉冲,开始位 */
adc0832_data_sr_dr = 1;
adc0832_clk_dr = 0;
delay_short(1);
adc0832_clk_dr = 1;
/* 第二个脉冲,选择通道 */
adc0832_data_sr_dr = 1;
adc0832_clk_dr = 0;
adc0832_clk_dr = 1;
/* 第三个脉冲,选择通道 */
adc0832_data_sr_dr = 0;
adc0832_clk_dr = 0;
adc0832_clk_dr = 1;
/* 数据线输出高电平 */
adc0832_data_sr_dr = 1;
delay_short(2);
/* 第一个下降沿 */
adc0832_clk_dr = 1;
adc0832_clk_dr = 0;
delay_short(1);
/* AD值开始送出 */
for (i = 0; i < 8; i++)
ucAD <<= 1;
adc0832_clk_dr = 1;
adc0832_clk_dr = 0;
if (adc0832_data_sr_dr==1)
ucAD |= 0x01;
/* 用于校验的AD值开始送出 */
for (i = 0; i < 8; i++)
ucCheckAD >>= 1;
if (adc0832_data_sr_dr==1)
ucCheckAD |= 0x80;
adc0832_clk_dr = 1;
adc0832_clk_dr = 0;
/* 片选信号置为高电平 */
adc0832_cs_dr = 1;
if(ucCheckAD==ucAD) //检验相等
ulTemp=0; //把char类型数据赋值给long类型数据之前,必须先清零
ulTemp=ucAD; //把char类型数据赋值给long类型数据,参与乘除法运算的数据,为了避免运算结果溢出,我都用long类型
/* 注释一:
* 因为保留3为小数点,这里的5000代表5.000V。ulTemp/255代表分辨率.
* 有些书上说8位AD最高分辩可达到256级(0xff+1),我认为这种说法是错误的。
* 8位AD最高分辩应该是255级(0xff),所以这里除以255,而不是256.
ulTemp=5000*ulTemp/255; //进行电压换算
ulV=ulT //得到未经滤波处理的实时电压值
ucWd1Part1Update=1; //局部更新显示未经滤波处理的电压
ulTempFilterV=ulTempFilterV+ulT //累加8次后求平均值
ucSamplingCnt++; //统计已经采样累计的次数
if(ucSamplingCnt>=8)
/* 注释二:
* 求平均值滤波法,为了得到的数据更加圆滑,去除小毛刺。
* 向右边移动3位相当于除以8。
ulTempFilterV=ulTempFilterV>>3; //求平均值滤波法
/* 注释三:
* 以下区间滤波法,为了避免末尾小数点的数据频繁跳动。
* 这里的20用于区间滤波法的正负偏差,这里的20代表0.020V。
* 意思是只要最近采集到的数据在正负0.020V偏差范围内,就不更新。
if(ulBackupFilterV>=20) //最近备份的上一次数据大于等于0.02V的情况下
if(ulTempFilterV(ulBackupFilterV+20)) //在正负0.020V偏差范围外,更新
ulBackupFilterV=ulTempFilterV; //备份最新采样的数据,方便下一次对比判断
ulFilterV=ulTempFilterV; //得到经过滤波处理的实时电压值
ucWd1Part2Update=1; //局部更新显示经过滤波处理的电压
else //最近备份的上一次数据小于0.02V的情况下
if(ulTempFilterV>(ulBackupFilterV+20)) //在正0.020V偏差范围外,更新
ulBackupFilterV=ulTempFilterV; //备份最新采样的数据,方便下一次对比判断
ulFilterV=ulTempFilterV; //得到经过滤波处理的实时电压值
ucWd1Part2Update=1; //局部更新显示经过滤波处理的电压
ucSamplingCnt=0; //清零,为下一轮采样滤波作准备。
ulTempFilterV=0;
void display_service(void) //显示的窗口菜单服务程序
if(ucWd1Part1Update==1)//未经滤波处理的实时电压更新显示
ucWd1Part1Update=0;
ucTemp8=ulV%; //显示电压值个位
ucTemp7=ulV%; //显示电压值小数点后第1位
ucTemp6=ulV%100/10; //显示电压值小数点后第2位
ucTemp5=ulV%10; //显示电压值小数点后第3位
ucDigShow8=ucTemp8; //数码管显示实际内容
ucDigShow7=ucTemp7;
ucDigShow6=ucTemp6;
ucDigShow5=ucTemp5;
if(ucWd1Part2Update==1)//经过滤波处理后的实时电压更新显示
ucWd1Part2Update=0;
ucTemp4=ulFilterV%; //显示电压值个位
ucTemp3=ulFilterV%; //显示电压值小数点后第1位
ucTemp2=ulFilterV%100/10; //显示电压值小数点后第2位
ucTemp1=ulFilterV%10; //显示电压值小数点后第3位
ucDigShow4=ucTemp4; //数码管显示实际内容
ucDigShow3=ucTemp3;
ucDigShow2=ucTemp2;
ucDigShow1=ucTemp1;
void display_drive(void)
//以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路
switch(ucDisplayDriveStep)
case 1: //显示第1位
ucDigShowTemp=dig_table[ucDigShow1];
if(ucDigDot1==1)
ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点
dig_hc595_drive(ucDigShowTemp,0xfe);
case 2: //显示第2位
ucDigShowTemp=dig_table[ucDigShow2];
if(ucDigDot2==1)
ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点
dig_hc595_drive(ucDigShowTemp,0xfd);
case 3: //显示第3位
ucDigShowTemp=dig_table[ucDigShow3];
if(ucDigDot3==1)
ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点
dig_hc595_drive(ucDigShowTemp,0xfb);
case 4: //显示第4位
ucDigShowTemp=dig_table[ucDigShow4];
if(ucDigDot4==1)
ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点
dig_hc595_drive(ucDigShowTemp,0xf7);
case 5: //显示第5位
ucDigShowTemp=dig_table[ucDigShow5];
if(ucDigDot5==1)
ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点
dig_hc595_drive(ucDigShowTemp,0xef);
case 6: //显示第6位
ucDigShowTemp=dig_table[ucDigShow6];
if(ucDigDot6==1)
ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点
dig_hc595_drive(ucDigShowTemp,0xdf);
case 7: //显示第7位
ucDigShowTemp=dig_table[ucDigShow7];
if(ucDigDot7==1)
ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点
dig_hc595_drive(ucDigShowTemp,0xbf);
case 8: //显示第8位
ucDigShowTemp=dig_table[ucDigShow8];
if(ucDigDot8==1)
ucDigShowTemp=ucDigShowTemp|0x80; //显示小数点
dig_hc595_drive(ucDigShowTemp,0x7f);
ucDisplayDriveStep++;
if(ucDisplayDriveStep>8) //扫描完8个数码管后,重新从第一个开始扫描
ucDisplayDriveStep=1;
//数码管的74HC595驱动函数
void dig_hc595_drive(unsigned char ucDigStatusTemp16_09,unsigned char ucDigStatusTemp08_01)
unsigned char ucTempD
dig_hc595_sh_dr=0;
dig_hc595_st_dr=0;
ucTempData=ucDigStatusTemp16_09; //先送高8位
for(i=0;i<8;i++)
if(ucTempData>=0x80)dig_hc595_ds_dr=1;
else dig_hc595_ds_dr=0;
dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(1);
dig_hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1;
ucTempData=ucDigStatusTemp08_01; //再先送低8位
for(i=0;i<8;i++)
if(ucTempData>=0x80)dig_hc595_ds_dr=1;
else dig_hc595_ds_dr=0;
dig_hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(1);
dig_hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1;
dig_hc595_st_dr=0; //ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
delay_short(1);
dig_hc595_st_dr=1;
delay_short(1);
dig_hc595_sh_dr=0; //拉低,抗干扰就增强
dig_hc595_st_dr=0;
dig_hc595_ds_dr=0;
//LED灯的74HC595驱动函数
void hc595_drive(unsigned char ucLedStatusTemp16_09,unsigned char ucLedStatusTemp08_01)
unsigned char ucTempD
hc595_sh_dr=0;
hc595_st_dr=0;
ucTempData=ucLedStatusTemp16_09; //先送高8位
for(i=0;i<8;i++)
if(ucTempData>=0x80)hc595_ds_dr=1;
else hc595_ds_dr=0;
hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(1);
hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1;
ucTempData=ucLedStatusTemp08_01; //再先送低8位
for(i=0;i<8;i++)
if(ucTempData>=0x80)hc595_ds_dr=1;
else hc595_ds_dr=0;
hc595_sh_dr=0; //SH引脚的上升沿把数据送入寄存器
delay_short(1);
hc595_sh_dr=1;
delay_short(1);
ucTempData=ucTempData<<1;
hc595_st_dr=0; //ST引脚把两个寄存器的数据更新输出到74HC595的输出引脚上并且锁存起来
delay_short(1);
hc595_st_dr=1;
delay_short(1);
hc595_sh_dr=0; //拉低,抗干扰就增强
hc595_st_dr=0;
hc595_ds_dr=0;
void T0_time(void) interrupt 1 //定时中断
TF0=0; //清除中断标志
TR0=0; //关中断
display_drive(); //数码管字模的驱动函数
TH0=0 //重装初始值()=65035=0xfe0b
TR0=1; //开中断
void delay_short(unsigned int uiDelayShort)
; //一个分号相当于执行一条空语句
void delay_long(unsigned int uiDelayLong)
for(j=0;j<500;j++) //内嵌循环的空指令数量
; //一个分号相当于执行一条空语句
void initial_myself(void) //第一区 初始化单片机
led_dr=0;//LED灯默认关闭
beep_dr=1; //用PNP控制蜂鸣器,输出高电平时不叫。
hc595_drive(0x00,0x00); //关闭所有经过另外两个74HC595驱动的LED灯
TMOD=0x01; //设置定时器0为工作方式1
TH0=0 //重装初始值()=65035=0xfe0b
void initial_peripheral(void) //第二区 初始化外围
ucDigDot8=1; //显示未经过滤波电压的小数点
ucDigDot7=0;
ucDigDot6=0;
ucDigDot5=0;
ucDigDot4=1; //显示经过滤波后电压的小数点
ucDigDot3=0;
ucDigDot2=0;
ucDigDot1=0;
EA=1; //开总中断
ET0=1; //允许定时中断
TR0=1; //启动定时中断
总结陈词:
这节用区间滤波法虽然可以解决小数点后面的数据出现频繁跳动的现象,但是也存在一个小问题,就是精度受到了影响,比如我们设置的正负偏差是0.02V,那就意味着系统存在0.02V的误差。有没有更好的办法解决这个问题?如果系统的末尾数据一直不断处于频繁跳动中,那么只能牺牲一点精度,我认为用区间法已经是最好的解决办法了,但是经过本次实验,我观察到未经过滤波处理的数据只是偶尔跳动,并非频繁跳动,所以下一节我会给大家介绍一种不用牺牲精度,又可以很好滤波的方法。欲知详情,请听下回分解-----利用ADC0832采集电压信号,用连续N次一致性的方法进行滤波处理。
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
ADC0832相关资源
电压信号相关资源
软件滤波相关资源
编辑:什么鱼
本文引用地址:
本周热门资源推荐
EEWORLD独家}

我要回帖

更多关于 lm393电压比较器电路 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信