CH572ADC采集供电电压

前言:

该方法可以采集给到芯片供电引脚的电压,代码配置模式,需要配置CMP_N为CMP_VERF。

CMP_Init( cmp_sw_3, cmp_nref_level_800 );// CMP_P0(PA7),CMP_N(CMP_VERF)
 
计算公式:1023/采集值 = V供/800mv //800mv是比较器负端参考电平
可以计算出V供值,即供电电压。
image

代码:

基于peripheral例程添加ADC采集供电电压,并通过蓝牙将数据发送出来。

uint16_t adc_data[4] = {0,0,0,0};
char adc_data_str[20];
char adc_data_str1[20];

/*********************************************************************
 * @fn      ADC_8bit_Sample
 *
 * @brief   PWM模拟8位ADC采样,采样脚(PA2)采样范围(0 ~ (VDD-800)mV)
 *
 * @return  采样值,对应电压的计算公式为:(采样值*VDD/512)
 */
uint32_t ADC_8bit_Sample()
{
    uint32_t vref=0;
    uint32_t cmp_count=1;
    /* 配置GPIO */
    GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA);  // PA4 - PWM4
    PWM_16bit_CycleDisable();
    PWMX_CLKCfg(1);                                  // cycle = Fsys
    PWMX_CycleCfg(PWMX_Cycle_256);
    CMP_Init( cmp_sw_3, cmp_nref_level_800 );// CMP_P0(PA7),CMP_N(PA2)
    CMP_Enable();
    vref = 128;
    while(1)
    {
        uint8_t cmp_out=0;
        uint8_t cmp_out_1ast=0;
        PWMX_ACTOUT(CH_PWM4, vref, High_Level, ENABLE);

        DelayUs(760);
        cmp_out_1ast = CMP_ReadAPROut();
        while(1)
        {
            DelayUs(20);
            cmp_out = CMP_ReadAPROut();
            if(cmp_out == cmp_out_1ast)
            {
                break;
            }
            cmp_out_1ast = cmp_out;
        }

        if(cmp_count==128)
        {
            if (cmp_out)
            {
                return (vref*2-1);
            }
            else
            {
                return (vref*2+1);
            }
        }
        else
        {
            cmp_count<<=1;
            if (cmp_out)
            {
                vref -= 128/cmp_count;
            }
            else
            {
                vref += 128/cmp_count;
            }
        }
    }
}

uint32_t ADC_9bit_Sample()
{
    uint32_t vref=0;
    uint32_t cmp_count=1;
    /* 配置GPIO */
    GPIOA_ModeCfg(GPIO_Pin_4, GPIO_ModeOut_PP_5mA);  // PA4 - PWM4
    PWMX_CLKCfg(1);                                  // cycle = Fsys
    PWM_16bit_CycleEnable();                          // 16位宽使能
    PWMX_16bit_CycleCfg(CH_PWM4, 512);           // 16 数据宽度时的PWM时钟周期
    CMP_Init( cmp_sw_3, cmp_nref_level_800 );// CMP_P0(PA7),CMP_N(PA2)
    CMP_Enable();
    vref = 256;
    while(1)
    {
        uint8_t cmp_out=0;
        uint8_t cmp_out_1ast=0;
        PWMX_16bit_ACTOUT(CH_PWM4, vref, High_Level, ENABLE);
        DelayUs(230);
        cmp_out_1ast = CMP_ReadAPROut();
        while(1)
        {
            DelayUs(20);
            cmp_out = CMP_ReadAPROut();
            if(cmp_out == cmp_out_1ast)
            {
                break;
            }
            cmp_out_1ast = cmp_out;
        }

        if(cmp_count==256)
        {
            if (cmp_out)
            {
                return (vref*2-1);
            }
            else
            {
                return (vref*2+1);
            }
        }
        else
        {
            cmp_count<<=1;
            if (cmp_out)
            {
                vref -= 256/cmp_count;
            }
            else
            {
                vref += 256/cmp_count;
            }
        }
    }
}

if(events & ADC_CAP_EVT)    //周期采集
{
    adc_data[0] = 511*800/ADC_8bit_Sample();    //计算公式:1023/采集值 = V供/800mv //800mv是比较器负端参考电平 //此处实际采集是9bit
    adc_data[1] = 1023*800/ADC_9bit_Sample();   //此处实际采集是10bit
    PRINT ("ADC_8bit_Sample %d, %dmv\n",ADC_8bit_Sample(),adc_data[0]);
    PRINT ("ADC_9bit_Sample %d, %dmv\n",ADC_9bit_Sample(),adc_data[1]);
    tmos_start_task(Peripheral_TaskID, ADC_CAP_EVT, 800);
    return (events ^ ADC_CAP_EVT);
}

static void performPeriodicTask(void)    //蓝牙发送数据
{
    sprintf(adc_data_str, "%d", adc_data[0]);
    sprintf(adc_data_str1, "%d", adc_data[1]);
    uint8_t notiData[SIMPLEPROFILE_CHAR4_LEN] = {   adc_data_str[0],adc_data_str[1],adc_data_str[2],adc_data_str[3],',',
                                                    adc_data_str1[0],adc_data_str1[1],adc_data_str1[2],adc_data_str1[3],'/','/','/'};
    adc_data[0] = 0;
    adc_data[1] = 0;
    peripheralChar4Notify(notiData, SIMPLEPROFILE_CHAR4_LEN);
}

采集值:

image

通过char4 noti方式将采集值发送出来,如图是2477/2472mv,分别用的9bit/10bit。

可以用打印观察,但是如果供电电压较低,串口工具可能不工作,因此建议用蓝牙的方式将日志发送出来。

 

posted @ 2026-01-05 15:34  SweetTea_lllpc  阅读(24)  评论(0)    收藏  举报