OpenEdv-开源电子网

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

ADC模块这部分百思不得其解,明白的网友可以帮忙解答一下吗,多谢

[复制链接]

6

主题

21

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-1-27
在线时间
6 小时
发表于 2018-3-11 20:26:56 | 显示全部楼层 |阅读模式
1金钱
看完了原子哥关于ADC模块的讲解以后,一直不明白,配置模拟输入的是PA1口,然后就是一些关于ADC模块的配置和使能,那么,是哪一个步骤使得从PA1口输入的模拟信号会进入相应的ADC通道进行转化呢?
就图上所示,我把配置PA1的初始化操作都注释掉了,结果依然是,用杜邦线把PA1和3.3v连接,ADC模块还是可以将PA1的模拟输入转化为数字信号。实在费解,看不出哪里使得PA1的模拟信号会进入ADC中进行转化。
明白的朋友还望不吝赐教,多谢多谢!!!
QQ截图20180311201518.png

最佳答案

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

第一步就是。 相当于将PA1和ADC的通道连起来了。 但是,如果你不配置,默认IO是浮空输入的,也是可以做模拟输入用。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-3-11 20:26:57 | 显示全部楼层
第一步就是。 相当于将PA1和ADC的通道连起来了。 但是,如果你不配置,默认IO是浮空输入的,也是可以做模拟输入用。
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-1-27
在线时间
6 小时
 楼主| 发表于 2018-3-11 20:28:35 | 显示全部楼层
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_1;
//        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 = DISABLE;        //模数转换工作在单通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在单次转换模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的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, ch, 1, 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;
}          
回复

使用道具 举报

0

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2017-6-2
在线时间
192 小时
发表于 2018-3-12 09:12:22 | 显示全部楼层
ADC本身功能使能了,并且选通了对应通道,只要这个通道对应的IO其它功能不冲突,IO口模式正确就可以工作
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-1-27
在线时间
6 小时
 楼主| 发表于 2018-3-13 15:23:26 | 显示全部楼层
正点原子 发表于 2018-3-11 20:26
第一步就是。 相当于将PA1和ADC的通道连起来了。 但是,如果你不配置,默认IO是浮空输入的,也是可以做模拟 ...

明白,谢谢原子哥
回复

使用道具 举报

6

主题

21

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-1-27
在线时间
6 小时
 楼主| 发表于 2018-3-13 15:23:44 | 显示全部楼层
jkd405 发表于 2018-3-12 09:12
ADC本身功能使能了,并且选通了对应通道,只要这个通道对应的IO其它功能不冲突,IO口模式正确就可以工作

懂了,谢谢您
回复

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2018-3-16 18:20:45 | 显示全部楼层
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;  配置模式之后,这个引脚就跟ADC连接起来了。

ADC_RegularChannelConfig(ADC_Num, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
这一句,是选择ADC采样的通道。因为虽然引脚连接到ADC,但是ADC不一定对它采样
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 10:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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