STM32L073 使用cube生成ADC多路采样错误解决


错误说明:

使用cube生成多路AD采集,非中断,非DMA模式下,软件切换通道,发现会出现只有第一路的值是正确的,后面的几路值都不对,切换通道部分代码如下:

  ADC_ChannelConfTypeDef sConfig;

  sConfig.Channel=ch;                                   
  sConfig.Rank=ADC_RANK_CHANNEL_NUMBER;   	
    
  HAL_ADC_ConfigChannel(&hadc,&sConfig);        

  HAL_ADC_Start(&hadc);                               

原因是这样切换并没有将CHSELR寄存器清掉,需改成:

  ADC_ChannelConfTypeDef sConfig;

  hadc.Instance->CHSELR = 0;
  sConfig.Channel=ch;                                   
  sConfig.Rank=ADC_RANK_CHANNEL_NUMBER;   	
    
  HAL_ADC_ConfigChannel(&hadc,&sConfig);        

  HAL_ADC_Start(&hadc); 


若有理解不对的地方,还请提出来,大家交流学习。


 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我可以为您提供关于如何在STM32Cube中配置ADC进行10次采样平均的一般步骤。具体步骤如下: 1. 打开STM32CubeMX软件,并创建一个新项目。 2. 选择您使用STM32芯片和所需的外设。然后单击“Pinout”选项卡,配置ADC引脚。 3. 在“Configuration”选项卡中,选择“Analog to Digital Converter”并启用所需的ADC通道。您可以选择使用单通道或多通道模式。 4. 在“Analog to Digital Converter”设置中,选择所需的ADC时钟和采样时间。您可以使用独立模式或双模式。 5. 在“DMA Settings”选项卡中,启用DMA传输以提高采样效率。 6. 在“Code Generation”选项卡中,选择“Generate Initialization Code”并生成代码。 7. 在生成的代码中,找到ADC初始化函数,并在其中添加以下代码以启用10次采样平均: ``` hadc.Init.NbrOfConversion = 1; // 设置单次转换次数为1 hadc.Init.ContinuousConvMode = ENABLE; // 启用连续转换模式 hadc.Init.DiscontinuousConvMode = DISABLE; // 禁用间断转换模式 hadc.Init.NbrOfDiscConversion = 0; // 间断模式转换次数为0 hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 转换由软件触发 hadc.Init.DMAContinuousRequests = ENABLE; // 启用DMA模式 hadc.Init.EOCSelection = EOC_SEQ_CONV; // 每次序列转换结束后触发中断 hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 右对齐数据 hadc.Init.ScanConvMode = ADC_SCAN_DISABLE; // 禁用扫描模式 if (HAL_ADC_Init(&hadc) != HAL_OK) { // ADC初始化失败 Error_Handler(); } // 启用ADC DMA模式 if (HAL_ADC_Start_DMA(&hadc, (uint32_t*)&ADC_buffer, 10) != HAL_OK) { // 启动DMA模式失败 Error_Handler(); } ``` 请注意,此示例代码中的ADC_buffer应该是一个足够大的数组,用于存储10次采样的结果。 8. 编写中断处理函数以处理ADC转换完成事件并计算10次平均值。以下是一个示例中断处理函数: ``` void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { // 计算10次采样平均值 uint32_t sum = 0; for (int i = 0; i < 10; i++) { sum += ADC_buffer[i]; } uint32_t average = sum / 10; // 处理平均值 // ... } ``` 这些是一般的步骤,您可以根据您的具体需求进行调整。希望对您有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值