打印

AD采集怎么读不出正确的电压值

[复制链接]
4661|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sdenff|  楼主 | 2012-9-19 16:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void RCC_Configuration(void)
{
  ErrorStatus HSEStartUpStatus;
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();
  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);
  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus == SUCCESS)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
   
  //这里是模块时钟,需要使用的
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE); //复用功能
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
}

void GPIO_Configuration(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;

  //PA0 作为模拟通道输入引脚                        
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;  //模拟输入引脚
     GPIO_Init(GPIOA, &GPIO_InitStructure);
     ADC_Configuration();
}

void ADC_Configuration(void)
{
  ADC_InitTypeDef ADC_InitStructure;
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 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 = 1; // 顺序进行规则转换的ADC通道的数目 1 ;
  ADC_Init(ADC1, &ADC_InitStructure);
  // 设置指定ADC的规则组通道1,设置它们的转化顺序和采样时间为55.5周期 ;
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_SampleTime_239Cycles5);
  //ADC_DMACmd(ADC1, ENABLE); // 使能指定的ADC的DMA请求 ;  
  ADC_Cmd(ADC1, ENABLE); // 使能指定的ADC ;  
  ADC_ResetCalibration(ADC1); // 重置指定的ADC的校准寄存器 ;
  while(ADC_GetResetCalibrationStatus(ADC1)); // 获取ADC重置校准寄存器的状态 ;
  ADC_StartCalibration(ADC1); // 开始指定ADC的校准程序 ;  
  while(ADC_GetCalibrationStatus(ADC1)); // 获取指定ADC的校准状态 ;
  ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能指定的ADC的软件转换启动功能 ;
}

int  main (void)
{
   float ADValue = 0.00;
   u32 delayTime = 0;
   RCC_Configuration();   
   NVIC_Configuration();
   GPIO_Configuration();  
   
   while(1){           
  if(delayTime++ >=2000000)
        {
            delayTime = 0;
   ADValue = 3.3*ADC_GetConversionValue(ADC1)/4095;
            printf("\r\n ADValue = %.2fv",ADValue);   
        }
   }
}

帮忙看看,基本上是PA0读出的值一直不变,也不正确,哪儿问题,急?
沙发
IJK| | 2012-9-19 17:42 | 只看该作者
PA0 作为模拟通道输入引脚  是对应 ADC1, ADC_Channel_0 吗?

使用特权

评论回复
板凳
IJK| | 2012-9-19 17:42 | 只看该作者
另外,用的是哪款STM32?

使用特权

评论回复
地板
airwill| | 2012-9-19 19:42 | 只看该作者
最好用调速器验证一下 GPIO 的设置. 把端点设置到 ADC 开始或结束的地方
用万用表检查一下输入电压的情况

使用特权

评论回复
5
sdenff|  楼主 | 2012-9-20 08:24 | 只看该作者
用的STM32F103RCT,另外量过电压,相差太大,肯定读的不是端口的电压

使用特权

评论回复
6
sdenff|  楼主 | 2012-9-20 08:26 | 只看该作者
用的STM32F103RCT,另外量过电压,相差太大,肯定读的不是端口的电压

使用特权

评论回复
7
sdenff|  楼主 | 2012-9-20 08:26 | 只看该作者
用的STM32F103RCT,另外量过电压,相差太大,肯定读的不是端口的电压

使用特权

评论回复
8
IJK| | 2012-9-20 10:28 | 只看该作者
基本上是PA0读出的值一直不变。
读出的值是多少? 在什么范围变化?

PA0上的电压是几伏?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

52

帖子

0

粉丝