打印

[范例教程] 笙泉【8051 1T】MA82G5D16 ADC采集内部1.4V

[复制链接]
372|1
跳转到指定楼层
楼主

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

ADC原理图如下


MA82G5D16支持笙泉的OCD ICE,可以在Keil 3,Keil 4,Keil 5环境下自由仿真。
下面网址可以下载仿真安装包:
http://www.megawin.com.tw/zh-cn/support/index/70/113

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
沙发
 楼主 | 2019-1-3 16:08 | 只看该作者
范例源代码如下


  1. #define                uCHAR        unsigned char
  2. #define                uINT        unsigned int

  3. #include <Intrins.h>
  4. #include "REG_MA82G5Dxx.H"
  5. #include "delay.H"


  6. union WTYPE
  7.   { uCHAR B[2];
  8.     uINT  W;
  9.   };

  10. float ADC_Volt;
  11. float VDD_Volt;

  12. union WTYPE ADC_Value;
  13. union WTYPE ADC_Ch0_Value;
  14. union WTYPE ADC_Ch1_Value;
  15. union WTYPE ADC_Ch2_Value;

  16. void WriteP(uCHAR PsfrAddr,uCHAR PsfrData)
  17. {
  18.                 bit bEA=EA;
  19.                 EA = 0;                                         // 关中断
  20.                 IFADRH = 0;                                 // IFADRH必须为0
  21.                 IFADRL= PsfrAddr;                        // 送P页地址;
  22.                 IFD= PsfrData;                                // 送P页内容
  23.                 IFMT = 4;                                        // 写P页
  24.                 ISPCR = 0x80;                                // 允许ISP/IAP操作
  25.                 SCMD = 0x46;
  26.                 SCMD = 0xB9;
  27.                 _nop_();
  28.                 ISPCR = 0;                                        // 清ISP/IAP特殊寄存器
  29.                 IFMT=0;
  30.                 EA = bEA;                                        // 恢复中断
  31. }
  32. void Initial_ADC(void)
  33. {
  34.         ADCON0 = (ADCEN | CHS3 | CHS2 | CHS1 | CHS0);                // ADC Channel select Int 1.4V
  35.         ADCFG0 = (ADRJ | ADCKS1 | ADCKS0);                                        // SYSCLK / 8, ADRJ=1: ADCH(------B9B8),ADCL(B7B6B5B4B3B2B1B0)
  36.         WriteP(PCON3_P,0x80);                                                                // Enable IVR 1.4V
  37.         delay_ms(10);
  38. }

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

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

  47. void main(void)
  48. {

  49.         Initial_ADC();


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

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

  54.         while(1)
  55.         {
  56.                 _nop_();
  57.         }
  58. }
复制代码
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

快速回复 返回顶部 返回列表