嵌入式实现双路adc通道转换

本程序对应的开发板为蓝桥杯嵌入式开发板stm32f103rbt6,为中型mcu。当涉及两路甚至多路adc通道时,常用的方法有两种dma方法和注入通道,本文采用后者。

adc初始化

void ADC_Config(void)
{

  ADC_InitTypeDef  ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  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_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC1, &ADC_InitStructure);

  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  /* ADC1 regular channel8 configuration */ 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);//对应pb.0
  ADC_InjectedChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_239Cycles5);
  //内部温度传感器

  
  ADC_TempSensorVrefintCmd(ENABLE);//该语句启动内部温度测量
  ADC_AutoInjectedConvCmd(ADC1,ENABLE);

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

  /* Start ADC1 calibration */
  ADC_StartCalibration(ADC1);
  /* Check the end of ADC1 calibration */
  while(ADC_GetCalibrationStatus(ADC1));

  


}

adc转换函数

常规通道转换

float Read_ADC_Conv(void)
{
  
  float ADC_Value;
  /* Start ADC1 Software Conversion */ 
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
  ADC_Value=ADC_GetConversionValue(ADC1)*3.3/0xfff;

  return ADC_Value; 


}

 

注入通道转换

float Read_ADC_InjeConv(void)
{
  
  float ADC_Value;
  /* Start ADC1 Software Conversion */ 
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_JEOC));
  ADC_Value=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
  ADC_ClearFlag(ADC1,ADC_FLAG_JEOC);

  return ADC_Value; 


}

主程序

int main(void)
{
  	float temp;
	u8 string[20];
    STM3210B_LCD_Init();
	
	SysTick_Config(SystemCoreClock/1000);
	ADC_Config();


	LCD_SetBackColor(White);
	LCD_SetTextColor(Blue);
	LCD_DisplayStringLine(Line0,"      ADC Test      ");	
	LCD_DisplayStringLine(Line1,"                    ");	
	LCD_DisplayStringLine(Line2,"  Chanel_8-PB0 V:   ");
	LCD_DisplayStringLine(Line3,"                    ");
	LCD_DisplayStringLine(Line4,"                    ");
	LCD_DisplayStringLine(Line5,"  Chanel_16    Temp:");
	LCD_DisplayStringLine(Line6,"                    ");
	LCD_DisplayStringLine(Line7,"                    ");	
	LCD_DisplayStringLine(Line8,"                    ");
	LCD_DisplayStringLine(Line9,"                    ");	
	

  while (1)
  {
  Delay_Ms(200);
  temp=Read_ADC_Conv();
  sprintf((char*)string,"%.3f",temp);
  LCD_DisplayStringLine(Line3,string);

  temp=Read_ADC_InjeConv();
  //sprintf((char*)string,"%.3f",(1430-temp*1000)/4.3+25);
  sprintf((char*)string,"%.3f",(5855.85-temp*3.3)/17.6085+25);
  
  LCD_DisplayStringLine(Line6,string);

  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

身在江湖的郭大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值