OpenEdv-开源电子网

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

做ADC3个不同通道连续转换 用DMA 和一个通道的CH1测得的值不同

[复制链接]

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
发表于 2017-9-26 20:34:31 | 显示全部楼层 |阅读模式
5金钱
第一次用ADC测,刚开始选择了原子哥的例子没有DMA,上网查了查多通道采集需要DMA  然后加入了DMA后 CH1的值和以前单通道采集的值不一样 一直在2.4V左右  
我感觉 使是我配置的问题。一个人在学校学这个好难  求助,下面是代码 TIM图片20170926203111.png

下面是主函数
int main(void)
{         
        u32 SendBuff[3];
  u16 adcx;
        float temp;
        delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
//        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏè¼¶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
        uart_init(115200);                 //′®¿ú3õê¼»ˉÎa115200
        LED_Init();                             //LED¶Ë¿ú3õê¼»ˉ
        LCD_Init();                                
        Adc_Init();                                  //ADC3õê¼»ˉ
         
        ADC_DMA_INIT(DMA1_Channel1,(u32)&(ADC1->DR),(u32)SendBuff,1000);//DMA1í¨μà4,íaéèÎa′®¿ú1,′æ′¢Æ÷ÎaSendBuff,3¤¶èSEND_BUF_SIZE.


        POINT_COLOR=RED;//éèÖÃ×ÖìåÎaoìé«
        LCD_ShowString(60,50,200,16,16,"Elite STM32");       
        LCD_ShowString(60,70,200,16,16,"ADC TEST");       
        LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(60,110,250,16,16,"2015/1/14");       
        //ÏÔê¾ìáê¾DÅÏ¢
        POINT_COLOR=BLUE;//éèÖÃ×ÖìåÎaà¶é«
        LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:");             
        LCD_ShowString(60,150,300,16,16,"ADC_CH0_VOL:0.000V");             
        LCD_ShowString(60,170,200,16,16,"ADC_CH1_VAL:");             
        LCD_ShowString(60,190,300,16,16,"ADC_CH1_VOL:0.000V");       
        LCD_ShowString(60,210,200,16,16,"ADC_CH2_VAL:");             
        LCD_ShowString(60,230,300,16,16,"ADC_CH2_VOL:0.000V");          
        while(1)
{
                adcx=Get_Adc_Average(ADC_Channel_1,10);
                LCD_ShowxNum(156,130,adcx,4,16,0);//ÏÔê¾ADCμÄÖμ
                temp=(float)adcx*(3.3/4096);
                adcx=temp;
                LCD_ShowxNum(156,150,adcx,1,16,0);//ÏÔê¾μçÑ1Öμ
                temp-=adcx;
                temp*=1000;
                LCD_ShowxNum(172,150,temp,3,16,0X80);
                LED0=1;
                delay_ms(250);       
               
                adcx=Get_Adc_Average(ADC_Channel_2,10);
                LCD_ShowxNum(156,170,adcx,4,16,0);//ÏÔê¾ADCμÄÖμ
                temp=(float)adcx*(3.3/4096);
                adcx=temp;
                LCD_ShowxNum(156,190,adcx,1,16,0);//ÏÔê¾μçÑ1Öμ
                temp-=adcx;
                temp*=1000;
                LCD_ShowxNum(172,190,temp,3,16,0X80);
                LED0=0;
                delay_ms(250);       
               
                adcx=Get_Adc_Average(ADC_Channel_3,10);
                LCD_ShowxNum(156,210,adcx,4,16,0);//ÏÔê¾ADCμÄÖμ
                temp=(float)adcx*(3.3/4096);
                adcx=temp;
                LCD_ShowxNum(156,230,adcx,1,16,0);//ÏÔê¾μçÑ1Öμ
                temp-=adcx;
                temp*=1000;
                LCD_ShowxNum(172,230,temp,3,16,0X80);
                LED1=1;
                delay_ms(250);       
               
                                LCD_ShowxNum(156,250,SendBuff[0],4,16,0);//ÏÔê¾ADCμÄÖμ

        }
}








1.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
 楼主| 发表于 2017-9-26 20:36:36 | 显示全部楼层
而且  三个通道采集的值都差不多...
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
 楼主| 发表于 2017-9-26 20:36:58 | 显示全部楼层
我主函数也弄得很迷糊...
回复

