打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

LiSun

打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

单片机:N76E003

/*********************************************
函数名:Adc_Configuration
功  能:ADC初始化配置
形  参:
返回值:
备  注:
作  者:薛建强
时  间:2019/06/06
**********************************************/
void Adc_Configuration(void)
{
#if Config_ADC_Inti
#if (Config_ADC_Inti_CH & 0x01) == 1
    Enable_ADC_AIN0;    // P1.7
#endif
#if ((Config_ADC_Inti_CH >> 1) & 0x01) == 1
    Enable_ADC_AIN1;    // P3.0
#endif
#if ((Config_ADC_Inti_CH >> 2) & 0x01) == 1
    Enable_ADC_AIN2;    // P0.7
#endif
#if ((Config_ADC_Inti_CH >> 3) & 0x01) == 1
    Enable_ADC_AIN3;    // P0.6
#endif
#if ((Config_ADC_Inti_CH >> 4) & 0x01) == 1
    Enable_ADC_AIN4;    // P0.5
#endif
#if ((Config_ADC_Inti_CH >> 5) & 0x01) == 1
    Enable_ADC_AIN5;    // P0.4
#endif
#if ((Config_ADC_Inti_CH >> 6) & 0x01) == 1
    Enable_ADC_AIN6;    // P0.3
#endif
#if ((Config_ADC_Inti_CH >> 7) & 0x01) == 1
    Enable_ADC_AIN7;    // P1.1
#endif
#if Config_ADC_Inti_CH != 0
    ADCCON1 |= 0x01;   //ADC 使能位  0 = ADC 转换电路关闭  1 = ADC 转换电路打开
    ADCF = 0;          //ADC标志位 1转换完毕 0空闲
#endif
#endif
}
/*********************************************
函数名:AdValue
功  能:选择指定ADC的通道,并采集10次,得出AD平均值
形  参:ch--通道
返回值:AD值
备  注:
作  者:薛建强
时  间:2019/06/06
**********************************************/
uint16_t AdValue(const uint8_t ch)
{
#if Config_ADC_Inti
    xdata uint16_t AdTemp1 = 0; //   通道CH电压值 10次和
    uint8_t i = 0;
    /*选择通道*/
    ADCCON0 &= 0XF0;                //清除
    ADCCON0 |= ch;                  //选择通道
    ADCS = 1;                       //A/D 转换软件启动位   0 = 无动作.  1 = 开始AD转换
    while (ADCF == 0);              //等待转换完毕  ADC标志位 1转换完毕 0空闲
    ADCF = 0;                       //手动清零ADC标志位,否则下次无法采集

    /*开始采集AD*/
    for (i = 0; i < 10; i++)
    {
        ADCS = 1;                   //A/D 转换软件启动位   0 = 无动作.  1 = 开始AD转换
        while (ADCF == 0);          //等待转换完毕  ADC标志位 1转换完毕 0空闲
        ADCF = 0;                   //手动清零ADC标志位,否则下次无法采集
        /*【12位ADC采集模式】
        ADC低八位(0-3bit有效)+ADC高8位
        ******* + xxxxoooo = *******oooo  */
        AdTemp1 += ((ADCRH << 4) + ADCRL);
    }
    return AdTemp1 / 10;
#else
    return 0;
#endif
}
/*********************************************
函数名:AD_to_VCC
功  能:得到当前电压
形  参:
返回值:
备  注:需要根据原理图的上下拉电阻填写本代码端部的宏定义
作  者:薛建强
时  间:2019/06/06
**********************************************/
uint16_t AD_to_VCC(void)
{
#if Config_ADC_Inti && Config_GMVCC_Inti
    xdata uint16_t VCC_out = 0;
    VCC_out = (((AdValue(Config_GMVCC_ADC_CH) * BSP_AD_Vcc / 4095) * (BSP_VCC_pull_up + BSP_VCC_pull_down) / BSP_VCC_pull_down) * 100); //采集到的电压
    /*此处因为电压不稳定,所以采取措施*/
    return VCC_out;
#else
    return 0;
#endif
}

/*********************************************
函数名:VCC_percentage
功  能:得到电压剩余电量百分比
形  参:
返回值:
备  注:该函数核心是[AD_to_VCC()],其中必填宏定义BSP_Cell_Vcc。
作  者:薛建强
时  间:2019/06/06
**********************************************/
uint8_t VCC_percentage(void)
{
#if Config_ADC_Inti && Config_GMVCC_Inti
    return (1.00 - ((BSP_Cell_Vcc - AD_to_VCC()) / (BSP_Cell_Vcc - BSP_LOW_Vcc))) * 100; //换算成百分比
#else
    return 0;
#endif
}
posted on 2022-08-13 11:01  xuejianqiang  阅读(150)  评论(0编辑  收藏  举报
打造一个通用性MCU架构,支持CX32/AT32/NRF51/NRF52等。 OS支持RTX4/RTX5/FreeRtos。 采用VsCode+GCC组合,VsCode+KEIL5,超强开发方式。 QQ群:524408033