本例单纯使用循环方式直接读取ADC通道0的采样处理结果,在串口输出电压值(单位:毫伏)。
测试时,使用电位器对3.3V进行分压,分压数据输出给通道0。

这样设计的原因是,最大分压值不会超过2V,完全符合CH582M的要求。
代码如下:
#include "CH58x_common.h"
uint16_t adcBuff[40];
volatile uint8_t adclen;
volatile uint8_t DMA_end = 0;
/*********************************************************************
* @fn DebugInit
*
* @brief 调试初始化
*
* @return none
*********************************************************************/
void DebugInit(void)
{
GPIOA_SetBits(GPIO_Pin_9);
GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
UART1_DefInit();
}
/**
* @brief 将ADC原始值转换为实际电压(mV)
* @param adc_raw: 12位ADC原始值
* @param pga_gain: 初始化时使用的增益,用于电压换算
* @return 电压值,单位mV
*/
uint32_t ADC_RawToVoltage_mV(uint16_t adc_raw, uint8_t pga_gain)
{
// CH58x的Vref ≈ 1050mV(典型值),实际应在1.035V~1.065V之间
const uint32_t VREF_MV = 1050;
// 增益换算系数 P:0dB→1,6dB→2,-6dB→1/2,-12dB→1/4
// 公式基于差分模式中间码0x800(2048)计算:
// 单端模式下,Vin = (|adc_raw - 2048| / 2048 / P) * Vref
// 此处简化为0dB增益下的正向电压换算(adc_raw通常>2048)
uint32_t voltage_mv;
if (adc_raw >= 2048) {
voltage_mv = ((uint32_t)(adc_raw - 2048) * VREF_MV) / (2048 * pga_gain);
} else {
voltage_mv = ((uint32_t)(2048 - adc_raw) * VREF_MV) / (2048 * pga_gain);
}
return voltage_mv;
}
/*********************************************************************
* @fn main
*
* @brief 主函数
*
* @return none
*********************************************************************/
int main()
{
signed short RoughCalib_Value = 0; // ADC粗调偏差值
SetSysClock(CLK_SOURCE_PLL_60MHz);
/* 配置串口调试 */
DebugInit();
/* 单通道采样:选择adc通道0做采样,对应 PA4引脚, 带数据校准功能 */
GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_Floating);
DelayMs(20); // 等待IO稳定
// 单通道采样初始化:采样频率3.2MHz,增益0dB
ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中
// 配置采样通道为通道0(对应PA4 / AIN0)
ADC_ChannelCfg(0);
while(1) {
adcBuff[0] = ADC_ExcutSingleConver() + RoughCalib_Value;
adcBuff[1] = ADC_RawToVoltage_mV(adcBuff[0], 1); // 0dB增益时 P=1
PRINT("%d \n", adcBuff[1]); // 注意:由于ADC内部偏差的存在,当采样电压在所选增益范围极限附近的时候,可能会出现数据溢出的现象
DelayMs(100);
}
}为了方便浏览数据的变化,输出结果由串口将数据绘制为曲线。

上记结果是在测试时固定了电位器一个测试点不动进行测量的,没有做滤波、屏蔽处理。从结果来看,数据的偏移不大的,几乎不变,挺好的。
我要赚赏金
