ITPub博客

首页 > Linux操作系统 > Linux操作系统 > STM32-ADC认识

STM32-ADC认识

原创 Linux操作系统 作者:cifra_guokun 时间:2011-05-05 11:49:15 0 删除 编辑

一、ADC配置的基本步骤:

1、打开DMA和ADC1的时钟。

在RCC_Configuration()中添加:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

2、配置模拟IO输入口

在GPIO_Configuration()中配置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //ADC0 -light
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //ADC9-sound
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStructure);

3、配置DMA初始化和ADC初始化

void DMA_Configuration(void)

void ADC1_Configuration(void)

4、启动和读值处理ADC数据

启动:ADC_SoftwareStartConvCmd(ADC1, ENABLE);

等待DMA处理完成标志位:if(DMA_GetFlagStatus(DMA_FLAG_TC1)==1)

处理:

5、ADC硬件参考电压的选择:

/*****************************************************************************************************************************

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular /DMA_Mode_Normal的理解:

******************************************************************************************************************************/

void DMA_Configuration(void)
{
DMA_DeInit(DMA_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;      //定义DMA外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; // 定义DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;               //外设作为数据传输的来源(外设传到内存) DMA_DIR_PeripheralDST——内存传到外设
DMA_InitStructure.DMA_BufferSize = 3;                            //连续转化3个AD通道值
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设寄存器地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;          //内存寄存器地址递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //外设数据宽度32bit
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;    //内存数据宽度32bit
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;     //DMA模式是循环
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;       //DMA没有设置内存到内存传输
DMA_Init(DMA_Channel1, &DMA_InitStructure);

DMA_Cmd(DMA_Channel1, ENABLE);
}

/************************************************************************************************************************

       当SCAN=0时,不管是单次模式还是连续模式都只转换ADC_SQR的第一通道;而当SCAN=1时,不管是单次模式还是连续模式都转换ADC_SQR的所有通道

      如果是单次模式,调用一次ADC_SoftwareStartConvCmd(ADC1, ENABLE);执行一次。如果是连续模式,则会连续转换。

*************************************************************************************************************************/

void ADC1_Configuration(void)
{
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;// ADC1 ADC2 在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; //ENABLE-ADC多通道扫描, DISABLE-ADC单通道扫描
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // ENABLE--ADC连续转化模式 DISABLE--ADC单次转化模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //由软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据向右对齐
ADC_InitStructure.ADC_NbrOfChannel = 3; //连续转化3个AD通道值
ADC_Init(ADC1, &ADC_InitStructure);

//Enable Vrefint channel17
ADC_TempSensorVrefintCmd(ENABLE); //channel17

   // ADC1 regular channel17 configuration
ADC_RegularChannelConfig(ADC1, ADC_Channel_17, 1, ADC_SampleTime_28Cycles5); //Vref
// ADC1 regular channel0 configuration
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 2, ADC_SampleTime_28Cycles5); //light
// ADC1 regular channel9 configuration
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 3, ADC_SampleTime_28Cycles5); //sound

// ADC_RegularChannelConfig(ADC1, ADC_Channel_1,4, ADC_SampleTime_55Cycles5); //voltage

// 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));

  
}

/***********************************************************************************************************************************

***********************************************************************************************************************************/

void ADC_process_Voltage_Light_Voice(void)
{
ADC_Cmd(ADC1, ENABLE);
DMA_Cmd(DMA_Channel1, ENABLE);
   
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
// Delay(20);
    while(1)
{
      if(DMA_GetFlagStatus(DMA_FLAG_TC1)==1)
   {
        DMA_ClearFlag(DMA_FLAG_TC1); // Clear Channel 1 DMA_FLAG_TC flag
           break;
   }
   if((DMA_GetFlagStatus(DMA_FLAG_HT1)==1)||(DMA_GetFlagStatus(DMA_FLAG_TE1)==1))
   {
   DMA_ClearFlag(DMA_FLAG_HT1);
    DMA_ClearFlag(DMA_FLAG_TE1);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
   }

}
   // voltage
    adv[0] = (float)1.2*4096/(ADC_ConvertedValue[0]&0x0fff); //放大50倍
   // light
adv[1] = (float)(ADC_ConvertedValue[1]&0x0fff)*1.2/(ADC_ConvertedValue[0]&0X0FFF); //放大100倍
    // sound
    adv[2] = (float)(ADC_ConvertedValue[2]&0x0fff)*1.2/(ADC_ConvertedValue[0]&0X0FFF); //放大100倍
      
    ADC_Cmd(ADC1, DISABLE);
DMA_Cmd(DMA_Channel1, DISABLE);
                                  
Voltage = adv[0]*50;
    Light = adv[1]*100;      
    Voice = adv[2]*100;
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13771794/viewspace-694489/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-04-07

  • 博文量
    92
  • 访问量
    308059