OpenEdv-开源电子网

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

怎么一个adc多通道用或者怎么2个adc一起用

[复制链接]

20

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2016-7-14
在线时间
49 小时
发表于 2016-7-15 11:51:25 | 显示全部楼层 |阅读模式
1金钱
void  Adc_Init(void)
{   
       
        RCC->APB2ENR|=1<<2;   
        GPIOA->CRL&=0XFFFFFF0F;
                                 
        RCC->APB2ENR|=1<<9;      
        RCC->APB2RSTR|=1<<9;   
        RCC->APB2RSTR&=~(1<<9);            
        RCC->CFGR&=~(3<<14);   
       
       
        RCC->CFGR|=2<<14;               
        ADC1->CR1&=0XF0FFFF;   
        ADC1->CR1|=0<<16;      
        ADC1->CR1&=~(1<<8);              
        ADC1->CR2&=~(1<<1);   
        ADC1->CR2&=~(7<<17);          
        ADC1->CR2|=7<<17;          
        ADC1->CR2|=1<<20;     
        ADC1->CR2&=~(1<<11);   
        ADC1->SQR1&=~(0XF<<20);
        ADC1->SQR1|=0<<20;                               
       
        ADC1->SMPR2&=~(7<<3);           
        ADC1->SMPR2|=7<<3;      
        ADC1->CR2|=1<<0;                   
        ADC1->CR2|=1<<3;      
        while(ADC1->CR2&1<<3);                  
                    
        ADC1->CR2|=1<<2;         
        while(ADC1->CR2&1<<2);  
         
}


u16 Get_Adc(u8 ch)   
{
                         
        ADC1->SQR3&=0XFFFFFFE0;
        ADC1->SQR3|=ch;                                              
        ADC1->CR2|=1<<22;      
        while(!(ADC1->SR&1<<1));          
        return ADC1->DR;               
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc(ch);
                delay_ms(5);
        }
        return temp_val/times;
}

以上是给的模板,只适用配置PA1为adc输入,接收一个信号。。现在我想接受两个信号,查资料和问人得知道了可以一个ad多通道用或者2个ad一起用,但是我小白,很多不懂啊。求大神基于我给的寄存器版本的代码基础,教我怎么写2个信号的代码!!急急急

最佳答案

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

