| 
STM32F1的ADC通道
×
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。您需要 登录 才可以下载或查看,没有账号?立即注册 
  
 
  
 
 [C] 纯文本查看 复制代码 //初始化ADC
void Adc_CPU_Temp_Init(void)  //ADC通道初始化
{
			ADC_InitTypeDef ADC_InitStructure; 
			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1	, ENABLE );	  //使能GPIOA,ADC1通道时钟
			RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //分频因子6时钟为72M/6=12MHz
			ADC_DeInit(ADC1);  //将外设 ADC1 的全部寄存器重设为缺省值
			ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1和ADC2工作在独立模式
			ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//模数转换工作在单通道模式
			ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//模数转换工作在单次转换模式
			ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;	//转换由软件而不是外部触发启动
			ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐
			ADC_InitStructure.ADC_NbrOfChannel = 1;	//顺序进行规则转换的ADC通道的数目
			ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
			ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
			ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
			ADC_ResetCalibration(ADC1);	//重置指定的ADC1的复位寄存器
			while(ADC_GetResetCalibrationStatus(ADC1));	//获取ADC1重置校准寄存器的状态,设置状态则等待
			ADC_StartCalibration(ADC1);	 //
			while(ADC_GetCalibrationStatus(ADC1));		//获取指定ADC1的校准程序,设置状态则等待
}
u16 adc_data_value(u8 ch)
{
			ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
			ADC_SoftwareStartConvCmd(ADC1,ENABLE);
			while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
			return ADC_GetConversionValue(ADC1);
}
//获取通道ch的转换值
//取size次,然后平均
u16 Get_Adc_value(u8 ch,u8 size)
{
			u32 temp=0;
			u8 t;
			for(t=0;t<size;t++)
			{
			temp+=adc_data_value(ch);
			delay_ms(1);
			}
			return temp/size;
} 
float Get_CPU_temp()//返回直接是℃温度
{
			float temp=0;
			temp+=Get_Adc_value(ADC_Channel_16,20);
			temp=(float)temp*(3.3/4096);		//电压值 
			temp=(1.43-temp)/0.0043+25;	//转换为温度值 	 
			return temp;
} 
 
 
  
 初始化ADC通道后直接调用Get_CPU_temp()即可获取CPU温度
 
 
 |