ADS1247温度转换的问题

2019-03-24 08:25发布

本帖最后由 曹世鹏 于 2015-5-18 18:03 编辑

最近在做用STM32F103的SPI总线和TI的ADS1247通信读取三线制的PT100的温度值,要求精度为0.5摄氏度。
现在遇到了一些问题。不知道该怎么处理。下面我就把问题总结一下。希望能在论坛里帮我解决一下。谢谢大家。
事情是这样的,我也想好了方案。就是用恒流源设置一个电流流过PT100,然后测PT100两端的电压,从而得出电阻值,然后对应PT100的电阻温度表格就能得出温度值了。但是因为不能让PT100流经的电流过大,因为那样会发热,影响实际的温度值。而且电阻变化范围很窄,最低是18.5欧姆,最高是390.48欧姆。这是PT100的整个量程,就是-200摄氏度到850摄氏度。实际上我们用到的范围很窄,就是-40到100摄氏度之间变化,对应的电阻变化就是84欧姆到138欧姆之间。如果流经1mA的话,那么电压变化范围就是0.084V-0.138V之间变化。这么小的变化范围,必须用运放将电压放大的,不然检测到的范围太窄了。那么本来我是想用运放自己搭一个的。后来发现自己的水平有限,放弃了。
然后在TI的官网上查看看有没有对应的芯片。嗯,查到了就是现在正在调试的ADS1247。它是SPI总线的。精度也很高。自带恒流源和放大器。正好适合我的需求。而且看了下还有Demo板。原理图什么的。
Demo板 Demo板
然后我就照着它的原理图画了一版板子。板子回来前就开始写程序。发现了一个问题。我在TI给的这个datasheet上面没有找到如何计算电阻值或者直接计算温度值的例子。我把我在这上面整理的资料压缩成一个文件共大家下载。这是我找到的唯一感觉是这个计算公式的东西。
计算公式 计算公式
其中我在这二个公式里代入了一个值,也就是当0摄氏度的时候,PT100的电阻值是100欧。这两个等式的两边都是成立的。即RTD(T)=100欧姆,T=0℃
但是我将别的值代入的时候就不对了。我看不懂这个到底是怎么算的。
下面贴一下我的源码,其中完整的.c和.h文件在我的压缩包里。
        ADS1247WREG(ADS1247_REG_MUX1,0x38);   //内部参考电压打开。
        bsp_DelayMS(1);
        ADS1247WREG(ADS1247_REG_IDAC0,0x06);  //DOUT/DRDY pin functions only as Data Out (default)   并且1mA。
        bsp_DelayMS(1);
        ADS1247WREG(ADS1247_REG_IDAC1,0x03);  // IDAC1->AIN0  IDAC2->AIN3.
        bsp_DelayMS(1);
        ADS1247WREG(ADS1247_REG_SYS0,0x26);     //增益4,320sps        
        bsp_DelayMS(1);
        SPI_ADS1247_SendByte(ADS1247_CMD_SYNC);   //同步AD转换
        bsp_DelayMS(1);
        data22=ADS1247_ReadData_Ave();//将转换的24位转换值取出。
        bsp_DelayMS(1);
        printf("通道:%x ",data22);
我这是接了一个100欧姆的电阻用来模拟PT100在0摄氏度时的样子。可是打出来的数据是这样的。不知道读取到的到底是什么。
读取到的24位转换值 读取到的24位转换值
打印出来的数据变化很大,而且不稳定。我是隔2秒钟打印一次的。
我现在也不理解这个ADS1247_ReadData_Ave()读出来的值是什么。做什么用的。到底是代表阻值还是电压呢,不知道。有用过这个芯片的朋友吗,给解释下吧,着实的弄不懂了。


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
曹世鹏
1楼-- · 2019-03-24 13:41
< 自己顶一下。我只要得到具体的电阻值就行。我用二分法做了一个表。一会儿我也贴出来,只要知道阻值。用不了几步就能得出具体的阻值来。

