OpenEdv-开源电子网

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

ADC1配置多通道采集问题

[复制链接]

5

主题

150

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2015-12-28
在线时间
132 小时
发表于 2016-10-29 18:04:07 | 显示全部楼层 |阅读模式
5金钱
我想同时采集ADC1的通道0(PA0),通道1(PA1),通道2(PA2)
配置程序这样写的[mw_shl_code=applescript,true]void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟


        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

        //PA1 作为模拟通道输入引脚                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
        GPIO_Init(GPIOA, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //复位ADC1

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //模数转换工作在单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        //模数转换工作在单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 3;        //顺序进行规则转换的ADC通道的数目
        ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   

  
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
       
        ADC_ResetCalibration(ADC1);        //使能复位校准  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
       
        ADC_StartCalibration(ADC1);         //开启AD校准

        while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束

//        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能

}                                  
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
          //设置指定ADC的规则组通道,一个序列,采样时间
        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期                                      
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期       
        ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期       
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

        return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
}

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;
}          
[/mw_shl_code]
然后,主函数里
[mw_shl_code=applescript,true]                aa =(Get_Adc_Average(1,5))*(3.3/4096);
                bb= (Get_Adc_Average(2,5))*(3.3/4096);
          cc= (Get_Adc_Average(1,5))*(3.3/4096);
                printf("ADC1:%s,&s,%s",aa,bb,cc);[/mw_shl_code]
这样写,显示出来的电压值都是混乱的,,该怎么配置啊,就是,主函数里要怎么写,或者怎么用Get_Adc_Average这个函数把三个电压值按顺序显示出来呢?



最佳答案

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

多通道用dma,要不就别开中断,手动扫描
越努力,越优秀;越独立,越自由
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3774
金钱
3774
注册时间
2015-4-26
在线时间
766 小时
发表于 2016-10-29 18:04:08 | 显示全部楼层
多通道用dma,要不就别开中断,手动扫描
我有故事,你有酒吗
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-10-29 19:13:52 | 显示全部楼层
先调通一个通道
回复

使用道具 举报

32

主题

125

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2016-5-13
在线时间
76 小时
发表于 2016-10-30 10:29:01 | 显示全部楼层
混乱是数字不对还是串口乱码?
回复

使用道具 举报

5

主题

150

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2015-12-28
在线时间
132 小时
 楼主| 发表于 2016-10-30 13:40:01 | 显示全部楼层

一个通道,没问题,很准
越努力,越优秀;越独立,越自由
回复

使用道具 举报

5

主题

150

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2015-12-28
在线时间
132 小时
 楼主| 发表于 2016-10-30 13:42:38 | 显示全部楼层
来俩不甜的 发表于 2016-10-29 20:25
多通道用dma,要不就别开中断,手动扫描

多通道一定要用DMA么,直接采集不可以么,每个通道不是按照1234顺序来的么,,现在是每个通道采集的电压值相互有影响,
越努力,越优秀;越独立,越自由
回复

使用道具 举报

5

主题

150

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2015-12-28
在线时间
132 小时
 楼主| 发表于 2016-10-30 13:43:08 | 显示全部楼层
桂电学子 发表于 2016-10-30 10:29
混乱是数字不对还是串口乱码?

每个通道采集的相互影响
越努力,越优秀;越独立,越自由
回复

使用道具 举报

5

主题

150

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2015-12-28
在线时间
132 小时
 楼主| 发表于 2016-10-30 13:43:27 | 显示全部楼层
桂电学子 发表于 2016-10-30 10:29
混乱是数字不对还是串口乱码?

每个通道采集的相互影响
越努力,越优秀;越独立,越自由
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3774
金钱
3774
注册时间
2015-4-26
在线时间
766 小时
发表于 2016-10-30 16:51:59 | 显示全部楼层
song15032 发表于 2016-10-30 13:42
多通道一定要用DMA么,直接采集不可以么,每个通道不是按照1234顺序来的么,,现在是每个通道采集的电压 ...

一定要,ad转换的值只有一个寄存器
我有故事,你有酒吗
回复

使用道具 举报

32

主题

125

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2016-5-13
在线时间
76 小时
发表于 2016-10-30 17:25:52 | 显示全部楼层
song15032 发表于 2016-10-30 13:43
每个通道采集的相互影响

多通道需要扫描模式+DMA
回复

使用道具 举报

1

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2016-8-15
在线时间
13 小时
发表于 2016-11-11 11:03:36 | 显示全部楼层
桂电学子 发表于 2016-10-30 17:25
多通道需要扫描模式+DMA

请问 我在用ADC1的五个通道采集时,使用DMA传输到我设置的一个数组里面,在主函数发送时结果全是0(我输入的是直流电压3.3V) 这个问题是什么原因呢
回复

使用道具 举报

32

主题

125

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2016-5-13
在线时间
76 小时
发表于 2016-11-12 19:49:36 | 显示全部楼层
wys995624 发表于 2016-11-11 11:03
请问 我在用ADC1的五个通道采集时,使用DMA传输到我设置的一个数组里面,在主函数发送时结果全是0(我输 ...

你确认dma或者adc工作了吗
回复

使用道具 举报

1

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2016-8-15
在线时间
13 小时
发表于 2016-11-13 13:04:42 | 显示全部楼层
桂电学子 发表于 2016-11-12 19:49
你确认dma或者adc工作了吗

ADC是工作了的 但是 采集的值是0  我认为是DMA的原因  但是我反复检查了配置 没有发现问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-29 16:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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