void Adc_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //ʹÄÜADC1ͨµÀʱÖÓ RCC_AHBPeriphClockCmd (RCC_AHBPeriph_DMA1|RCC_AHBPeriph_DMA2,ENABLE); DMA_InitTypeDef DMA_InitStructure; DMA_DeInit(DMA1_Chan ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2020-12-24
在线时间
7 小时
发表于 2016-7-15 11:51:26 | 显示全部楼层
void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //&Ecirc;&sup1;&Auml;&Uuml;ADC1&Iacute;¨&micro;&Agrave;&Ecirc;±&Ouml;&Oacute;
  RCC_AHBPeriphClockCmd (RCC_AHBPeriph_DMA1|RCC_AHBPeriph_DMA2,ENABLE);
  DMA_InitTypeDef  DMA_InitStructure;
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = 0x4001244C;                           //&Eacute;è&Ouml;&Atilde;&Iacute;&acirc;&Eacute;è&micro;&Auml;&micro;&Oslash;&Ouml;·
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)Adcvalue;                       //&Eacute;è&Ouml;&Atilde;&Iacute;&acirc;&Eacute;è&Ecirc;&yacute;×é&micro;&Auml;&micro;&Oslash;&Ouml;·
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                               //&acute;&laquo;&Ecirc;&auml;·&frac12;&Iuml;ò&Iacute;&acirc;&Eacute;è×÷&Icirc;&ordf;&Ocirc;&acute;
        DMA_InitStructure.DMA_BufferSize = 2;                                            //&Ecirc;&yacute;&frac34;&Yacute;×&ordf;&Ograve;&AElig;&Aacute;&iquest;&Icirc;&ordf;2&Acirc;·&pound;&not;2&Acirc;·AD
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                          //&Auml;&Uacute;&acute;&aelig;&micro;&Oslash;&Ouml;·&Ocirc;&ouml;&frac14;&Oacute;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                 //&Iacute;&acirc;&Eacute;è&micro;&Oslash;&Ouml;·&sup2;&raquo;±&auml;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;      //&Iacute;&acirc;&Eacute;è°&euml;×&Ouml;&acute;&laquo;&Ecirc;&auml;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;              //&Auml;&Uacute;&acute;&aelig;°&euml;×&Ouml;&acute;&laquo;&Ecirc;&auml;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                  //&Ntilde;&shy;&raquo;·&sup2;&Eacute;&frac14;&macr;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;                              //&Oacute;&Aring;&Iuml;&Egrave;&frac14;&para;&cedil;&szlig;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                     //&Auml;&Uacute;&acute;&aelig;&micro;&frac12;&Auml;&Uacute;&acute;&aelig;&micro;&Auml;&acute;&laquo;&Ecirc;&auml;&sup2;&raquo;&Ecirc;&sup1;&Auml;&Uuml;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
       
        DMA_Cmd(DMA1_Channel1, ENABLE);
       
       
                       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;        //PA0&iexcl;&centA1 ×÷&Icirc;&ordf;&Auml;&pound;&Auml;&acirc;&Iacute;¨&micro;&Agrave;&Ecirc;&auml;&Egrave;&euml;&Ograve;&yacute;&frac12;&Aring;  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //&Auml;&pound;&Auml;&acirc;&Ecirc;&auml;&Egrave;&euml;&Ograve;&yacute;&frac12;&Aring;
        GPIO_Init(GPIOC, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //&cedil;&acute;&Icirc;&raquo;ADC1

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC&sup1;¤×÷&Auml;&pound;&Ecirc;&frac12;:ADC1&ordm;&Iacute;ADC2&sup1;¤×÷&Ocirc;&Uacute;&para;&Agrave;&Aacute;&cent;&Auml;&pound;&Ecirc;&frac12;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //&Auml;&pound;&Ecirc;&yacute;×&ordf;&raquo;&raquo;&sup1;¤×÷&Ocirc;&Uacute;&micro;&yen;&Iacute;¨&micro;&Agrave;&Auml;&pound;&Ecirc;&frac12;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //&Auml;&pound;&Ecirc;&yacute;×&ordf;&raquo;&raquo;&sup1;¤×÷&Ocirc;&Uacute;&micro;&yen;&acute;&Icirc;×&ordf;&raquo;&raquo;&Auml;&pound;&Ecirc;&frac12;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //×&ordf;&raquo;&raquo;&Oacute;&Eacute;&Egrave;í&frac14;&thorn;&para;&oslash;&sup2;&raquo;&Ecirc;&Ccedil;&Iacute;&acirc;&sup2;&iquest;&acute;&yen;·&cent;&AElig;&ocirc;&para;&macr;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC&Ecirc;&yacute;&frac34;&Yacute;&Oacute;&Ograve;&para;&Ocirc;&AElig;&euml;
        ADC_InitStructure.ADC_NbrOfChannel = 2;        //&Euml;&sup3;&ETH;ò&frac12;&oslash;&ETH;&ETH;&sup1;&aelig;&Ocirc;ò×&ordf;&raquo;&raquo;&micro;&Auml;ADC&Iacute;¨&micro;&Agrave;&micro;&Auml;&Ecirc;&yacute;&Auml;&iquest;
        ADC_Init(ADC1, &ADC_InitStructure);        //&cedil;ù&frac34;&Yacute;ADC_InitStruct&Ouml;&ETH;&Ouml;&cedil;&para;¨&micro;&Auml;&sup2;&Icirc;&Ecirc;&yacute;&sup3;&otilde;&Ecirc;&frac14;&raquo;&macr;&Iacute;&acirc;&Eacute;èADCx&micro;&Auml;&frac14;&Auml;&acute;&aelig;&AElig;÷  
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //&Eacute;è&Ouml;&Atilde;ADC·&Ouml;&AElig;&micro;&Ograve;ò×&Oacute;6 72M/6=12,ADC×&icirc;&acute;ó&Ecirc;±&frac14;&auml;&sup2;&raquo;&Auml;&Uuml;&sup3;&not;&sup1;&yacute;14M       
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC&Iacute;¨&micro;&Agrave;,&sup2;&Eacute;&Ntilde;ù&Ecirc;±&frac14;&auml;&Icirc;&ordf;239.5&Ouml;&Uuml;&AElig;&Uacute;       
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5 );        //ADC1,ADC&Iacute;¨&micro;&Agrave;,&sup2;&Eacute;&Ntilde;ù&Ecirc;±&frac14;&auml;&Icirc;&ordf;239.5&Ouml;&Uuml;&AElig;&Uacute;       
        ADC_DMACmd(ADC1,ENABLE);
       
        ADC_Cmd(ADC1, ENABLE);        //&Ecirc;&sup1;&Auml;&Uuml;&Ouml;&cedil;&para;¨&micro;&Auml;ADC1
       
        ADC_ResetCalibration(ADC1);        //&Ecirc;&sup1;&Auml;&Uuml;&cedil;&acute;&Icirc;&raquo;&ETH;&pound;×&frac14;  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //&micro;&Egrave;&acute;&yacute;&cedil;&acute;&Icirc;&raquo;&ETH;&pound;×&frac14;&frac12;á&Ecirc;&oslash;
       
        ADC_StartCalibration(ADC1);         //&iquest;&ordf;&AElig;&ocirc;AD&ETH;&pound;×&frac14;

        while(ADC_GetCalibrationStatus(ADC1));         //&micro;&Egrave;&acute;&yacute;&ETH;&pound;×&frac14;&frac12;á&Ecirc;&oslash;

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //&Ecirc;&sup1;&Auml;&Uuml;&Ouml;&cedil;&para;¨&micro;&Auml;ADC1&micro;&Auml;&Egrave;í&frac14;&thorn;×&ordf;&raquo;&raquo;&AElig;&ocirc;&para;&macr;&sup1;&brvbar;&Auml;&Uuml;

}                                  



