stm32 adc配置 hal库 异步采样 不同时候开启单个adc的不同通道的采样方法(代码版)

stm32 adc配置 hal库(代码版)


需要使用stm32的一个adc,根据不同模式采集,开启不同的通道。

单片机:stm32c8t6
stm32cubemx:
其他操作不变,adc就勾选引脚和选择转换周期

在这里插入图片描述
在这里插入图片描述
这是自动生成的代码
可以看到,很多都时和stm32cubemx上的配置一样的,我们可以通过直接写改这里,来完成代码的配置。

void MX_ADC1_Init(void)
{
    ADC_ChannelConfTypeDef sConfig = {0};

    /** Common config
    */
    hadc1.Instance = ADC1;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    if (HAL_ADC_Init(&hadc1) != HAL_OK)
    {
        Error_Handler();
    }
    /** Configure Regular Channel
    */
    sConfig.Channel = ADC_CHANNEL_0;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }

}

其中这个
HAL_ADC_ConfigChannel(&hadc1, &sConfig),第一个的参数通过代码可知是,配置adc的工作模式,而且是全局变量。
第二个参数,则是
通道编号,
排序,
采样时间

typedef struct 
{
  uint32_t Channel;                
  uint32_t Rank;                  
  uint32_t SamplingTime;          
}ADC_ChannelConfTypeDef;

因为我们只一次只使用单通道,所以排序保持1就好。
采样时间根据实际需求改,理论上越高越精准。
所以要修改的就是这个通道了

一下是我写好的代码
参数为通道编号

adc_Value=Get_adc_value(ADC_CHANNEL_0);//可以改通道编号
uint16_t Get_adc_value(uint32_t ch)
{
uint16_t adc_Value=0;//out电压
ADC_ChannelConfTypeDef sConfig = {0};

 sConfig.Channel = ch;
    sConfig.Rank = ADC_REGULAR_RANK_1;
    sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    {
        Error_Handler();
    }
 HAL_ADC_Start(&hadc1);
    if(HAL_OK==HAL_ADC_PollForConversion(&hadc1,10))
       {
         HAL_ADC_Stop(&hadc1);
         adc_Value=HAL_ADC_GetValue(&hadc1);
	 }
      adc_Value=adc_Value*3300/4096;//采集到的out电压  mv		
     return adc_Value;
}

顺带一提,看到这里,应该可以发现不止可以修改通道,adc的具体工作模式也可以修改,即在hadc1.init中的参数中修改。
参数:
数据对齐方式
扫描模式
连续转化模式
需要转化的通道数
转换序列是否按完整序列/不连续序列(如果启用连续模式,则放弃此参数设置。)
细分常规组的主序列(参数NbrOfConversion)的不连续转换数。(细如果参数“DiscontinuousConvMode”被禁用,则丢弃此参数。)
选择用于触发常规组转换开始的外部事件。(软件或者外部触发)

typedef struct
{
  uint32_t DataAlign; 
  uint32_t ScanConvMode;   
  FunctionalState ContinuousConvMode;       
  uint32_t NbrOfConversion;                
  FunctionalState  DiscontinuousConvMode;   
  uint32_t NbrOfDiscConversion;           
  uint32_t ExternalTrigConv;               
}ADC_InitTypeDef;

配置这些就可以完成在stm32cubemx中做到的配置

2021.4.10

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值