要使用HAL库中的cyhal_adc_read()监控CYW920829M2EVK-02的VDDIO电压,无需连接外部引脚,因为PSoC 6芯片有内部通道可直接读取电源电压。以下是实现方法和示例代码:
CYHAL_ADC_INPUT_VDD_DIV_2 是专用内部通道,用于测量芯片数字电压(VDDD)。由于VDDIO与VDDD通常共享电源,这间接反映了VDDIO值。VDDIO = (ADC读数 × 参考电压) / (4095) × 2#include "cyhal.h"
#include "cybsp.h"
// ADC全局变量
cyhal_adc_t adc_obj;
cyhal_adc_channel_t adc_channel;
void init_adc(void)
{
// 初始化ADC(参数4为ADC未使用的引脚,设为NC)
cyhal_adc_init(&adc_obj, CYHAL_ADC_VREF, NULL, CYHAL_ADC_INPUT_VDD_DIV_2, NULL);
// 配置ADC内部通道
const cyhal_adc_channel_config_t channel_config = {
.enable_averaging = false, // 关闭平均滤波
.min_acquisition_ns = 1000, // 最小采样时间(纳秒)
.reference = CYHAL_ADC_REF_INT, // 内部参考电压1.2V
};
// 初始化ADC通道
cyhal_adc_channel_init(
&adc_channel,
&adc_obj,
CYHAL_ADC_INPUT_VDD_DIV_2, // 内部VDD/2通道
&channel_config
);
}
float read_vddio(void)
{
// 读取ADC原始值
int32_t raw_value = cyhal_adc_read(&adc_channel);
// 转换为电压值:VDDIO = (raw * Vref / 4095) * 2
return (float)(raw_value * 1.2 / 4095) * 2;
}
int main(void)
{
cybsp_init();
init_adc();
for (;;)
{
// 读取并打印VDDIO电压
float vddio_voltage = read_vddio();
printf("VDDIO = %.2f Vn", vddio_voltage);
cyhal_system_delay_ms(1000);
}
}CYHAL_ADC_INPUT_VDD_DIV_2直接连接到芯片电源监测电路,无需物理引脚。CYHAL_ADC_REF_INT使用内部1.2V稳压源,确保测量不受外部电压波动影响。VDDIO / 2 的电压值VDDIO = x.xx V。
⚠️ 注意:如果开发板有独立电源域(如多组VDDIO),此方法测量的是芯片核心电压(VDDD)。如需特定I/O电压,需外接分压电阻至ADC引脚并调整公式。
举报
更多回帖