[范例教程]

笙泉【8051 1T】MA82G5D16 ADC采集内部1.4V

[复制链接]
1704|1
手机看帖
扫描二维码
随时随地手机跟帖
KobeLai|  楼主 | 2019-1-3 16:06 | 显示全部楼层 |阅读模式

使用ADC采集内部1.4V可以侦测VDD电压的变化。步骤如下
一:使能MA82G5D16内部1.4V模块。
二:使能ADC转换模块且ADC采集通道设置为内部1.4V。
三:启动采集内部1.4V。
四:采集到的内部1.4V值反算出VDD的实际值。

ADC原理图如下
Catch.jpg

MA82G5D16支持笙泉的OCD ICE,可以在Keil 3,Keil 4,Keil 5环境下自由仿真。
下面网址可以下载仿真安装包:
http://www.megawin.com.tw/zh-cn/support/index/70/113
KobeLai|  楼主 | 2019-1-3 16:08 | 显示全部楼层
范例源代码如下


#define                uCHAR        unsigned char
#define                uINT        unsigned int

#include <Intrins.h>
#include "REG_MA82G5Dxx.H"
#include "delay.H"


union WTYPE
  { uCHAR B[2];
    uINT  W;
  };

float ADC_Volt;
float VDD_Volt;

union WTYPE ADC_Value;
union WTYPE ADC_Ch0_Value;
union WTYPE ADC_Ch1_Value;
union WTYPE ADC_Ch2_Value;

void WriteP(uCHAR PsfrAddr,uCHAR PsfrData)
{
                bit bEA=EA;
                EA = 0;                                         // 关中断
                IFADRH = 0;                                 // IFADRH必须为0
                IFADRL= PsfrAddr;                        // 送P页地址;
                IFD= PsfrData;                                // 送P页内容
                IFMT = 4;                                        // 写P页
                ISPCR = 0x80;                                // 允许ISP/IAP操作
                SCMD = 0x46;
                SCMD = 0xB9;
                _nop_();
                ISPCR = 0;                                        // 清ISP/IAP特殊寄存器
                IFMT=0;
                EA = bEA;                                        // 恢复中断
}
void Initial_ADC(void)
{
        ADCON0 = (ADCEN | CHS3 | CHS2 | CHS1 | CHS0);                // ADC Channel select Int 1.4V
        ADCFG0 = (ADRJ | ADCKS1 | ADCKS0);                                        // SYSCLK / 8, ADRJ=1: ADCH(------B9B8),ADCL(B7B6B5B4B3B2B1B0)
        WriteP(PCON3_P,0x80);                                                                // Enable IVR 1.4V
        delay_ms(10);
}

void ADC_Start(void)
{
        ADCON0 |= 0x08;                                                                                //start AD conversion
        while(!(ADCON0 & 0x10));                                                        //wait AD conversion finish
        ADCON0 &= 0xEF;                                                                                //Clear ADC interrupt flag

        ADC_Value.B[0] = ADCDH;                                                                //get ADC value
        ADC_Value.B[1] = ADCDL;
}

void main(void)
{

        Initial_ADC();


        ADC_Start();
        ADC_Ch0_Value.W = ADC_Value.W;

        VDD_Volt = 1.4*1023 / ADC_Ch0_Value.W;                                // 使用通道 Int 1.4V的ADC值,计算出VDD的电压值
        ADC_Volt = VDD_Volt / 1023 * ADC_Value.W;

        while(1)
        {
                _nop_();
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

1

粉丝