在之前的NTC帖子中,我们计算ADC的数据默认供电电压或者是基准电压是稳定的,恒定不变的,这里我参考AI8051的技术手册,以内部的电压为基准,从而计算外部电压值,并用外部电位器的方式,模拟电压的变化。
一:内部电压源的测量:

ADC EPWMT:使能 PWM 实时触发 ADC 功能。
详情请参考 16 位高级 PWM 定时器章节ADC CHS[3:0]:ADC 模拟通道选择位
(注意:被选择为 ADC 输入通道的 I0 口,必须设置 PxMO/PxM1 寄存器将 I/0 口模式设置为高阻输入模式。另外如果 MCU 进入主时钟停振/省电模式后,仍需要使能 ADC 通道,则需要设置 PxIE寄存器关闭数字输入通道,以防止外部模拟输入信号忽高忽低而产生额外的功耗)
软件代码如下所示:
u16 Get_ADC12bitResult(u8 channel) //channel = 0~15
{
ADC_RES = 0;
ADC_RESL = 0;
ADC_CONTR = (ADC_CONTR & 0xf0) | channel; //设置ADC转换通道
ADC_START = 1;//启动ADC转换
_nop_();
_nop_();
_nop_();
_nop_();
while(ADC_FLAG == 0); //wait for ADC finish
ADC_FLAG = 0; //清除ADC结束标志
return (((u16)ADC_RES << 8) | ADC_RESL);
}读取通道15程序如下所示:
Bandgap = Get_ADC12bitResult(15); //读内部基准ADC, 读15通道
二:软件代码如下所示:
Get_ADC12bitResult(15); //先读一次并丢弃结果, 让内部的采样电容的电压等于输入值. Bandgap = Get_ADC12bitResult(15); //读内部基准ADC, 读15通道 Get_ADC12bitResult(3); //先读一次并丢弃结果, 让内部的采样电容的电压等于输入值. j = Get_ADC12bitResult(3); //读外部电压ADC j = (u16)((u32)j * 119 / Bandgap); //计算外部电压, Bandgap为1.19V, 测电压分辨率0.01V
三:实际测试图下所示:

ADC使用时候的注意事项:
12 位 ADC 的速度不能高于 800KHz
SMPDUTY 的值不能小于 10,建议设置为 15
CSSETUP 可使用上电默认值 0
CHOLD 可使用上电默认值1(ADCTIM 建议设置为 3FH)
多次采样取平均值。
避免高频噪声,配置适当的ADC采样时间
单片机的ADC引脚增加RC电路:
使用请串一个1K的电阻到ADC输入口, ADC输入口再并一个102~103电容到地.
我要赚赏金
