OpenEdv-开源电子网

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

STM32多通道转换问题

[复制链接]

5

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-4-9
在线时间
0 小时
发表于 2015-4-12 16:12:42 | 显示全部楼层 |阅读模式
5金钱
以下是原子哥的ADC程序源码。红色部分为我不理解的地方,问题是,这里只开通到了通道1,而为什么注释里面写的是ch0~3呢?那请问是不是通道0~3都开通了呢?他们4个通道再一次程序运行后都转换了一次?

可以通过adcx=Get_Adc_Average(ADC_CH1,10);adcx=Get_Adc_Average(ADC_CH2,10);来读多个通道的AD值?
 

//初始化ADC,这里仅以规则通道为例,默认将开启通道0~3

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);  //设分频因子72/6=12,最大不能超14M 

    //PA1作为模拟通道输入引脚

    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1; 

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入 

    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化GPIOA 

 

    ADC_DeInit(ADC1);   //复位ADC1,将外设ADC1的全部寄存器重设为缺省值 

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;  //ADC 独立模式 

    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);   //根据指定的参数初始化外设ADCx器 

    

ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 

ADC_ResetCalibration(ADC1); //开启复位校准 

   while(ADC_GetResetCalibrationStatus(ADC1));  //等待复位校准结束 

    ADC_StartCalibration(ADC1); //开启AD 校准 

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

   } 

2Get_Adc(u8 ch) 

//获得ADC 值 

   //ch:通道值 0~3 

   u16 Get_Adc(u8 ch) 

   { 

   //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间 

ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //通道

    //规则采样顺序值为1,采样时间为239.5周期 

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

//使能指定的ADC1 的软件转换启动功能 

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 

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

   } 

3Get_Adc_Average(u8 ch,u8 times)

   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; 

     } 


最佳答案

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

此例程使用的是独立转换模式, 只转换规则组1里设置的通道,那个注释有点问题,应该是通道 0~16,每次只能转换你设置的那个通道(0~16其中之一)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-4-12 16:12:43 | 显示全部楼层
此例程使用的是独立转换模式, 只转换规则组1里设置的通道,那个注释有点问题,应该是通道 0~16,每次只能转换你设置的那个通道(0~16其中之一)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 19:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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