bsp_adc换了新的

This commit is contained in:
stark1898y 2024-12-15 15:37:05 +08:00
parent 0752338f1e
commit aa74f64e75
2 changed files with 27 additions and 17 deletions

View File

@ -12,7 +12,7 @@
#define __BSP_ADC_H__ #define __BSP_ADC_H__
#include "CH59x_common.h" #include "CONFIG.h"
void BSP_ADC_Init(void); void BSP_ADC_Init(void);

View File

@ -1,5 +1,14 @@
#include "bsp_adc.h" #include "bsp_adc.h"
#include "bsp_uart.h"
#include "log.h"
#undef LOG_ENABLE
#define LOG_ENABLE 1
#undef LOG_TAG
#define LOG_TAG "adc"
// https://www.cnblogs.com/gscw/p/17682385.html // https://www.cnblogs.com/gscw/p/17682385.html
// 计算公式参考手册,建议使用 “建议实际可用测量电压范围” 作为 ADC 采集的增益选择判断标准。计算公式参考手册。 // 计算公式参考手册,建议使用 “建议实际可用测量电压范围” 作为 ADC 采集的增益选择判断标准。计算公式参考手册。
// 仅使用 ADC 功能,同时降低功耗,可以将引脚的数字输入功能关闭,配置 R16_PIN_ANALOG_IE。 注如果引脚用于模拟功能ADC/TouchKey建议将该引脚的数字输入功能关闭即设置数字输入禁用从而可以降低功耗并有利于减少干扰。 // 仅使用 ADC 功能,同时降低功耗,可以将引脚的数字输入功能关闭,配置 R16_PIN_ANALOG_IE。 注如果引脚用于模拟功能ADC/TouchKey建议将该引脚的数字输入功能关闭即设置数字输入禁用从而可以降低功耗并有利于减少干扰。
@ -23,7 +32,7 @@ void BSP_ADC_Init(void)
#if 0 #if 0
// ±10C没啥参考价值 // ±10C没啥参考价值
/* 温度采样并输出 */ /* 温度采样并输出 */
PRINT("\n1.Temperature sampling...\n"); logDebug("\n1.Temperature sampling...\n");
ADC_InterTSSampInit(); ADC_InterTSSampInit();
for (i = 0; i < 20; i++) for (i = 0; i < 20; i++)
{ {
@ -33,7 +42,7 @@ void BSP_ADC_Init(void)
{ {
uint32_t C25 = 0; uint32_t C25 = 0;
C25 = (*((PUINT32)ROM_CFG_TMP_25C)); C25 = (*((PUINT32)ROM_CFG_TMP_25C));
PRINT("%d %d %d \n", adc_to_temperature_celsius(adcBuff[i]), adcBuff[i], C25); logDebug("%d %d %d \n", adc_to_temperature_celsius(adcBuff[i]), adcBuff[i], C25);
} }
#endif #endif
@ -56,11 +65,12 @@ void BSP_ADC_Init(void)
min_number = ((min_number > adcBuff[i]) ? adcBuff[i] : min_number); // 软件滤波 min_number = ((min_number > adcBuff[i]) ? adcBuff[i] : min_number); // 软件滤波
max_number = ((max_number < adcBuff[i]) ? adcBuff[i] : max_number); max_number = ((max_number < adcBuff[i]) ? adcBuff[i] : max_number);
} }
printf("min_number = %d, max_number = %d\n", min_number, max_number); logDebug("min_number = %d, max_number = %d", min_number, max_number);
CountBat = (CountBat - min_number - max_number) / 18; // 删除最小与最大值 CountBat = (CountBat - min_number - max_number) / 18; // 删除最小与最大值
printf("AverageCountBat = %d\n", CountBat); logDebug("AverageCountBat = %d", CountBat);
#endif #endif
#if 0
// 默认情况下ADC 引脚和所在 GPIO 引脚的数字功能是同时存在的 // 默认情况下ADC 引脚和所在 GPIO 引脚的数字功能是同时存在的
// ,在进行 ADC 测量时候,需要吧 GPIO 设置为高阻输入 // ,在进行 ADC 测量时候,需要吧 GPIO 设置为高阻输入
// ,当 ADC 的电平处于中间态的时候,这时候往往会导致数字部分漏电 // ,当 ADC 的电平处于中间态的时候,这时候往往会导致数字部分漏电
@ -75,12 +85,12 @@ void BSP_ADC_Init(void)
ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0); ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差记录到全局变量 RoughCalib_Value中 RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差记录到全局变量 RoughCalib_Value中
PRINT("RoughCalib_Value =%d \n", RoughCalib_Value); logDebug("RoughCalib_Value =%d", RoughCalib_Value);
// 刚上电,要给电容充电 // 刚上电,要给电容充电
DelayMs(300); DelayMs(300);
printf("PA13:::::\n"); logDebug("PA13:::::");
ADC_ChannelCfg(3); ADC_ChannelCfg(3);
for (i = 0; i < 20; i++) for (i = 0; i < 20; i++)
@ -88,12 +98,9 @@ void BSP_ADC_Init(void)
adcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次 adcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次
// DelayMs(5); // DelayMs(5);
} }
printf("original: "); logDebug("original: ");
for (i = 0; i < 20; i++) logHexDumpAll(adcBuff, 20);
{ // 注意由于ADC内部偏差的存在当采样电压在所选增益范围极限附近的时候可能会出现数据溢出的现象
PRINT("%d ", adcBuff[i]); // 注意由于ADC内部偏差的存在当采样电压在所选增益范围极限附近的时候可能会出现数据溢出的现象
}
printf("\n");
for (i = 0; i < 20; i++) for (i = 0; i < 20; i++)
{ {
@ -106,9 +113,9 @@ void BSP_ADC_Init(void)
min_number = ((min_number > adcBuff[i]) ? adcBuff[i] : min_number); // 软件滤波 min_number = ((min_number > adcBuff[i]) ? adcBuff[i] : min_number); // 软件滤波
max_number = ((max_number < adcBuff[i]) ? adcBuff[i] : max_number); max_number = ((max_number < adcBuff[i]) ? adcBuff[i] : max_number);
} }
printf("min=%d, max=%d, diff=%d\n", min_number, max_number, (max_number - min_number)); logDebug("min=%d, max=%d, diff=%d", min_number, max_number, (max_number - min_number));
countadc = (countadc - min_number - max_number) / 18; // 删除最小与最大值 countadc = (countadc - min_number - max_number) / 18; // 删除最小与最大值
printf("countaveradc = %d\n", countadc); logDebug("countaveradc = %d", countadc);
/* /*
int16_t adc_raw; int16_t adc_raw;
adc_raw = ADC_ExcutSingleConver() + RoughCalib_Value; adc_raw = ADC_ExcutSingleConver() + RoughCalib_Value;
@ -122,6 +129,9 @@ void BSP_ADC_Init(void)
voltage_mv = adc_raw*1050/4096 + (1050/2); voltage_mv = adc_raw*1050/4096 + (1050/2);
*/ */
voltage = (double)(countadc) / 2048 * 1.05; voltage = (double)(countadc) / 2048 * 1.05;
printf("voltage=%1.3lf V\n", voltage); logDebug("voltage=%1.3lf V", voltage);
PRINT("VIN: %1.3lf V\n", voltage * 2); logDebug("VIN: %1.3lf V", voltage * 2);
#endif
} }