OpenEdv-开源电子网

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

ADC1如何配置为其它通道,PA1电压为何为常高

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-7-24 16:29:35 | 显示全部楼层 |阅读模式
10金钱
在进行ADC试验的时候遇到两个问题找不到好的解决方法。1、历程里面用的是ADC1的通道1,也就是PA1口,我现在想要改为通道9,即PB1口,修改历程里面的GPIO配置是不够的,是否还需要配置其它寄存器,需要调用的函数是什么?
2、我用PA1进行外部电压的输入,我想要的结果是输入低电平LED0、LED1灯灭;输入高电平LED0、LED1亮。现在可以达到目的,可是我发现PA1电平在没有输入电压的情况下,是3V,也就是高电平,哪怕我在初始化的时候用GPIO_ResetBits(GPIOA,GPIO_Pin_1);将电压拉低,还是不行,程序烧录进去后,无输入还是高电平,求解?代码如下
  1. int main(void)
  2. {         
  3.     u16 adcx;
  4.         float temp;
  5.         delay_init();                     //延时函数初始化          
  6.         LED_Init();                             //LED端口初始化                        
  7.         Adc_Init();                                  //ADC初始化
  8.       
  9.         while(1)
  10.         {
  11.                 adcx=Get_Adc_Average(ADC_Channel_1,10);
  12.                 temp=(float)adcx*(3.3/4096);

  13.                 if (temp>2.5)   
  14.                         {
  15.                                 LED0=0;       
  16.                                 LED1=0;
  17.                         }       
  18.                 if (temp<2.5)  
  19.                         {
  20.                                 LED0=1;
  21.                                 LED1=1;
  22.                         }       
  23.         }
  24. }
  25. /*********************************************************/
  26. void  Adc_Init(void)
  27. {        
  28.         ADC_InitTypeDef ADC_InitStructure;
  29.         GPIO_InitTypeDef GPIO_InitStructure;

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


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

  32.         //PA1 作为模拟通道输入引脚         
  33.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  34.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
  35.         GPIO_Init(GPIOA, &GPIO_InitStructure);       
  36.         GPIO_ResetBits(GPIOA,GPIO_Pin_1);                                                

  37.         ADC_DeInit(ADC1);  //复位ADC1

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

  45.   
  46.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
  47.        
  48.         ADC_ResetCalibration(ADC1);        //使能复位校准  
  49.          
  50.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
  51.        
  52.         ADC_StartCalibration(ADC1);         //开启AD校准

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

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

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

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

  68. u16 Get_Adc_Average(u8 ch,u8 times)
  69. {
  70.         u32 temp_val=0;
  71.         u8 t;
  72.         for(t=0;t<times;t++)
  73.         {
  74.                 temp_val+=Get_Adc(ch);
  75.                 delay_ms(5);
  76.         }
  77.         return temp_val/times;
  78. }          
复制代码

0_13209045139g8x.gif

最佳答案

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

第一个问题解决了,如果想要把PA1改为PB1测试外部电压,只需要做如下改动。 而且试了下,PB1默认就是低电平,这点和PA1是不一样的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-24 16:29:36 | 显示全部楼层
第一个问题解决了,如果想要把PA1改为PB1测试外部电压,只需要做如下改动。
而且试了下,PB1默认就是低电平,这点和PA1是不一样的。
  1.         adcx=Get_Adc_Average(ADC_Channel_9,10);     //通道9座AD转换

  2.         //PB1 作为模拟通道输入引脚         
  3.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  4.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;               
  5.         GPIO_Init(GPIOB, &GPIO_InitStructure);       
复制代码
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 01:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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