八层楼 发表于 2025-7-10 18:36

STM32H7并行读取AD7606数据以及片内AD值不准解决办法

一、硬件
先了解一下AD7606,16位,单电源,200k采样率,8路,除了贵没有其他缺点,数据相当的稳,一个5V供电,不用运放的情况下采集电压精度可以达到1mv,非常Nice



与单片机相连



单片机



二、嵌入式软件
#include "ad7606.h"
#include "stdio.h"
#include "cmsis_os.h"

void delay_us(uint32_t delay)
{
        uint32_t i=0;
        for(i=0;i<delay;i++)
        {
                __NOP();
        }
}

void delay_ms(uint32_t delay)
{
        osDelay(delay);
}


AD7606CHDataREG ADCHData =
{

};

short adc_read_data()
{
        short temp=0,j;                
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_15))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_14))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_13))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_12))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_11))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_10))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_9))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_8))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_7))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_6))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_5))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_4))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_3))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_2))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_1))temp++;   
        temp=temp<<1;
        if( HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_0))temp++;   
        return temp;
}

void AD7606Initialization(unsigned char OverSampleRate)
{
        delay_ms(1);
        ADC_RESET_L; //初始复位管脚低电平
        switch(OverSampleRate)//采样率选择
{
                case 200:OS_NO;break;
                case 100:OS_2;break;
                case 50: OS_4;break;
                case 25: OS_8;break;
                default: OS_NO;break;
        }
        ADC_CS_H;
        ADC_CONV_H;
        ADC_RD_H;
        delay_ms(1);
}

void AD7606Reset(void)
{
                //脉冲50nS复位有效
                BYTE_SEL_L;//并行
                ADC_STBY_H;//开始工作
                ADC_RESET_H;
                delay_us(1);
                ADC_RESET_L;
                delay_us(1);
}

void AD7606ReadSample(void)
{
        uint8_t i = 0;
        short Ary16;
//开启转换
        ADC_CONV_L;
delay_us(1);       
        ADC_CONV_H;
delay_us(1);
        //当前数据状态 低电平可读取新数据 高电平可读取上次结果
        while(ADC_Busy_State)
        {

        }
        delay_us(1);
        ADC_CS_L;
        ADC_RD_L;
        delay_us(35);//35个ns
        Ary16=adc_read_data();
        ADC_RD_H;//高电平宽度为15个ns最少
        delay_us(35);//35个ns
        ADC_RD_L;
        delay_us(35);//35个ns
        Ary16=adc_read_data();
        ADC_RD_H;//高电平宽度为15个ns最少
        delay_us(35);//35个ns
        ADC_RD_L;
        delay_us(35);//35个ns
        Ary16=adc_read_data();
        ADC_RD_H;//高电平宽度为15个ns最少
        delay_us(35);//35个ns       
        ADC_RD_L;
        delay_us(35);//35个ns               
        Ary16=adc_read_data();
        ADC_RD_H;//高电平宽度为15个ns最少
        delay_us(35);//35个ns       
        ADC_RD_L;
        delay_us(35);//35个ns
        Ary16=adc_read_data();
        ADC_RD_H;//高电平宽度为15个ns最少
        delay_us(35);//35个ns
        ADC_RD_L;
        delay_us(35);//35个ns
        Ary16=adc_read_data();
        ADC_RD_H;//高电平宽度为15个ns最少
        delay_us(35);//35个ns
        ADC_RD_L;
        delay_us(35);//35个ns
        Ary16=adc_read_data();
        ADC_RD_H;//高电平宽度为15个ns最少
        delay_us(35);//35个ns       
        ADC_RD_L;
        delay_us(35);//35个ns       
        Ary16=adc_read_data();
        ADC_RD_H;ADC_CS_H;//高电平宽度为15个ns最少
        for(i=0;i<8;i++)
        {
                if(Ary16<0)
                {
                        Ary16 = 0;
                }
        }
        ADCHData.REG.AD7606_1 = ((float)Ary16/32768) * 5;
        ADCHData.REG.AD7606_2 = ((float)Ary16/32768) * 5;
        ADCHData.REG.AD7606_3 = ((float)Ary16/32768) * 5;
        ADCHData.REG.AD7606_4 = ((float)Ary16/32768) * 5;
        ADCHData.REG.AD7606_5 = ((float)Ary16/32768) * 5;
        ADCHData.REG.AD7606_6 = ((float)Ary16/32768) * 5;
        ADCHData.REG.AD7606_7 = ((float)Ary16/32768) * 5;
        ADCHData.REG.AD7606_8 = ((float)Ary16/32768) * 5;
}



