STM32 CubeMx LL库-ADC操作

STM32 CubeMx LL库-ADC操作

硬件选型
stm32f103c8t6
USB-TTL
关于STM32的ADC介绍这里有时间再补充,直接进入代码编写。

1. CubeMx-ADC配置
STM32 CubeMx LL库-ADC操作_第1张图片
2. CubeMx-USART1配置
STM32 CubeMx LL库-ADC操作_第2张图片
3. CubeMx-RCC配置
STM32 CubeMx LL库-ADC操作_第3张图片4. 代码
a)ADC初始化配置,后面需要自行添加相关代码

void MX_ADC1_Init(void)
{

  /* USER CODE BEGIN ADC1_Init 0 */

  /* USER CODE END ADC1_Init 0 */

  LL_ADC_InitTypeDef ADC_InitStruct = {0};
  LL_ADC_CommonInitTypeDef ADC_CommonInitStruct = {0};
  LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* Peripheral clock enable */
  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOB);
  /**ADC1 GPIO Configuration
  PB0   ------> ADC1_IN8
  */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_0;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  LL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN ADC1_Init 1 */

  /* USER CODE END ADC1_Init 1 */
  /** Common config
  */
  ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
  ADC_InitStruct.SequencersScanMode = LL_ADC_SEQ_SCAN_DISABLE;
  LL_ADC_Init(ADC1, &ADC_InitStruct);
  ADC_CommonInitStruct.Multimode = LL_ADC_MULTI_INDEPENDENT;
  LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct);
  ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
  ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
  ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
  ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_CONTINUOUS;
  ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_NONE;
  LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);
  /** Configure Regular Channel
  */
  LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_8);
  LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_8, LL_ADC_SAMPLINGTIME_239CYCLES_5);
  /* USER CODE BEGIN ADC1_Init 2 */
/*以下代码不能自己生成,需要自行添加*/
//  LL_ADC_EnableIT_EOS(ADC1); //使能ADC中断
	LL_ADC_Enable(ADC1); //使能ADC
	LL_ADC_StartCalibration(ADC1);//开始校准ADC1 
	while(LL_ADC_IsCalibrationOnGoing(ADC1)); //等待ADC校准完成

  /* USER CODE END ADC1_Init 2 */
}

b)ADC初始化配置

/*设置ADC通道*/
float ADC1_GetVolValue(uint32_t ch)
{
	  uint16_t ADC_Value;
    float ADC_VolValue;
	  LL_ADC_REG_SetSequencerRanks(ADC1,LL_ADC_REG_RANK_1,ch); //设置规则序列1,设置通道
	  LL_ADC_REG_StartConversionSWStart(ADC1); //启动规则转换通道
		while(!LL_ADC_IsActiveFlag_EOS(ADC1)){};//等待转换结束	
	  ADC_Value=LL_ADC_REG_ReadConversionData12(ADC1);
    ADC_VolValue =(float)ADC_Value/4096*3.3;
    return ADC_VolValue;
}
/*计算平均值*/
float ADC_GetAverage(uint8_t time)
{
  uint8_t i;
	float ADC_Sum,	ADC_Average;
	for(i=0;i<time;i++)
	ADC_Sum=ADC_Sum+ADC1_GetVolValue(LL_ADC_CHANNEL_8);
	ADC_Average=ADC_Sum/time;
	return ADC_Average;
}

c) 串口代码

void Usart1Tran(uint8_t SendData)
{
	while(!LL_USART_IsActiveFlag_TXE(USART1)); //防止数据帧第一个字节丢失
	LL_USART_TransmitData8(USART1,SendData);
	while(!LL_USART_IsActiveFlag_TC(USART1)); //等待发送完成
}
void Usart1TrN(uint8_t * SendData, uint8_t len)
{
    uint8_t i;
	for(i=0;i<len;i++)
	{
	  Usart1Tran(SendData[i]);
	}
}

d)主函数测试

  while (1)
  {
		LL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
//		ADC_VolValue=ADC1_GetVolValue(LL_ADC_CHANNEL_8);
		ADC_Average=ADC_GetAverage(10);
//		sprintf((char *)Tr,"The value is %.2f mV\r\n",ADC_VolValue*1000);
		sprintf((char *)Tr,"%.2f\r\n",ADC_Average*1000);
		Usart1TrN(Tr,25);
		for(i=0;i<25;i++) //清空串口数据缓存
		{
		  Tr[i]=0;
		}
		LL_mDelay(10);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

5. 测试结果展示
STM32 CubeMx LL库-ADC操作_第4张图片PB0悬空时,电压大约为1600mV,给引脚脉冲低电平,信号测试效果还可以。今天的STM32 CubeMx LL库关于ADC的展示就到这里啦!!!欢迎大家指正交流!!!
STM32 CubeMx LL库-ADC操作

你可能感兴趣的:(C语言,STM32,CubeMX,c语言,stm32,嵌入式硬件,单片机)