通道1放在Adcvalue[0]里面,通道2放在Adcvalue[1]里面
回复

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2015-11-20
在线时间
3 小时
发表于 2016-7-15 17:07:04 | 显示全部楼层
http://www.openedv.com/thread-79000-1-1.html,我也遇到这个问题,用DMA,可是不知道怎么用
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-7-15 22:28:30 | 显示全部楼层
我们例程就支持多通道啊。
回复

使用道具 举报

20

主题

83

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2016-7-14
在线时间
49 小时
 楼主| 发表于 2016-7-18 08:45:45 | 显示全部楼层
正点原子 发表于 2016-7-15 22:28
我们例程就支持多通道啊。

我学习的寄存器的写法。。不会写啊
回复

使用道具 举报

3

主题

138

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2014-5-12
在线时间
4 小时
发表于 2016-11-19 09:40:06 | 显示全部楼层
正点原子 发表于 2016-7-15 22:28
我们例程就支持多通道啊。

多通道的时候,1 2通道采集数据相互干扰了 不知为何
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2019-11-24
在线时间
4 小时
发表于 2020-1-17 20:57:10 | 显示全部楼层
正点原子 发表于 2016-7-15 22:28
我们例程就支持多通道啊。

可以给一下配置吗?
回复

使用道具 举报

37

主题

212

帖子

0

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2019-6-6
在线时间
100 小时
发表于 2020-6-5 21:42:04 | 显示全部楼层
xiaozi_sxx 发表于 2016-7-15 11:51
**** 作者被禁止或删除 内容自动屏蔽 ****

我可以看到吗
不会就要俯身倾耳以请啊,博客地址:https://blog.csdn.net/qq_39521541?spm=1001.2101.3001.5343
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 05:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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