找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1820|回复: 0
收起左侧

松翰SN8F5703单片机AD转换例程

[复制链接]
ID:856645 发表于 2020-12-8 11:16 | 显示全部楼层 |阅读模式
松翰5703例程_AD
  1. #include        <sn8f5703.h>
  2. /*********************************************************************
  3.                                                 CONST
  4. *********************************************************************/
  5. #define        AD_CHANNEL1                        0x00                        //P20 AIN0                                                                        
  6. #define        AD_CHANNEL2                        0x02                        //P22 AIN2        
  7. #define        AD_CHANNEL3                        0x0c                        //AIN12        内部vdd输入检测

  8. #define AD_SPEEDDIV16                0x00
  9. #define AD_SPEEDDIV8                0x10
  10. #define AD_SPEEDDIV1                0x20
  11. #define AD_SPEEDDIV2                0x30

  12. #define        VREF_INT                                0x00
  13. #define        VREF_EXT                                0X80        

  14. #define        VERFH_2V                                0x00
  15. #define        VERFH_3V                                0x01
  16. #define        VERFH_4V                                0x02
  17. #define        VERFH_VDD                                0x03
  18. #define        VERFH_INTVDD                0x04                        //内部vdd输入检测                                

  19. #define        ADSAMPLEMAX                        8                                        //采样8次,这个参数不用改动,防止AD值累计平均出错
  20. #define        ADSHIFT                                        3                                        //右移3次平均
  21. /*********************************************************************
  22.                                                 DATA
  23. *********************************************************************/
  24. uint16_t        ADValue1;
  25. uint16_t        ADValue2;
  26. uint16_t        ADValue3;

  27. static        uint8_t                        AD1Cnt = 0;
  28. static        uint16_t                AD1Fifo[ADSAMPLEMAX] = 0;
  29. static        uint8_t                        AD2Cnt = 0;
  30. static        uint16_t                AD2Fifo[ADSAMPLEMAX] = 0;
  31. static        uint8_t                        AD3Cnt = 0;
  32. static        uint16_t                AD3Fifo[ADSAMPLEMAX] = 0;
  33. /*********************************************************************
  34.                                                 FUNCTION
  35. *********************************************************************/
  36. void         InitAD(void);
  37. void        AD_Sample(void);
  38. static        uint16_t                 Get_AD(uint8_t        ADChannel);
  39. static        uint16_t                 ADAverge(uint16_t *ADarray);
  40. //===================================================================
  41. //                                        FUNCTION
  42. //===================================================================
  43. void main(void)
  44. {
  45.         CLKSEL = 0x06;                                                                        // Fcpu = 32M/2 = 16M
  46.         CLKCMD = 0X69;                                
  47.         CKCON = 0X10;                                                                                // From = 8M        
  48.         
  49.         WDTR = 0x5A;                    // clear watchdog
  50.         
  51.         P0 = 0;
  52.         P0M = 0;
  53.         P0UR = 0xFF;
  54.         
  55.         P1 = 0;
  56.         P1M = 0;
  57.         P1UR = 0xFF;
  58.         
  59.         P2 = 0;
  60.         P2M = 0;
  61.         P2UR = 0xFA;                                                                                // AD口需设为输入不上拉
  62.         
  63.         P2CON = 0x05;                                                                                //AD口打开,否则漏电
  64.         
  65.         InitAD();
  66.         
  67.         while(1)
  68.         {
  69.                 WDTR = 0x5A;                  // clear watchdog
  70.                
  71.                 AD_Sample();
  72.         }
  73. }
  74. //=======================================================================
  75. //        AD 初始化
  76. //=======================================================================
  77. void InitAD(void)
  78. {
  79.         ADM = 0x80;
  80.         ADM |= AD_CHANNEL1;
  81.         
  82.         ADR = 0x40;
  83.         ADR |= AD_SPEEDDIV16;
  84.         
  85.         VREFH = VREF_INT;
  86.         VREFH |= VERFH_4V;
  87.         
  88.         P1CON |= 0;                                                                                                //需禁止相应的施密特触发。
  89.         P2CON |= 0x05;
  90. }
  91. //=======================================================================
  92. //        AD 滑动滤波
  93. //=======================================================================
  94. void        AD_Sample(void)
  95. {
  96.         AD1Fifo[AD1Cnt ++] = Get_AD(AD_CHANNEL1);
  97.         if(AD1Cnt == ADSAMPLEMAX) AD1Cnt = 0;
  98.         ADValue1 = ADAverge(AD1Fifo);
  99.         

  100.         AD2Fifo[AD2Cnt ++] = Get_AD(AD_CHANNEL2);
  101.         if(AD2Cnt == ADSAMPLEMAX) AD2Cnt = 0;
  102.         ADValue2 = ADAverge(AD2Fifo);
  103.         
  104.         VREFH |= VERFH_INTVDD;
  105.         AD3Fifo[AD3Cnt ++] = Get_AD(AD_CHANNEL3);
  106.         if(AD3Cnt == ADSAMPLEMAX) AD3Cnt = 0;
  107.         ADValue3 = ADAverge(AD3Fifo);
  108.         VREFH &= (VERFH_INTVDD^0xff);
  109. }
  110. //=======================================================================
  111. //        AD 去极值平均
  112. //=======================================================================
  113. uint16_t Get_AD(uint8_t        ADChannel)
  114. {         
  115.         uint8_t i;
  116.         uint16_t AD_Max = 0;
  117.         uint16_t AD_Min = 0xffff;
  118.         uint16_t AD_Buffer = 0;
  119.         uint16_t AD_Data = 0;
  120.         
  121.         ADM &= 0xf0;
  122.         ADM |= ADChannel;
  123.         
  124.         AD_Data = 0;
  125.         for(i = 0; i < ADSAMPLEMAX + 2; i++)                                
  126.         {
  127.                 ADM |= 0x40;                                                                                        //Start ADC
  128.                 while((ADM & 0x20) != 0X20);                        //EOC
  129.                 ADM &= 0xdf;
  130.                
  131.                 AD_Buffer = ADB;
  132.                 AD_Buffer = (AD_Buffer << 4) + (ADR & 0X0F);
  133.                 AD_Data += AD_Buffer;
  134.                
  135.                 if(AD_Buffer < AD_Min)
  136.                 {
  137.                         AD_Min = AD_Buffer;
  138.                 }
  139.                 if(AD_Buffer > AD_Max)
  140.                 {
  141.                         AD_Max = AD_Buffer;
  142.                 }        
  143.         }
  144.         
  145.         AD_Data = (AD_Data - AD_Min - AD_Max) >> ADSHIFT;                                       
  146.         return        AD_Data;
  147. }
  148. //=======================================================================
  149. //        
  150. //=======================================================================
  151. uint16_t ADAverge(uint16_t *ADarray)
  152. {
  153.         uint8_t i = 0;
  154.         uint16_t Sum = 0;
  155.         
  156.         for(i = 0;i < ADSAMPLEMAX;i++)
  157.         {
  158.                 Sum += *(ADarray+i);
  159.         }
  160.         Sum = Sum >> ADSHIFT;
  161.         
  162.         return Sum;
  163. }
复制代码


5703_AD_20161103.rar

34.74 KB, 下载次数: 10, 下载积分: 黑币 -5

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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