const u32 RTD_TAB_PT100[900] =   
{       
//9                8                7                6                5                4                3                2                1                0       
1895,        1938,        1982,        2025,        2068,        2111,        2154,        2197,        2240,        2283,  //  -190   //0行
2325,        2368,        2411,        2454,        2497,        2539,        2582,        2624,        2667,        2710,  //  -180
2752,        2795,        2837,        2880,        2922,        2964,        3007,        3049,        3091,        3134,  //  -170
3176,        3218,        3260,   3302,        3344,        3386,        3428,        3470,        3512,        3554,  //  -160
3596,        3638,        3680,        3722,        3764,        3805,        3847,        3889,        3931,        3972,  //  -150
4014,        4056,        4097,        4139,        4180,   4222,        4263,        4305,        4346,        4388,  //  -140                //5行
4429,        4470,        4512,        4553,        4594,        4636,        4677,        4718,        4759,        4800,  //  -130
4842,        4883,        4924,        4965,        5006,        5047,        5088,        5129,        5170,        5211,  //  -120
5252,        5293,        5334,        5375,        5415,        5456,        5497,        5538,        5579,        5619,  //  -110
5660,        5701,        5741,        5782,        5823,        5863,        5904,        5940,        5985,        6026,  //  -100
6066,        6107,        6147,        6188,        6228,        6268,        6309,        6349,        6390,        6430,  //  -90                //10行
6470,        6511,        6551,        6591,        6631,        6672,        6712,        6752,        6792,        6833,  //  -80
6873,        6913,        6953,        6993,        7033,        7073,        7113,        7153,        7193,        7233,  //  -70
7273,        7313,        7353,        7393,        7433,        7473,        7513,        7553,        7593,        7633,  //  -60
7673,        7712,        7752,        7792,        7832,        7872,        7911,        7951,        7991,        8031,  //  -50
8070,        8110,        8150,   8189,        8229,        8269,        8308,        8348,        8387,        8427,  //  -40
8467,        8506,        8546,        8585,        8625,        8664,        8704,        8743,        8783,        8822,   //  -30
8862,        8901,        8940,   8980,        9019,        9059,        9098,        9137,        9177,        9216,  //  -20
9255,        9295,        9334,        9373,        9412,        9452,        9491,        9530,        9569,        9609,  //  -10
9648,        9687,        9726,        9765,        9804,        9844,        9883,        9922,        9961,        10000, //   0    //19行

//0                1                2                3                4                5                6                7                8                9
10000,        10039,        10078,        10117,        10156,        10195,  10234,        10273,        10312,        10351,//  0      //20行
10390,        10429,        10468,  10507,        10546,  10585,        10624,        10663,        10702,        10740,//  10
10779,        10818,        10857,        10896,        10935,        10973,        11012,        11051,        11090,        11129,//  20
11167,        11206,        11245,        11283,        11322,        11361,        11400,  11438,        11477,        11515,//  30
11554,        11593,        11631,        11670,        11708,  11747,        11786,        11824,        11863,        11901,//  40
11940,        11978,        12017,        12055,        12094,        12132,        12171,        12209,        12247,        12286,//  50        //25行
12324,        12363,        12401,        12439,        12478,        12516,        12554,        12593,        12631,        12669,//  60
12708,        12746,        12784,        12822,        12861,        12899,        12937,        12975,        13013,        13052,//  70
13090,        13128,        13166,        13204,        13242,  13280,        13318,        13357,        13395,        13433,//  80
13471,        13509,        13547,        13585,        13623,        13661,        13699,        13737,        13775,        13813,//  90
13851,        13888,        13926,        13964,        14002,        14040,        14078,        14116,        14154,        14191,//  100   //30行
14229,        14267,        14305,        14343,        14380,        14418,        14456,        14494,        14531,        14569,//  110
14607,        14644,        14682,        14720,        14757,        14795,        14833,        14870,        14908,        14946,//  120
14983,        15021,        15058,        15096,        15133,        15171,        15208,        15246,        15283,        15321,//  130
15358,        15396,        15433,        15471,        15508,        15546,        15583,  15620,        15658,        15695,//  140
15733,        15770,        15807,        15845,        15882,        15919,        15956,        15994,        16031,        16068,//  150        //35行
16105,        16143,        16180,        16217,        16254,        16291,        16329,        16366,        16403,        16440,//  160
16477,        16514,        16551,        16589,        16626,        16663,        16700,  16737,        16774,        16811,//  170
16848,        16885,        16922,        16959,        16996,        17033,        17070,        17107,        17143,        17180,//  180
17217,        17254,        17291,        17328,        17365,        17402,        17438,        17475,        17512,        17549,//  190
17586,        17622,        17659,        17696,        17733,        17769,        17806,        17843,        17879,        17916,//  200        //40行
17953,        17989,        18026,        18063,        18099,        18136,        18172,        18209,        18246,        18282,//  210
18319,        18355,        18392,        18428,        18465,        18501,        18538,        18574,        18611,        18647,//  220
18684,        18720,        18756,        18793,        18829,        18866,        18902,        18938,        18975,        19011,//  230
19047,        19084,        19120,        19156,        19192,        19229,        19265,        19301,        19337,        19374,//  240
19410,        19446,        19482,        19518,        19555,        19591,        19627,        19663,        19699,        19735,//  250        //45行
19771,        19807,        19843,        19879,        19915,        19951,        19987,        20023,        20059,  20095,//  260
20131,        20167,        20203,        20239,        20275,        20311,        20347,  20383,        20419,        20455,//  270
20490,        20526,        20562,        20598,        20634,        20670,  20705,        20741,        20777,        20813,//  280
20848,        20884,        20920,        20956,        20991,        21027,        21063,        21098,        21134,        21170,//  290
21205,        21241,        21276,        21312,        21348,        21383,        21419,        21454,        21490,        21525,//  300        //50行
21561,        21596,        21632,        21667,        21703,        21738,        21774,        21809,        21844,        21880,//  310
21915,        21951,        21986,        22021,        22057,        22092,        22127,        22163,        22198,        22233,//  320
22268,        22304,        22339,        22374,        22409,        22445,        22480,        22515,        22550,        22585,//  330
22621,        22656,        22691,        22726,        22761,        22796,        22831,        22866,        22902,        22937,//  340
22972,        23007,        23042,        23077,        23112,        23147,        23182,        23217,        23252,        23287,//  350        //55行
23321,        23356,        23391,        23426,        23461,        23496,        23531,        23566,        23600,        23635,//  360
23670,        23705,        23740,        23774,        23809,        23844,        23879,  23913,        23948,        23983,//  370
24018,        24052,        24087,        24122,        24156,        24191,        24226,        24260,        24295,        24329,//  380
24364,        24399,        24433,        24468,        24502,        24537,        24571,        24606,        24640,        24675,//  390
24709,        24744,        24778,        24813,        24847,        24881,        24916,        24950,        24585,        25019,//  400        //60行
25053,        25088,        25122,        25156,        25191,        25225,        25259,        25293,        25328,        25362,//  410
25396,        25430,        25465,        25499,        25533,        25567,        25601,        25635,        25670,        25704,//  420
25738,        25772,        25806,        25840,        25874,        25908,        25942,        25976,        26010,        26044,//  430
26078,        26112,        26146,        26180,        26214,        26248,        26282,        26316,        26350,        26384,//  440
26418,        26452,        26486,        26520,        26553,        26587,        26621,        26655,        26689,        26722,//  450        //65行
26756,        26790,        26824,        26857,        26891,        26925,        26959,        26992,        27026,        27060,//  460
27093,        27127,        27161,        27194,        27228,        27261,        27295,        27329,        27362,        27396,//  470
27429,        27463,        27496,        27530,        27563,        27597,        27630,        27664,        27697,        27731,//  480
27764,        27798,        27831,        27864,        27898,        27931,        27964,        27998,        28031,        28064,//  490
28098,        28131,        28164,        28198,        28231,        28264,        28297,        28331,        28364,        28397,//  500        //70行
28430,        28463,        28497,        28530,        28563,        28596,        28629,        28662,        28685,        28729,//  510
28762,        28795,        28828,        28861,        28894,        28927,        28960,        28993,        29026,        29059,//  520
29092,        29125,        29158,        29191,        29224,        29256,        29289,        29322,        29355,        29388,//  530
29421,        29454,        29486,        29519,        29552,        29585,        29618,        29650,        29683,        29716,//  540
29749,        29781,        29814,        29847,        29880,        29912,        29945,        29978,        30010,        30043,//  550        //75行
30075,        30108,        30141,  30173,        30206,        30238,        30271,        30303,        30336,        30369,//  560
30401,        30434,        30466,        30498,        30531,        30563,        30596,        30628,        30661,        30693,//  570
30725,        30758,        30790,        30823,        30855,        30887,        30920,        30952,        30984,        31016,//  580
31049,        31081,        31113,        31145,        31178,        31210,        31242,        31274,        31306,        31339,//  590
31371,        31403,        31435,        31467,        31499,        31531,        31564,        31596,        31628,        31660,//  600        //80行
31692,        31724,        31756,        31788,        31820,        31852,        31884,        31916,        31948,        31980,//  610
32012,        32043,        32075,        32107,        32139,        32171,        32203,        32235,        32267,        32298,//  620
32330,        32362,        32394,        32426,        32457,        32489,        32521,        32553,        32584,        32616,//  630
32648,        32679,        32711,        32743,        32774,        32806,        32838,        32869,        32901,        32932,//  640
32964,        32996,        33027,        33059,        33090,        33122,        33153,        33185,        33216,        33248 //  650        //85行
};       
                          
