ADC模数转换器

STM32F4的ADC

  • ADC介绍
    12位的一种逐次逼近型模拟数字转换器,19通道(16外部+2内部+VBAT通道),框图如下:在这里插入图片描述
  • 时序图
    在这里插入图片描述
  • ADC初始化
void bsp_InitADC(void)
{
	ADC_InitTypeDef       ADC_InitStructure;
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	DMA_InitTypeDef       DMA_InitStructure;
	GPIO_InitTypeDef      GPIO_InitStructure;
	/*使能外设时钟 */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
    /****************************************************************************   
  	PCLK2 = HCLK / 2 
  	下面选择的是2分频
  	ADCCLK = PCLK2 /8 = HCLK / 8 = 168 / 8 = 21M
    ADC采样频率Sampling Time + Conversion Time = 480 + 12 cycles = 492cyc
                   Conversion Time = 21MHz / 492cyc = 42.6ksps. 
*****************************************************************************/
/* ADC Common配置----------------------------------------------------------*/
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
 	ADC_CommonInitStructure.ADC_TwoSamplingDelay = 			 ADC_TwoSamplingDelay_5Cycles;
    ADC_CommonInit(&ADC_CommonInitStructure);
    
/* ADC1 regular channel 12 configuration **********************************/
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	ADC_InitStructure.ADC_ScanConvMode = ENABLE;
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NbrOfConversion = 4;
	ADC_Init(ADC1, &ADC_InitStructure);
   
    /* Enable ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);
 /* ADC1 regular channel18 (VBAT) configuration ****************************/
    ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1,ADC_SampleTime_480Cycles);
/* ADC1 regular channel18 (VBAT) configuration *****************************/
    ADC_RegularChannelConfig(ADC1, ADC_Channel_Vbat, 2,ADC_SampleTime_144Cycles);
    
    /* ADC1 regular channels 10, 11 configuration */ 
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 3, ADC_SampleTime_3Cycles);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 4, ADC_SampleTime_15Cycles);   

    /* Enable VBAT channel */
    ADC_VBATCmd(ENABLE); 
    
    ADC_TempSensorVrefintCmd(ENABLE); 
    /* Enable DMA request after last transfer (Single-ADC mode) */
    ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
 /* Enable ADC1 ************************************************************/
    ADC_Cmd(ADC1, ENABLE);
        /* Start ADC1 Software Conversion */
    ADC_SoftwareStartConv(ADC1);
}
  • 输出当前电压值
float GetTemp(uint16_t advalue)
{
    float Vtemp_sensor;
    float  Current_Temp;  
      
    Vtemp_sensor = advalue * 3.3f/ 4095;  				           
    Current_Temp = (Vtemp_sensor - 0.76f)/0.0025f + 25;// 温度传感器在25度的时的输出电压,典型值为0.76V.
    return Current_Temp;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值