打印
[信息]

STC12C5A60S2的AD转换程序,还能变换采样的位数,不懂,特...

[复制链接]
399|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include "SocAdc.h"


/*----------------------------
Software delay function
----------------------------*/
void Delay(uint16 n)
{
    uint16 x;
    while (n--)
    {
        x = 5000;
        while (x--){;}
    }
}

/*----------------------------
Get ADC result
----------------------------*/
uint16 GetAdcResult(uint8 ch)
{
    uint16 tmp = 0;  //无符号16位整型变量
   
    ADC_CONTR = ADC_POWER | ADC_SPEEDHH | ch | ADC_START;
    _nop_();                        //Must wait before inquiry
    _nop_();
    _nop_();
    _nop_();
    while (!(ADC_CONTR & ADC_FLAG));//Wait complete flag
    //ADC_CONTR &= ~ADC_FLAG;         //Close ADC
   
    tmp = ADC_RES;  //A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2  0000,0000
    tmp <<= 2;  //等价于  tmp = tmp<< 2   ,左移2位
    tmp |= ADC_RESL;   //等价于tmp= ADC_RESL | tmp   按位或,       A/D 转换结果低2位                                           ADCV.1 ADCV.0  0000,0000
   
    return tmp;                 //Return ADC result    ,即输出一个采样点的二进制表示值
}

/****************************************************************
  函数名:AdcInit
  参  数:
  返回值:
  描  述:ADC初始化
****************************************************************/
void AdcInit()
{
    P1M1 = 0x0f;
    P1M0 = 0x00;
    P1ASF = 0x0f;                   //Open 8 channels ADC function
   
    AUXR1 &= (~0x04);
    ADC_RES = 0;                    //Clear previous result
    ADC_RESL = 0;
    ADC_CONTR = ADC_POWER | ADC_SPEEDHH;
    Delay(2);                       //ADC power-on and delay
}

/****************************************************************
  函数名:GetAdc10bit
  参  数:ucChannel = 通道(0~7)
  返回值:
  描  述:10位采样
****************************************************************/
uint16 GetAdc10bit(uint8 ucChannel)
{
    if (ucChannel > 7) {return 0;}
   
    GetAdcResult(ucChannel);    //切换后的第1次舍去
   
    return GetAdcResult(ucChannel);
}

/****************************************************************
  函数名:GetAdc12bit
  参  数:ucChannel = 通道(0~7)
  返回值:
  描  述:12位采样
****************************************************************/
uint16 GetAdc12bit(uint8 ucChannel)
{
    uint16 sum = 0;
    uint8 i = 0;
   
    if (ucChannel > 7) {return 0;}
   
    GetAdcResult(ucChannel);    //切换后的第1次舍去
   
    for (i=0; i<4; i++)   //2^2    //10bit过采样到12bit(0~4095)
    {
        sum += GetAdcResult(ucChannel);
    }
   
    return (uint16)sum;
}

/****************************************************************
  函数名:GetAdc14bit
  参  数:ucChannel = 通道(0~7)
  返回值:
  描  述:14位采样
****************************************************************/
uint16 GetAdc14bit(uint8 ucChannel)
{
    uint16 sum = 0;
    uint8 i = 0;
   
    if (ucChannel > 7) {return 0;}
   
    GetAdcResult(ucChannel);    //切换后的第1次舍去
   
    for (i=0; i<16; i++)   //2^4     //10bit过采样到14bit(0~16383)
    {
        sum += GetAdcResult(ucChannel);
    }
   
    return (uint16)sum;
}

/****************************************************************
  函数名:GetAdc16bit
  参  数:ucChannel = 通道(0~7)
  返回值:
  描  述:16位采样
****************************************************************/
uint16 GetAdc16bit(uint8 ucChannel)
{
    uint16 sum = 0;
    uint8 i = 0;
   
    if (ucChannel > 7) {return 0;}
   
    GetAdcResult(ucChannel);    //切换后的第1次舍去
   
    for (i=0; i<64; i++)   //2^6     //10bit过采样到16bit(0~65535)
    {
        sum += GetAdcResult(ucChannel);
    }
   
    return (uint16)sum;
}

使用特权

评论回复
沙发
LcwSwust| | 2021-4-21 14:18 | 只看该作者
本帖最后由 LcwSwust 于 2021-4-21 14:21 编辑

多次采样求和,就相当于位数提高了?
曾见过这种方法,不过好像需要加入一些特定的噪声。
https://wenku.baidu.com/view/f89 ... 1ca300a7c3f643.html

使用特权

评论回复
板凳
wowu| | 2021-5-8 16:40 | 只看该作者
楼主想要问什么  题目不全

使用特权

评论回复
地板
xiaoqizi| | 2021-5-8 16:40 | 只看该作者
好像可以选12或者10的

使用特权

评论回复
5
木木guainv| | 2021-5-8 16:42 | 只看该作者
确实是一个好办法

使用特权

评论回复
6
aoyi| | 2021-5-8 16:46 | 只看该作者
是想要提高精度?

使用特权

评论回复
7
drer| | 2021-5-8 16:46 | 只看该作者
治标不治本啊

使用特权

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

本版积分规则

914

主题

2385

帖子

4

粉丝