//获得ADC值
//ch:通道值 0~16
//返回值:转换结果
float Get_Adc(u8 ch)   
{
        float f_temp;//测得的温度值。
                u16 fR;//测得的电阻值。
        u16 i;
                u16 zuidizuobiao;
                u16 subscript;       
                u16 low_low=0;  
                u16 low_high=0;  
                u16 high_low=0;  
                u16 high_high=0;
                u16 do_change=0;//可以解析温度标志位。当为1时,完成了取表工作,可以解析。
        ADC1->SQR3&=0XFFFFFFE0;//规则序列1 通道ch
        ADC1->SQR3|=ch;                                              
        ADC1->CR2|=1<<30;       //启动规则转换通道
        while(!(ADC1->SR&1<<1));//等待转换结束       

        f_temp=ADC1->DR;
        fR=((f_temp*(3.3/4096))/0.01)*100;//求出电阻值。0.004是电流值,*100是将电阻值放大100倍

       
        if (fR < RTD_TAB_PT100[0])                // 电阻值小于表格最小值,低于量程下限。
        {
//                return BELOW_LOW_LIMITE;
        }

        else if (fR > RTD_TAB_PT100[858])        // 电阻值大于表格最大值,超出量程上限。
        {
//                return EXCESS_UP_LIMITE;
        }               
                else
                {
                zuidizuobiao=0;//开始时,数组元素最底坐标为1.               
                subscript=858;//开始时,        数组元素个数为859.
                       
        for (i=10;i>0;i--) // 2分法查表。到底循环多少次还需要计算一下。
        {
                        if(do_change==0)//有问题,2个if函数调换则不行。进不了下面的if函数。无法判断当前do_change的具体值。
                        {
                                if((subscript%2==1)&&(subscript!=1))//有余数,说明有公共区间。
                                {//允许subscript=1
                                        subscript=subscript/2;                                       
                                        low_low=zuidizuobiao;
                                        low_high=zuidizuobiao+subscript;       
                                        high_low=low_high;
                                        high_high=high_low+subscript;
                                        subscript=subscript+1;
                                       
                                        if(subscript==2)//说明只剩下最后一个数了。
                                        {
                                                do_change=1;//可以解析了
                                       
                                        }
                                        else
                                        {
                                                if ((RTD_TAB_PT100[low_low] <= fR)&&(fR < RTD_TAB_PT100[low_high]))
                                                {
                                                                zuidizuobiao = low_low;

                                                }
                                                else if ((RTD_TAB_PT100[high_low] <= fR)&&(fR <= RTD_TAB_PT100[high_high]))
                                                {
                                                                zuidizuobiao = high_low;

                                                }
                                                else
                                                {

                                                }
                                        }
                                       
                                }
                               
                                else//无公共区间
                                {
                                        subscript=subscript/2;
                                        if(subscript==1)
                                        {
                                                if(fR == RTD_TAB_PT100[zuidizuobiao+1])
                                                {
                                                        zuidizuobiao=zuidizuobiao+1;                                                       
                                                }
                                                else
                                                {
                                                        zuidizuobiao=zuidizuobiao;
                                                }
                                                do_change=1;//可以解析了
                                                LED1=0;
                                        }
                                        else
                                        {
                                                low_low=zuidizuobiao;
                                                low_high=zuidizuobiao+subscript-1;       
                                                high_low=zuidizuobiao+subscript;
                                                high_high=high_low+subscript-1;

                                                if ((RTD_TAB_PT100[low_low] <= fR)&&(fR <= RTD_TAB_PT100[low_high]))
                                                {
                                                                zuidizuobiao = low_low;

                                                }
                                                else if ((RTD_TAB_PT100[high_low] <= fR)&&(fR <= RTD_TAB_PT100[high_high]))
                                                {
                                                                zuidizuobiao = high_low;

                                                }
                                                else
                                                {
                                                       
                                                }                                               
                                        }

                                }

                        }                               
                        if(do_change==1)//说明找到了正确的区间.subscript的值为2。当前温度为zuidizuobiao所指向的温度
                        {
                               
                                do_change=0;
                                if(RTD_TAB_PT100[zuidizuobiao]==10000)
                                {
                                        f_temp=0.000;

                                }
                                else if(RTD_TAB_PT100[zuidizuobiao]<10000)//负值,需要另一种处理。25/1000
                                {                               
                                        if(zuidizuobiao<=99)
                                        {
                                                f_temp=(float)(((zuidizuobiao/10)*10-190)-(9-zuidizuobiao%10)-(fR-RTD_TAB_PT100[zuidizuobiao])*0.025);

                                                //(zuidizuobiao/10)*10-190  代表整数中十位和百位部分
                                                //9-zuidizuobiao%10   代表整数中个位部分
                                                //(fR-RTD_TAB_PT100[zuidizuobiao])*0.025  代表小数部分。
                                        }
                                        else
                                        {
                                                f_temp=(float)((zuidizuobiao/10*10-190)-(9-((zuidizuobiao%100)%10))-(fR-RTD_TAB_PT100[zuidizuobiao])*0.025);

                                                //(zuidizuobiao/10)*10-190  代表整数中十位和百位部分
                                                //(9-zuidizuobiao%100)%10  代表整数中个位部分
                                                //(fR-RTD_TAB_PT100[zuidizuobiao])*0.025  代表小数部分。       
                                        }
                                       
                                }

                                else  //else if(zuidizuobiao>10000)//正值,需要另一种处理。
                                {
                                        f_temp=(float)(((zuidizuobiao/10)*10-200)+(zuidizuobiao%100)%10+(fR-RTD_TAB_PT100[zuidizuobiao])*0.025);
                                        //(zuidizuobiao/10)*10-200)  代表整数中十位和百位部分
                                        //(zuidizuobiao%100)%10  代表整数中个位部分
                                        //(fR-RTD_TAB_PT100[zuidizuobiao])*0.025  代表小数部分。                                               
                                }
                                                       
                        break;       
                        }
                                       
        }
               
        }
//        printf(" 当前温度值为: ");
//        printf("%f",f_temp);                       
        return f_temp;                //返回adc值       
}
dontium
2楼-- · 2019-03-24 17:05
< :TI_MSP430_内容页_SA7 --> 楼主能在较短的叙述中说明你的问题吗?
曹世鹏
3楼-- · 2019-03-24 21:21
 精彩回答 2  元偷偷看……
