打印
[STM32F1]

ADC采集3.3V的电压时怎么显示只有2.2V

[复制链接]
1945|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小老千|  楼主 | 2017-1-13 12:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用F103RCT6的板子采集3.3V电压,但是显示出来只有2.2V左右,是怎么回事本人小白,求教各位大大
  
#define ADC1_DR_Address    ((u32)0x4001244C)       

__IO u32 ADC_ConvertedValue;  

#define  N   50            

u32  AD_Value[N];     
u32  After_filter;   

void ADC1_GPIO_Config(void)
{ GPIO_InitTypeDef GPIO_InitStructure;   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);          
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                  
  GPIO_Init(GPIOA, &GPIO_InitStructure);   
}

void ADC1_Mode_Config(void)
{
  DMA_InitTypeDef DMA_InitStructure;
  ADC_InitTypeDef ADC_InitStructure;       
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        /* DMA channel1 configuration */
  DMA_DeInit(DMA1_Channel1);  
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;       
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = N;       
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
  /* Enable DMA channel1 */
  DMA_Cmd(DMA1_Channel1, ENABLE);  

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);       
     
  /* ADC1 configuration */
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;  

  /* ADC1 regular channel11 configuration */
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);

  /* Enable ADC1 DMA */
  ADC_DMACmd(ADC1, ENABLE);       
  
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);

  /* Enable ADC1 reset calibaration register */   
  ADC_ResetCalibration(ADC1);
  /* Check the end of ADC1 reset calibration register */
  while(ADC_GetResetCalibrationStatus(ADC1));

  /* Start ADC1 calibaration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));
     
  /* Start ADC1 Software Conversion */
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

void ADC1_Init(void)
{
        ADC1_GPIO_Config();
        ADC1_Mode_Config();
}


void filter(void)
{
          u32  sum = 0;

        u8  count;   

         for ( count=0;count<N;count++)

          {       
           sum += AD_Value[count];
          }

          After_filter=sum/N;

          sum=0;
      }

沙发
frognidie| | 2017-1-13 14:14 | 只看该作者
没看到怎么把AD值和电压值对应起来

使用特权

评论回复
板凳
小老千|  楼主 | 2017-1-13 15:58 | 只看该作者
frognidie 发表于 2017-1-13 14:14
没看到怎么把AD值和电压值对应起来

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;
我DMA传输的数据直接存在了AD_Value这个数组里

使用特权

评论回复
地板
mmuuss586| | 2017-1-13 16:13 | 只看该作者
这段程序看了下没问题啊;

换算有问题吧;

使用特权

评论回复
5
xmshao| | 2017-1-13 16:40 | 只看该作者
先确认下芯片的电源、ADC模块的参考电源是否接好以及参考电压值是多少?

使用特权

评论回复
6
玄德| | 2017-1-14 11:20 | 只看该作者

仿真器,直接观察AD值,手工计算,
如果错误,说明前面AD部分、DMA部分有问题,
如果正确,说明之前没问题,问题在后面处理和显示,


使用特权

评论回复
7
dsyq| | 2017-1-14 11:44 | 只看该作者
你确信你要ADC的电压是3.3V?因为运放在饱和区电压上不去,你以为传感器信号经过运放后是3.3,实际在2.多。

使用特权

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

本版积分规则

3

主题

4

帖子

0

粉丝