#ifndef __AD7606_H__
#define __AD7606_H__

#include "gpio.h"

//ADC7606——AD采集相关参数管脚定义//
//推挽输出模式
#define    ADC_CONV_H            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);//通道转换开始
#define    ADC_CONV_L            HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
#define    ADC_RESET_H         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);//复位管脚使能
#define    ADC_RESET_L         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
#define    ADC_RD_H            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);//
#define    ADC_RD_L                HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
#define    ADC_CS_H                   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_11, GPIO_PIN_SET);////
#define    ADC_CS_L                HAL_GPIO_WritePin(GPIOC, GPIO_PIN_11, GPIO_PIN_RESET);

//工作模式选择H正常工作L休眠
#define         ADC_STBY_H                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);////
#define         ADC_STBY_L                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);////
//数据传输模式选择,
#define         BYTE_SEL_H                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);////
#define         BYTE_SEL_L                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);////

//工作模式选择H正常工作L休眠
#define         ADC_10V                                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);////
#define         ADC_5V                                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);////
//RD下降沿后读取,高电平可提供V1结果,下一个下降延
#define    ADC_FSTDATA         HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15)
//当前数据状态 低电平可读取新数据 高电平可读取上次结果
#define    ADC_Busy_State      HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_10)
//并行数据采集
#define        ADC_PDate        GPIOD->IDR&0xFFFF
//000200K 调节采样模式---推挽输出
#define    ADC_OS0_H          HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_SET);
#define    ADC_OS0_L          HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1, GPIO_PIN_RESET);
#define    ADC_OS1_H          HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_SET);
#define    ADC_OS1_L          HAL_GPIO_WritePin(GPIOE, GPIO_PIN_0, GPIO_PIN_RESET);
#define    ADC_OS2_H          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
#define    ADC_OS2_L          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
//采样率设置
#define   OS_NOADC_OS0_L;ADC_OS1_L;ADC_OS2_L;
#define   OS_2   ADC_OS0_H;ADC_OS1_L;ADC_OS2_L;
#define   OS_4   ADC_OS0_L;ADC_OS1_H;ADC_OS2_L;
#define   OS_8   ADC_OS0_H;ADC_OS1_H;ADC_OS2_L;
typedef struct
{
        struct
        {
                float    AD7606_1;      //
                float    AD7606_2;      
                float    AD7606_3;           
                float    AD7606_4;   
                float    AD7606_5;   
                float    AD7606_6;
                float    AD7606_7;
                float    AD7606_8;
                float    AD_9;
                float    AD_10;
                float    AD_11;
                float    AD_12;
                float    AD_13;
        }REG;
        struct
        {
                float    C1;      //
                float    C2;      
                float    C3;           
                float    C4;   
                float    C5;   
                float    C6;
                float    C7;
                float    C8;
                float    C9;
                float    C10;
                float    C11;
                float    C12;
                float    C13;
        }VALUE;
}AD7606CHDataREG;
extern AD7606CHDataREG ADCHData;
void AD7606Initialization(unsigned char OverSampleRate);//初始采样率定义
void AD7606ReadSample(void);//周期采样
void AD7606ReadOnceSample(void);//单次数据采集
void AD7606Reset(void);

#endif



调用代码

void sample_task(void const * argument)
{
        AD7606Reset();
        AD7606Initialization(200);
        for(;;)
{
                vTaskSuspendAll();
                AD7606ReadSample();
                get_adc_value();
                printf(":c1:%.4fv,c2:%.4fv,c3:%.4fv,c4:%.4fv,c5:%.4fv,c6:%.4fv,c7:%.4fv,c8:%.4fv,c9:%.4fv,c10:%.4fv,c11:%.4fv,c12:%.4fv\r\n",ADCHData.REG.AD7606_1,ADCHData.REG.AD7606_2,ADCHData.REG.AD7606_3,ADCHData.REG.AD7606_4,ADCHData.REG.AD7606_5,ADCHData.REG.AD7606_6,ADCHData.REG.AD7606_7,ADCHData.REG.AD7606_8,ADCHData.REG.AD_9,ADCHData.REG.AD_10,ADCHData.REG.AD_11,ADCHData.REG.AD_12);
                printf(":c1:%.4f,c2:%.4f,c3:%.4f,c4:%.4f,c5:%.4f,c6:%.4fv,c7:%.4f,c8:%.4f,c9:%.4f,c10:%.4f℃,c11:%.4f℃,c12:%.4f℃\r\n",ADCHData.VALUE.C1,ADCHData.VALUE.C2,ADCHData.VALUE.C3,ADCHData.VALUE.C4,ADCHData.VALUE.C5,ADCHData.VALUE.C6,ADCHData.VALUE.C7,ADCHData.VALUE.C8,ADCHData.VALUE.C9,ADCHData.VALUE.C10,ADCHData.VALUE.C11,ADCHData.VALUE.C12);
                xTaskResumeAll();
                osDelay(1000);
        }
}


