单片机: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
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了