蓝牙技术
直播中

北冥有熊

9年用户 993经验值
擅长:131594
私信 关注
[问答]

如何使用HAL ADCREAD读取VDDIO?

你好我正在使用CYW920829M2EVK-02,并想使用 HAL ADCREAD 监控 VDDIO(DC 输入)。

我想我的问题是我应该读取哪个 PIN 码?
这是我正在处理的示例代码。
```c
/******************************************************** **********************************
* 头文件
****************************************************** ******************************/
#如果定义(CY_USING_HAL)
#包括“cyhal.h”
#include"rtc.h"#include"rtc.h"
/******************************************************** ******************************
* 宏
****************************************************** ******************************/

/******************************************************** **********************************
* 全局变量
****************************************************** ******************************/

/******************************************************** **********************************
* 函数原型
****************************************************** ******************************/

/******************************************************************************* xml-ph-0000@deepl.internal
* Function Definitions xml-ph-0001@deepl.internal
*******************************************************************************/
/*******************************************************************************
* 函数名称:main
*********************************************************************************
* 摘要:
* 这是 CPU 的主函数。
它...
* 1.
* 2.
*
* 参数:
* void
*
* 返回:
* int
* *******************************************************************************/
int main(void)
{
cy_rslt_t result;
#如果定义(CY_DEVICE_SECURE)&& 定义(CY_USING_HAL)
cyhal_wdt_t wdt_obj;
/* 清除看门狗定时器,使其不会触发重置 */
result = cyhal_wdt_init(&wdt_obj, cyhal_wdt_get_max_timeout_ms());
CY_ASSERT(CY_RSLT_SUCCESS == result);
cyhal_wdt_free(&wdt_obj);
#endif
/* 初始化设备和电路板外设 */
result = cybsp_init();
cy_retarget_io_init(CYBSP_DEBUG_UART_TX,CYBSP_DEBUG_UART_RX,
CY_RETARGET_IO_波特率);
printf("结果!!");
/* 电路板启动失败。 停止程序执行 */
if (result != CY_RSLT_SUCCESS)
{
CY_ASSERT(0);
}
/* 启用全局中断 */
__enable_irq();
// ADC 块和通道对象
cyhal_adc_t adc_obj;
cyhal_adc_channel_t adc_chan_0_obj;
// ADC转换结果
int adc_out;
// 初始化 ADC 模块
cyhal_adc_init(&adc_obj,CYHAL_ADC_REF_VDDA,NULL);
/* ADC配置结构 */
const cyhal_adc_config_t ADC配置 = {
.continuous_scanning = false,
.resolution = 12,
.average_count = 1,
.average_mode_flags = 0,
.ext_vref_mv = 0,
.vneg = CYHAL_ADC_VNEG_VREF,
.vref = CYHAL_ADC_REF_VDDA,
.ext_vref = NC,
.is_bypassed = false,
.bypass_pin = NC
} ;
/* 配置 ADC */
cyhal_adc_configure(&adc_obj,&ADCconfig);
/* ADC通道配置结构*/
const cyhal_adc_channel_config_t 通道配置 = {
.enable_averaging = false,
.min_acquisition_ns = 220,
.enabled = true } ;
/* 初始化 ADC 通道 0 */
cyhal_adc_channel_init_diff(&adc_chan_0_obj,&adc_obj,CYHAL_ADC_REF_VDDA,CYHAL_ADC_VNEG,&channel_config);
/* 读取相应 ADC 通道的 ADC 转换结果。 */
adc_out = cyhal_adc_read_uv(&adc_chan_0_obj);

为了 (;;)
{
printf("电压:%dn",adc_out);
cyhal_系统_延迟_ms(1000);
}
}
/* [] END OF FILE */
CYW920721B2EVK-02

回帖(1)

张娟

2025-7-3 18:16:49

要使用HAL库中的cyhal_adc_read()监控CYW920829M2EVK-02的VDDIO电压,无需连接外部引脚,因为PSoC 6芯片有内部通道可直接读取电源电压。以下是实现方法和示例代码:


关键点



  1. 使用内部通道CYHAL_ADC_INPUT_VDD_DIV_2 是专用内部通道,用于测量芯片数字电压(VDDD)。由于VDDIO与VDDD通常共享电源,这间接反映了VDDIO值。

  2. 计算公式

    VDDIO = (ADC读数 × 参考电压) / (4095) × 2

    (ADC为12位精度,参考电压常用1.2V)


完整代码


#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);
    }
}

说明



  1. 内部通道CYHAL_ADC_INPUT_VDD_DIV_2直接连接到芯片电源监测电路,无需物理引脚。

  2. 参考电压CYHAL_ADC_REF_INT使用内部1.2V稳压源,确保测量不受外部电压波动影响。

  3. 计算原理

    • ADC测量范围:0-4095(12位)

    • 内部通道返回 VDDIO / 2 的电压值

    • 需将读数乘以2获得真实VDDIO



验证步骤



  1. 将上述代码集成到项目中。

  2. 通过UART(如KitProg)查看输出,显示格式:VDDIO = x.xx V

  3. 用万用表测量开发板VDDIO输入引脚(如J1连接器),验证读数是否匹配。



⚠️ 注意:如果开发板有独立电源域(如多组VDDIO),此方法测量的是芯片核心电压(VDDD)。如需特定I/O电压,需外接分压电阻至ADC引脚并调整公式。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分