STC15W404AS AD采集到0-5V电压信号转换为数值信号,经过单片机处理,通过串口发送给电脑,

STC15W404AS AD采集到0-5V电压信号转换为数值信号,经过单片机处理,通过串口发送给电脑,,第1张

没有现成的程序哦,

但原理上是一样的。

1、配置ADC,并采集到电压寄存器的值)

2、根据1的值计算成实际值:V = VadcVrev/adc_bit;

其中Vadc是1采集到的寄存器值,Vref是ADC转换的参考值,adc_bit是指ADC位数,例如8位ADC,10位,12位等,此处要注意变量溢出问题,因为有乘法,以前犯过错误。这样V就是实际电压,例如3000mV,4000mV等

3、将实际电压通过串口发送,如果要发送的数据只有8位,直接发就可以了,但串口助手只会显示16进制和字符,也就是说,如果你发送的电压V=100(mV),那么串口助手显示的是64,因为十进制100 = 十六进制64,当然,如果串口助手用字符显示,那么就会显示一个,字符(什么字符要自己查,反正不是你想要的结果)。

所以,串口发送这一步要经过一些处理,把变量转换一下再发送到串口助手,具体 *** 作,可以参考LCD1602显示数据的做法,把10进制数逐个位发送到串口助手上,

例如:要发送V=3000mV,

u8_temp = V/1000%10+0x30;

发送u8_temp,就可以把千位发送过去,后面的百位,十位,个位,以此类推,发完个位,再发一个回车换行(\r\n,如果没记错的话)

好好努力!

我刚好写完 完全可以显示正确的数值

复制给你:

//初始化ADC12

P6SEL |= 0x01; // 使能ADC通道

ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打开ADC,设置采样时间

// ADC12CTL0|= REFON+REF2_5V;

// ADC12MCTL0|=SREF_1;//选择内部参考电压源

ADC12CTL1 = SHP+CONSEQ_2; // 使用采样定时器

ADC12IE = 0x01; // 使能ADC中断

ADC12CTL0 |= ENC; // 使能转换

ADC12CTL0 |= ADC12SC;// 开始转换

#pragma vector=ADC_VECTOR

__interrupt void conversion()

{

uint buffer[32];

static uint index=0;

buffer[index++]=ADC12MEM0;

if(index==32)

{

index=0;

uchar i;

unsigned long sum=0;

for(i=0;i<32;i++)

sum+=buffer[i];

sum=sum/32;

}

}

得到的sum就是平滑滤波得到的数值,

void adchange()//AD采集程序,采集3路

{

uchar temp7,temp8,temp9,temp10,temp11,temp12;//这些变量用来暂存转换结果

ADC_CONTR=ADC_CONTR|0X80; //10000000 开启转换电源

Delay1ms(1); //延时,等待内部电源稳定

P1M0=P1M0|0X07; //设置p10 P11和 p13所在通道为开/漏模式

P1M1=P1M1|0X07;

ADC_CONTR=0xe0; //11100000 开启P10通道开始转换

Delay25us(10); //延时一端时间,使输入电压达到稳定

ADC_DATA =0x00; //清A/D转换结果寄存器

ADC_LOW2 =0x00;

ADC_CONTR |= 0x08; //ADC_START=1,开始转换

while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束

temp7=ADC_DATA; //读取转换结果

temp8=ADC_LOW2;

ADC_DATA =0x00; //清A/D转换结果寄存器

ADC_LOW2 =0x00;

ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零

Delay25us(1);

ADC_CONTR |= 0x08; //ADC_START=1,开始转换

while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束

temp9=ADC_DATA; //读取转换结果

temp10=ADC_LOW2;

ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零

Delay25us(1);

ADC_DATA =0x00; //清A/D转换结果寄存器

ADC_LOW2 =0x00;

ADC_CONTR |= 0x08; //ADC_START=1,开始转换

while(!(ADC_CONTR&0x10)); //0001,0000 等待A/D转换结束

temp11=ADC_DATA; //读取转换结果

temp12=ADC_LOW2;

ADC_CONTR=ADC_CONTR&0xe7; //将ADC_FLAG软件清零

Delay25us(1);

ADC_DATA =0x00; //清A/D转换结果寄存器

ADC_LOW2 =0x00;

}

首先,ADC采集电压不准确,和好几个因素都有关系。

1、电源纹波,电源纹波会导致地线抖动,从而影响ADC内部的比较器,影响采集。

2、ADC采集的基准,ADC内部比较需要基准做对比,如果基准不够稳定,那么采集出来的数据抖动就会比较大。可以用专门的基准芯片。

3、若从软件的角度上来说,要处理这个问题,可以采用简单的滤波法。比如采集的电压在615附近抖动,取整的话会变61或者62,这个时候可以简单做个函数规避一下。类似按键消抖。施密特也可以了解一下,虽然不一定派上用场。具体就看你怎么用了。

if((set-lastset)>1)

{

更新目标值

}

else

{不更新目标值}

以上就是关于STC15W404AS AD采集到0-5V电压信号转换为数值信号,经过单片机处理,通过串口发送给电脑,全部的内容,包括:STC15W404AS AD采集到0-5V电压信号转换为数值信号,经过单片机处理,通过串口发送给电脑,、请教关于ADC模块的软件触发转换等问题、stc12c5a16s2这个单片机的AD转换怎么做它的硬件电路怎么连,还有程序。 求大神指点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10110409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存