三、STM32H7的AD采集
测试发现AD采集到的电压要远小于实际电压,H7的AD还是16位的,不能这么拉跨吧,在网上搜索了一圈,找了的解决办法,延长AD的采样时间比校正AD管用的多,Config.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;

/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file    adc.c
* @brief   This file provides code for the configuration
*          of the ADC instances.
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "adc.h"

/* USER CODE BEGIN 0 */

#include "ad7606.h"
#include "stdio.h"
#include "cmsis_os.h"

#define ADC_CONVERTED_DATA_BUFFER_SIZE   ((uint32_t)32)   /* Size of array aADCxConvertedData[] */
ALIGN_32BYTES (static uint16_t   aADCxConvertedData);
/* USER CODE END 0 */

ADC_HandleTypeDef hadc1;

/* ADC1 init function */
void MX_ADC1_Init(void)
{

/* USER CODE BEGIN ADC1_Init 0 */

/* USER CODE END ADC1_Init 0 */

ADC_MultiModeTypeDef multimode = {0};
ADC_ChannelConfTypeDef sConfig = {0};

/* USER CODE BEGIN ADC1_Init 1 */

/* USER CODE END ADC1_Init 1 */

/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
hadc1.Init.Resolution = ADC_RESOLUTION_16B;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
hadc1.Init.LowPowerAutoWait = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;
hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
hadc1.Init.OversamplingMode = DISABLE;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
    Error_Handler();
}

/** Configure the ADC multi-mode
*/
multimode.Mode = ADC_MODE_INDEPENDENT;
if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)
{
    Error_Handler();
}

/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_7;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
sConfig.OffsetSignedSaturation = DISABLE;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
        //HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET_LINEARITY,ADC_DIFFERENTIAL_ENDED);
/* USER CODE END ADC1_Init 2 */

}

void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 */

/* USER CODE END ADC1_MspInit 0 */

/** Initializes the peripherals clock
*/
    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
    PeriphClkInitStruct.PLL2.PLL2M = 4;
    PeriphClkInitStruct.PLL2.PLL2N = 8;
    PeriphClkInitStruct.PLL2.PLL2P = 1;
    PeriphClkInitStruct.PLL2.PLL2Q = 2;
    PeriphClkInitStruct.PLL2.PLL2R = 2;
    PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_3;
    PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
    PeriphClkInitStruct.PLL2.PLL2FRACN = 0;
    PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
    {
      Error_Handler();
    }

    /* ADC1 clock enable */
    __HAL_RCC_ADC12_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**ADC1 GPIO Configuration
    PA7   ------> ADC1_INP7
    PC4   ------> ADC1_INP4
    PC5   ------> ADC1_INP8
    PB0   ------> ADC1_INP9
    */
    GPIO_InitStruct.Pin = GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/* USER CODE BEGIN ADC1_MspInit 1 */

/* USER CODE END ADC1_MspInit 1 */
}
}

void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{

if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspDeInit 0 */

/* USER CODE END ADC1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_ADC12_CLK_DISABLE();

    /**ADC1 GPIO Configuration
    PA7   ------> ADC1_INP7
    PC4   ------> ADC1_INP4
    PC5   ------> ADC1_INP8
    PB0   ------> ADC1_INP9
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_7);

    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_4|GPIO_PIN_5);

    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0);

/* USER CODE BEGIN ADC1_MspDeInit 1 */

/* USER CODE END ADC1_MspDeInit 1 */
}
}

/* USER CODE BEGIN 1 */
volatile uint32_t uhADCxConvertedValue = 0;

//共33条记录
const float NCP18XH103F03RB_10k_table[]={
        195.652,
        148.171,
        113.347,
        87.559,
        68.237,
        53.650,
        42.506,
        33.892,
        27.219,
        22.021,
        14.674,
        12.081,
        10.000,
        8.315,
        6.948,
        5.834,
        4.917,
        4.161,
        3.535,
        3.014,
        2.586,
        2.228,
        1.925,
        1.669,
        1.452,
        1.268,
        1.110,
        0.974,
        0.858,
        0.758,
        0.672,
        0.596,
        0.531
};