dontium
4楼-- · 2019-03-25 02:29
只要读数据正常就好办。

和实际数据对应,需要标定,这要根据PGA设置及参考源电压决定。

例如,如果参考源电压为Vref,PGA 的增益为G,读出的数据为Dat,则实际电压Vx为:

Vx = Dat / (  G  * 0xffffff ) *   Vref


曹世鹏
5楼-- · 2019-03-25 06:29
dontium 发表于 2015-5-19 12:07
只要读数据正常就好办。

和实际数据对应,需要标定,这要根据PGA设置及参考源电压决定。

例如,如果参考源电压为Vref,PGA 的增益为G,读出的数据为Dat,则实际电压Vx为:

Vx = Dat / (  G  * 0xffffff ) *   Vref

我把我读到的值带进去,发现不对。我设置的PGA=4。Vref=1.64V。代入的Dat=1f6da6。发现不对。按照常理来讲测的的Vx实际电压应该为0.1V。因为我接的PT100的阻值为100欧姆。



这是我的软件设置:


        ADS1247WREG(ADS1247_REG_MUX1,0x20);   //内部参考电压打开。

        ADS1247WREG(ADS1247_REG_MUX0,0x0A);   // AIN1 AIN2 输入。

        ADS1247WREG(ADS1247_REG_IDAC0,0x06);  //DOUT/DRDY pin functions only as Data Out (default)   并且1mA。

        ADS1247WREG(ADS1247_REG_IDAC1,0x03);  // IDAC1->AIN0  IDAC2->AIN3.

        ADS1247WREG(ADS1247_REG_SYS0,0x26);     //增益4,320sps       

        SPI_ADS1247_SendByte(ADS1247_CMD_SYNC);   //同步AD转换

        data22=ADS1247_ReadData_Ave();     //将数据读取出来

        printf("通道:%x ",data22);





这是我的硬件连接:

9.bmp



这是读到的数据,我选取了其中的8组,这是在串口调试工具上截取的:


通道:1f6eed

通道:1f6fbe

通道:1f6ee0

通道:1f6fd3

通道:1f6f8b

通道:1f6fa1

通道:1f6f27

通道:1f6f5c

看来可能还是我设置的问题。不知道该怎么设置。



曹世鹏
6楼-- · 2019-03-25 08:15
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章