没有现成的程序哦,
但原理上是一样的。
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转换怎么做它的硬件电路怎么连,还有程序。 求大神指点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)