使用道具 举报

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2016-8-8
在线时间
101 小时
发表于 2017-9-26 20:53:40 | 显示全部楼层
我的学习方式是

软件单通道触发
软件多通道触发
软件触发通过dma传输
软件触发连续转换通过dma传输
pwm单通道触发通过dma传输


步子迈的大,我个人而言会扯着蛋。
如何拿下蒙住眼的树叶。
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
 楼主| 发表于 2017-9-26 20:55:49 | 显示全部楼层
主音调 发表于 2017-9-26 20:53
我的学习方式是

软件单通道触发

多通道不是就要使用DMA吗,我在往上看的多通道传输都是加上DMA  。。所以就两个一起用了...
回复

使用道具 举报

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
453
金钱
453
注册时间
2016-8-8
在线时间
101 小时
发表于 2017-9-26 21:12:11 | 显示全部楼层
本帖最后由 主音调 于 2017-9-26 21:22 编辑

ADC是12位的,你的dma注释的数据位却是8位的。

你的代码配置错误太多,建议你先一条一条的对着
别人的代码对比一下。
其实我也是新手
ADC多通道如果只能DMA那其他没有dma的单片机?。你可以看一下我前段时间
发的求助帖,那里有一种解决思路。
这是我的
void DMA_Configuration(void)
{

        DMA_InitTypeDef DMA_InitStructure;

        DMA_DeInit(DMA1_Channel1);//½« DMA μÄí¨μà 1¼Ä′æÆ÷ÖØéèÎaè±ê¡Öμ

        DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR;//DMA íaéè»ùμØÖ·
        DMA_InitStructure.DMA_MemoryBaseAddr=(u32)ADCData;     // DMA Äú′æ»ùμØÖ·

        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;      //íaéè×÷Îaêy¾Y′«êäμÄà′Ô′
        DMA_InitStructure.DMA_BufferSize=128;                  //»o′æ′óD¡

        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//íaéèμØÖ·¼Ä′æÆ÷2»±ä
        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;         //Äú′æμØÖ·¼Ä′æÆ÷μYÔö
       
       
        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//êy¾Y¿í¶èÎa 16 λ
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//êy¾Y¿í¶èÎa 16 λ

        DMA_InitStructure.DMA_Mode=//DMA_Mode_Normal;//1¤×÷ÔúÕy3£»o′æÄ£ê½      
                                  DMA_Mode_Circular;   //1¤×÷ÔúÑ-»·Ä£ê½
                                                          
        DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA í¨μà1óμóD¸ßóÅÏè¼¶
       
        DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;       //ûóDéèÖÃÎaÄú′æμ½Äú′æ′«êä

        DMA_Init(DMA1_Channel1,&DMA_InitStructure);     //3õê¼»ˉDMA

       
        //DMA_ITConfig(DMA1_Channel1,DMA_IT_TC, ENABLE);   //ê1Äü′«êäíê3éÖD¶Ï
       
        //DMA_ClearITPendingBit(DMA1_IT_TC1);
       
                DMA_Cmd(DMA1_Channel1,ENABLE);                   //ê1ÄüDMA



}

如何拿下蒙住眼的树叶。
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
 楼主| 发表于 2017-9-26 21:25:22 | 显示全部楼层
主音调 发表于 2017-9-26 21:12
ADC是12位的,你的dma注释的数据位却是8位的。

你的代码配置错误太多,建议你先一条一条的对着

谢谢!!!我先看看
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
 楼主| 发表于 2017-9-26 21:53:43 | 显示全部楼层
111111
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
 楼主| 发表于 2017-9-26 22:28:32 | 显示全部楼层
采集出来的值都为2.4左右,可是原子哥的单通道采集CH1为3.299V头疼啊
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
 楼主| 发表于 2017-9-26 22:38:29 | 显示全部楼层
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
 楼主| 发表于 2017-9-26 22:39:27 | 显示全部楼层
我把你的例子单通道采集也开启了连续模式,他的采集的值也为2.4V了 怎么回事啊
回复

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-9-26
在线时间
5 小时
 楼主| 发表于 2017-9-27 18:07:53 | 显示全部楼层
今天重新弄了下  开始从单个采集测试,然后是三个(没有开启扫描和连续)。三个后开启连续和扫描 出来的值3.0V左右。
回复

使用道具 举报

6

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-6-10
在线时间
39 小时
发表于 2017-10-23 14:12:59 | 显示全部楼层
多通道必须DMA?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 18:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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