OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5536|回复: 5

ADC1多通道采集结果不正确,除了PA0以外

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-5-7
在线时间
0 小时
发表于 2015-5-7 09:51:00 | 显示全部楼层 |阅读模式
5金钱

我原本希望要给STM32芯片输入两路信号电压V1,V2,所以在通道选择的时候用

[mw_shl_code=c,true]//主程序 #include "delay.h" #include "sys.h" #include "usart.h" #include "lcd.h" #include "adc.h" #include "dma.h" #define ADC1_DR_Address ((uint32_t)0x4001244C) #define M 6 u16 AD_Value[6]; float volta[6]; u8 i; float AD_SUM(u16 x,float y) { float v; v=0; for(i=0;i<80;i++) { y=(float) x/4095*3.3; v+=y; } v=v/i; return v; } int main() { float v1,v2,v3,v4,v5,v6; SystemInit(); delay_init(72); //延时初始化 NVIC_Configuration(); uart_init(9600); DMA_Config(DMA1_Channel1,(u32)ADC1_DR_Address,(u32)&AD_Value,6);//cndtr对应所开信道个数 DMA_Cmd(DMA1_Channel1, ENABLE); //启动DMA通道 Adc_Init(); ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件启动AD转换 while(1) { v1=0;v2=0;v3=0;v4=0;v5=0;v6=0; v1=AD_SUM(AD_Value[0],volta[0]); v2=AD_SUM(AD_Value[1],volta[1]); v3=AD_SUM(AD_Value[2],volta[2]); v4=AD_SUM(AD_Value[3],volta[3]); v5=AD_SUM(AD_Value[4],volta[4]); v6=AD_SUM(AD_Value[5],volta[5]); /*for(i=0;i<80;i++) //循环2次转换AD值 { volta[0] =(float) AD_Value[0]/4095*3.3; volta[1] =(float) AD_Value[1]/4095*3.3; v1+=volta[0]; v2+=volta[1]; volta[2] =(float) AD_Value[1]/4095*3.3; v3+=volta[2]; volta[3] =(float) AD_Value[1]/4095*3.3; v4+=volta[3]; volta[4] =(float) AD_Value[1]/4095*3.3; v5+=volta[4]; volta[5] =(float) AD_Value[1]/4095*3.3; v6+=volta[5]; } v1=v1/i; v2=v2/i; v3=v3/i; v4=v4/i; v5=v5/i; v6=v6/i; printf("AD1=%d\n",AD_Value[0]); printf(" volta1 = %2.3f V \r\n",v1); printf("AD2=%d\n",AD_Value[1]); printf(" volta2 = %2.3f V \r\n\r\n",v2); printf("AD3=%d\n",AD_Value[2]); printf("\r\n volta3 = %f V \r\n",volta[2]); printf("AD4=%d\n",AD_Value[3]); printf("\r\n volta4 = %f V \r\n",volta[3]); printf("AD5=%d\n",AD_Value[4]); printf("\r\n volta5 = %f V \r\n",volta[4]); printf("AD6=%d\n",AD_Value[5]); printf("\r\n volta6 = %f V \r\n",volta[5]); */ printf(" v1 = %2.3f V ",v1); printf(" v2 = %2.3f V ",v2); printf(" v3 = %2.3f V ",v3); printf(" v4 = %2.3f V ",v4); printf(" v5 = %2.3f V ",v5); printf(" v6 = %2.3f V \r\n",v6); delay_ms(400); } } [/mw_shl_code]

在这里选择的6个脚都悬空的情况下,用串口输出电脑上打印到的电压值不是应该一样的么?这6个电压明显不一样
  v1 = 1.622 V   v2 = 1.978 V   v3 = 1.986 V   v4 = 1.727 V   v5 = 1.605 V   v6 = 1.763 V 
  v1 = 1.621 V   v2 = 1.978 V   v3 = 1.985 V   v4 = 1.728 V   v5 = 1.604 V   v6 = 1.762 V 
  v1 = 1.617 V   v2 = 1.978 V   v3 = 1.985 V   v4 = 1.729 V   v5 = 1.603 V   v6 = 1.761 V 
  v1 = 1.622 V   v2 = 1.978 V   v3 = 1.985 V   v4 = 1.729 V   v5 = 1.604 V   v6 = 1.763 V 
  v1 = 1.620 V   v2 = 1.978 V   v3 = 1.986 V   v4 = 1.729 V   v5 = 1.601 V   v6 = 1.762 V 
  v1 = 1.618 V   v2 = 1.978 V   v3 = 1.984 V   v4 = 1.723 V   v5 = 1.604 V   v6 = 1.762 V 
  v1 = 1.617 V   v2 = 1.979 V   v3 = 1.985 V   v4 = 1.726 V   v5 = 1.603 V   v6 = 1.762 V 
  v1 = 1.620 V   v2 = 1.978 V   v3 = 1.985 V   v4 = 1.723 V   v5 = 1.606 V   v6 = 1.762 V 
  v1 = 1.617 V   v2 = 1.978 V   v3 = 1.985 V   v4 = 1.728 V   v5 = 1.601 V   v6 = 1.762 V 
  v1 = 1.618 V   v2 = 1.978 V   v3 = 1.985 V   v4 = 1.727 V   v5 = 1.603 V   v6 = 1.761 V 
  v1 = 1.622 V   v2 = 1.978 V   v3 = 1.984 V   v4 = 1.729 V   v5 = 1.606 V   v6 = 1.762 V 

在我实际使用的时候我试过程序只开放两个通道采集(程序修改为2个通道),也就PA0,PA1这两个脚分别测的电压实际为1.8V,0.85V ;
可是只有PA0测1.8V几乎正确,PA1测0.85测出来就不对了,是1.85V的样子。但是我把0.85V链接到PA0上又能正确,PA1就不对,这是什么原因呢??


六通道ADC (DMA传输).rar

4.82 MB, 下载次数: 208

最佳答案

查看完整内容[请看2#楼]

我这有ADC转换3通道的,你可以试试
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2015-5-7 09:51:01 | 显示全部楼层
我这有ADC转换3通道的,你可以试试

练习16-DMA+ADC.zip

682.12 KB, 下载次数: 422

天道酬勤
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2015-2-27
在线时间
2 小时
发表于 2015-5-7 10:38:05 | 显示全部楼层
我也出现过这样的问题,多通道测一路,另一路有干扰
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-5-7
在线时间
0 小时
 楼主| 发表于 2015-5-7 11:56:23 | 显示全部楼层
回复【2楼】cz215592259:
---------------------------------
怎么解决的?
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-5-7
在线时间
0 小时
 楼主| 发表于 2015-5-7 16:36:05 | 显示全部楼层
求大神,难道是因为那个输入阻抗的原因?那为什么影响那么大呀,并且不同通道之间的信号电压检测值还存在较大的干扰~
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-8 00:12:35 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 20:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表