float NCP18XH103F03RB_10k_lookup(float res)
{
        float value = -40;
        int16_t index = 0;
        int32_t decimals = 0;
        for(index = 0;index < 33;index++)
        {
                if(NCP18XH103F03RB_10k_table<res)
                {
                        break;
                }
        }
        /** temperature overflow **/
        if(index >= 32) return 1200;
        if(index == 0) return -350;
        value = value + (index*5) - ((res - NCP18XH103F03RB_10k_table)/(NCP18XH103F03RB_10k_table-NCP18XH103F03RB_10k_table))*5;
        return value;
}

float get_ntc_temp(float voltage){ //input : AD voltage (raw data). 10k/(10k+res)=ad_temp*1800/4096/1800
float res;
        /** temperature sensor no connect **/
        if(voltage < 0) return -500;
       
        //10k电阻
res = (10*3.26 - voltage * 10)/voltage;
        return NCP18XH103F03RB_10k_lookup(res);
}

uint16_t GetAdValue(uint32_t channel)
{
        uint16_t i;
        ADC_ChannelConfTypeDef sConfig;
        uhADCxConvertedValue = 0;

/* Parameter discarded because offset correction is disabled */

        sConfig.Channel = channel;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5;
sConfig.SingleDiff = ADC_SINGLE_ENDED;
sConfig.OffsetNumber = ADC_OFFSET_NONE;
sConfig.Offset = 0;
sConfig.OffsetSignedSaturation = DISABLE;
       
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
    return 0;
}


/*##-3- Start the conversion process #######################################*/
if (HAL_ADC_Start(&hadc1) != HAL_OK)
{
    /* Start Conversation Error */
    return 0;
}

/*##-4- Wait for the end of conversion #####################################*/
/*For simplicity reasons, this example is just waiting till the end of the
      conversion, but application may perform other tasks while conversion
      operation is ongoing. */
if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)
{
    /* End Of Conversion flag not set on time */
                HAL_ADC_Stop(&hadc1);
    return 0;
}
else
{
    /* ADC conversion completed */
                for(i=0;i<10;i++)
                {
                        HAL_ADC_GetValue(&hadc1);
                }
    /*##-5- Get the converted value of regular channel########################*/
                for(i=0;i<10;i++)
                {
                        uhADCxConvertedValue += HAL_ADC_GetValue(&hadc1);
                }
                uhADCxConvertedValue = uhADCxConvertedValue/10;
}
        HAL_ADC_Stop(&hadc1);
        return 1;
}

void get_adc_value(void)
{
                int16_t ret = 0;
          float value = 0,value1 = 0;
                HAL_ADC_MspDeInit(&hadc1);
          HAL_ADC_MspInit(&hadc1);
          HAL_Delay(1000);
                ret = GetAdValue(ADC_CHANNEL_8);
                if(ret==0)
                {
                        printf("adc9电压转换失败\r\n");
                }
                else
                {
                        value = (3.26/65535)*uhADCxConvertedValue;
                }
                ADCHData.REG.AD_9 = value;
                HAL_Delay(100);
                ret = GetAdValue(ADC_CHANNEL_7);
                if(ret==0)
                {
                        printf("adc10电压转换失败\r\n");
                }
                else
                {
                        value = (3.26/65535)*uhADCxConvertedValue;
                        ADCHData.VALUE.C10 =        get_ntc_temp(value);
                        ADCHData.REG.AD_10 = value;
                }
                ret = GetAdValue(ADC_CHANNEL_4);
                if(ret==0)
                {
                        printf("adc11电压转换失败\r\n");
                }
                else
                {
                        value = (3.26/65535)*uhADCxConvertedValue;
                        ADCHData.VALUE.C11 =        get_ntc_temp(value);
                        ADCHData.REG.AD_11 = value;
                }
               
                ret = GetAdValue(ADC_CHANNEL_9);
                if(ret==0)
                {
                        printf("adc12电压转换失败\r\n");
                }
                else
                {
                        value = (3.26/65535)*uhADCxConvertedValue;
                        ADCHData.VALUE.C12 =        get_ntc_temp(value);
                        ADCHData.REG.AD_12 = value;
                }
}
/* USER CODE END 1 */



AD值非常准

c10:1.7133v,c11:1.7064v,c12:1.6983v
c10:22.8853℃,c11:22.6582℃,c12:22.3859℃
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/g313105910/article/details/128384887

小小蚂蚁举千斤 发表于 2025-7-28 23:01

AD值不准解决办法非常棒
页: [1]
查看完整版本: STM32H7并行读取AD7606数据以及片内AD值不准解决办法