这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 学习AI8051开发板例程:11AI8051的内部基准电压为基准读取外部的电压值

共1条 1/1 1 跳转至

学习AI8051开发板例程:11AI8051的内部基准电压为基准读取外部的电压值

高工
2025-12-05 20:11:03     打赏

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

    一:内部电压源的测量:

11-1.png

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

三:实际测试图下所示:

11-2.png

ADC使用时候的注意事项:

12 位 ADC 的速度不能高于 800KHz

SMPDUTY 的值不能小于 10,建议设置为 15

CSSETUP 可使用上电默认值 0

CHOLD 可使用上电默认值1(ADCTIM 建议设置为 3FH)

多次采样取平均值。

避免高频噪声,配置适当的ADC采样时间

单片机的ADC引脚增加RC电路:

使用请串一个1K的电阻到ADC输入口, ADC输入口再并一个102~103电容到地.




关键词: AI8051     内部     基准    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]