搜索
bottom↓
回复: 109

发个参考网络加自己修改的 STM32+ADS1248+PT100代码,仅供参考~

  [复制链接]

出130入129汤圆

发表于 2014-10-7 19:48:25 | 显示全部楼层 |阅读模式
本帖最后由 68336016 于 2014-10-7 19:53 编辑

头文件部分宏定义参考了网络内容,其它代码自己写的,仅供没用过ADS1248的朋友参考

仅供参考……


用STM32硬件SPI驱动ADS1248,读出了AD值,怎么使用自己稍微看下文档就知道了。
因为我没有买到精密的Rcomp,目前测的电压直接就是PT100的电压,PGA增益只能设置小些。
读数还算稳定,温度小数点后第二位有时会跳动,我暂时是能用就行,没时间多折腾。

头文件里的宏定义#define USE_INTER_VREF决定是用   ADS1248内部2.048V  还是  恒流源在Rbias上的压降 当作AD基准源。

如果想用内部基准源,Rcomp(R41,R44,R46,R47)必须得用精密电阻,Rbias(R42)无所谓。
但是要考虑内部基准源精度及稳定性,还有内部恒流源不一定准确。

如果用恒流源在Rbias上的压降当作AD基准源,Rcomp,Rbias都得精密电阻。
AD值只跟Rbias有比例关系,只需要买一个精密电阻,理论上更省事。

我的原理图


头文件
  1. /*******************************************************************************
  2. * 文件名        : ads1248.h
  3. * 作  者        :
  4. * 版  本        :
  5. * 日  期        : 2014-10-04
  6. * 描  述        : ADS1248
  7. *******************************************************************************/

  8. /* Define to prevent recursive inclusion -------------------------------------*/
  9. #ifndef __ADS1248_H
  10. #define __ADS1248_H

  11. /* Includes ------------------------------------------------------------------*/
  12. #include "stm32f10x_lib.h"

  13. //#define USE_INTER_VREF
  14. /************************************************************************/
  15. /*  ads1248 register map                                                */
  16. /************************************************************************/
  17. #define ADS_MUX0                 0X00
  18. #define ADS_VBIAS                 0X01
  19. #define ADS_MUX1                 0X02
  20. #define ADS_SYS0                 0X03
  21. #define ADS_OFC0                 0X04
  22. #define ADS_OFC1                 0X05
  23. #define ADS_OFC2                 0X06
  24. #define ADS_FSC0                 0X07
  25. #define ADS_FSC1                 0X08
  26. #define ADS_FSC2                 0X09
  27. #define ADS_IDAC0                 0X0A
  28. #define ADS_IDAC1                 0X0B
  29. #define ADS_GPIOCFG         0X0C
  30. #define ADS_GPIODIR         0X0D
  31. #define ADS_GPIODAT         0X0E

  32. /************************************************************************/
  33. /* ads1248 SPI commands                                                 */
  34. /************************************************************************/
  35. #define ADS_WAKEUP                    0x00
  36. #define ADS_SLEEP                    0x02
  37. #define ADS_SYNC                    0x04
  38. #define ADS_RESET                    0x06
  39. #define ADS_NOP                            0xFF
  40. #define ADS_RDATA                    0x12
  41. #define ADS_RDATAC                    0x14
  42. #define ADS_SDATAC                    0x16
  43. #define ADS_RREG                    0x20
  44. #define ADS_WREG                    0x40
  45. #define ADS_SYSOCAL                    0x60
  46. #define ADS_SYSGCAL                    0x61
  47. #define ADS_SELFOCAL            0x62

  48. /************************************************************************/
  49. /* ads1248 macroinstruction                                             */
  50. /************************************************************************/
  51. // about MUX0: Multiplexer Control Register 0
  52. #define  P_AIN0                            0x00
  53. #define  P_AIN1                            0x08
  54. #define  P_AIN2                            0x10
  55. #define  P_AIN3                            0x18
  56. #define  P_AIN4                            0x20
  57. #define  P_AIN5                            0x28
  58. #define  P_AIN6                            0x30
  59. #define  P_AIN7                            0x38
  60. #define  N_AIN0                            0x00
  61. #define  N_AIN1                            0x01
  62. #define  N_AIN2                            0x02
  63. #define  N_AIN3                            0x03
  64. #define  N_AIN4                            0x04
  65. #define  N_AIN5                            0x05
  66. #define  N_AIN6                            0x06
  67. #define  N_AIN7                            0x07

  68. // about MUX1: Multiplexer Control Register 1
  69. #define  CLK_Inter                                 0x00
  70. #define  CLK_Exter                                 0x80
  71. #define  REF_Inter_AlwaysOn                0x20  // selecte internal reference and always open  
  72. #define  REF_Inter_AlwaysOff        0x00  // selecte internal reference and always off
  73. #define         SELT_REF0                                0x00                               
  74. #define  SELT_REF1                                0x08
  75. #define  SELT_Inter                                0x10
  76. #define  SELT_Inter_REF0                0x18

  77. // about SYS0 : System Control Register 0
  78. #define         PGAGain_1                         0x00
  79. #define         PGAGain_2                         0x10
  80. #define         PGAGain_4                         0x20
  81. #define         PGAGain_8                         0x30
  82. #define         PGAGain_16                        0x40
  83. #define         PGAGain_32                        0x50
  84. #define         PGAGain_64                        0x60
  85. #define         PGAGain_128                 0x70
  86. #define         DataRate_5                        0x00
  87. #define         DataRate_10                0x01
  88. #define         DataRate_20                0x02
  89. #define         DataRate_40                0x03
  90. #define         DataRate_80                0x04
  91. #define         DataRate_160                0x05
  92. #define         DataRate_320                0x06
  93. #define         DataRate_640                0x07
  94. #define         DataRate_1000                0x08
  95. #define         DataRate_2000                0x09

  96. // about IDAC0: IDAC Control Register 0
  97. #define  Drdy_Mode_EN                 0x08
  98. #define  Drdy_Mode_DIS                 0x00

  99. // the magnitude of the excitation current.
  100. // The IDACs require the internal reference to be on.
  101. #define  IMAG_Off                         0x00
  102. #define  IMAG_50                        0x01
  103. #define  IMAG_100                        0x02
  104. #define  IMAG_250                        0x03
  105. #define  IMAG_500                        0x04
  106. #define  IMAG_750                        0x05
  107. #define  IMAG_1000                        0x06
  108. #define  IMAG_1500                        0x07

  109. // about IDAC1: IDAC Control Register 1
  110. // select the output pin for the first current source DAC.
  111. #define         IDAC1_AIN0                        0x00
  112. #define         IDAC1_AIN1                        0x10
  113. #define         IDAC1_AIN2                        0x20
  114. #define         IDAC1_AIN3                        0x30
  115. #define         IDAC1_AIN4                        0x40
  116. #define         IDAC1_AIN5                        0x50
  117. #define         IDAC1_AIN6                        0x60
  118. #define         IDAC1_AIN7                        0x70
  119. #define         IDAC1_IEXT1                0x80
  120. #define         IDAC1_IEXT2                0x90
  121. #define         IDAC1_OFF                        0xC0

  122. // select the output pin for the second current source DAC.
  123. #define         IDAC2_AIN0                        0x00
  124. #define         IDAC2_AIN1                        0x01
  125. #define         IDAC2_AIN2                        0x02
  126. #define         IDAC2_AIN3                        0x03
  127. #define         IDAC2_AIN4                        0x04
  128. #define         IDAC2_AIN5                        0x05
  129. #define         IDAC2_AIN6                        0x06
  130. #define         IDAC2_AIN7                        0x07
  131. #define         IDAC2_IEXT1                0x08
  132. #define         IDAC2_IEXT2                0x09
  133. #define         IDAC2_OFF                        0x0C

  134. void ADS1248_Init(void);
  135. void ADS1248_Config(void);
  136. u8 ADS1248_ReadByte(void);
  137. u8 ADS1248_WriteByte(u8 data);
  138. void ADS1248_SetIDAC(u8 idac1, u8 idac2, u8 idacImage);
  139. void ADS1248_SetPGAGainAndDataRate(u8 pgaGain, u8 dataRate);
  140. void ADS1248_SetInputChannel(u8 positiveChannel, u8 negativeChannel);
  141. void ADS1248_SetReference(u8 interVrefOnOff, u8 refSelected);
  142. s32 ADS1248_ReadADC();
  143. float ADS1248_ResToTemp(float resistance);
  144. #endif
复制代码


源文件
  1. /*******************************************************************************
  2. * 文件名        : ads1248.c
  3. * 作  者        :
  4. * 版  本        :
  5. * 日  期        : 2014-10-04
  6. * 描  述        : ADS1248
  7. *******************************************************************************/

  8. /* Includes ------------------------------------------------------------------*/
  9. #include "ads1248.h"
  10. /* Private typedef -----------------------------------------------------------*/
  11. /* Private define ------------------------------------------------------------*/
  12. #define ADS1248_CS_PORT                GPIOA        //片选脚所在端口
  13. #define ADS1248_PORT                GPIOB        //其它脚所在端口

  14. #define ADS1248_SPI                        SPI3

  15. #define ADS1248_CS                        GPIO_Pin_15
  16. #define ADS1248_SCK                        GPIO_Pin_3
  17. #define ADS1248_DO                        GPIO_Pin_4
  18. #define ADS1248_DIN                        GPIO_Pin_5

  19. #define ADS1248_RST                        GPIO_Pin_6
  20. #define ADS1248_START                GPIO_Pin_8
  21. #define ADS1248_READY                GPIO_Pin_9

  22. #define RCC_APB2Periph_ADS1248_CS_PORT                RCC_APB2Periph_GPIOA
  23. #define RCC_APB2Periph_ADS1248_PORT                        RCC_APB2Periph_GPIOB
  24. #define RCC_APB1Periph_ADS1248_SPI                        RCC_APB1Periph_SPI3

  25. #define ADS1248_CS_H()                        ADS1248_CS_PORT->BSRR = ADS1248_CS
  26. #define ADS1248_CS_L()                        ADS1248_CS_PORT->BRR = ADS1248_CS

  27. #define ADS1248_RST_H()                        ADS1248_PORT->BSRR = ADS1248_RST
  28. #define ADS1248_RST_L()                        ADS1248_PORT->BRR = ADS1248_RST

  29. #define ADS1248_START_H()            ADS1248_PORT->BSRR = ADS1248_START
  30. #define ADS1248_START_L()            ADS1248_PORT->BRR = ADS1248_START

  31. #define ADS1248_READY_PIN()                ADS1248_PORT->IDR & ADS1248_READY //低电平表示READY

  32. /* Private macro -------------------------------------------------------------*/
  33. /* Private variables ---------------------------------------------------------*/
  34. const float pt100_table[1001] =/*PT100 0-100度对应的电阻值,0.1度间隔*/
  35. {
  36.     100.0000, 100.0391, 100.0782, 100.1172, 100.1563, 100.1954, 100.2345, 100.2736, 100.3126, 100.3517,
  37.     100.3908, 100.4298, 100.4689, 100.5080, 100.5470, 100.5861, 100.6252, 100.6642, 100.7033, 100.7424,
  38.     100.7814, 100.8205, 100.8595, 100.8986, 100.9377, 100.9767, 101.0158, 101.0548, 101.0939, 101.1329,
  39.     101.1720, 101.2110, 101.2501, 101.2891, 101.3282, 101.3672, 101.4062, 101.4453, 101.4843, 101.5234,
  40.     101.5624, 101.6014, 101.6405, 101.6795, 101.7185, 101.7576, 101.7966, 101.8356, 101.8747, 101.9137,
  41.     101.9527, 101.9917, 102.0308, 102.0698, 102.1088, 102.1478, 102.1868, 102.2259, 102.2649, 102.3039,
  42.     102.3429, 102.3819, 102.4209, 102.4599, 102.4989, 102.5380, 102.5770, 102.6160, 102.6550, 102.6940,
  43.     102.7330, 102.7720, 102.8110, 102.8500, 102.8890, 102.9280, 102.9670, 103.0060, 103.0450, 103.0840,
  44.     103.1229, 103.1619, 103.2009, 103.2399, 103.2789, 103.3179, 103.3569, 103.3958, 103.4348, 103.4738,
  45.     103.5128, 103.5518, 103.5907, 103.6297, 103.6687, 103.7077, 103.7466, 103.7856, 103.8246, 103.8636,
  46.     103.9025, 103.9415, 103.9805, 104.0194, 104.0584, 104.0973, 104.1363, 104.1753, 104.2142, 104.2532,
  47.     104.2921, 104.3311, 104.3701, 104.4090, 104.4480, 104.4869, 104.5259, 104.5648, 104.6038, 104.6427,
  48.     104.6816, 104.7206, 104.7595, 104.7985, 104.8374, 104.8764, 104.9153, 104.9542, 104.9932, 105.0321,
  49.     105.0710, 105.1100, 105.1489, 105.1878, 105.2268, 105.2657, 105.3046, 105.3435, 105.3825, 105.4214,
  50.     105.4603, 105.4992, 105.5381, 105.5771, 105.6160, 105.6549, 105.6938, 105.7327, 105.7716, 105.8105,
  51.     105.8495, 105.8884, 105.9273, 105.9662, 106.0051, 106.0440, 106.0829, 106.1218, 106.1607, 106.1996,
  52.     106.2385, 106.2774, 106.3163, 106.3552, 106.3941, 106.4330, 106.4719, 106.5108, 106.5496, 106.5885,
  53.     106.6274, 106.6663, 106.7052, 106.7441, 106.7830, 106.8218, 106.8607, 106.8996, 106.9385, 106.9774,
  54.     107.0162, 107.0551, 107.0940, 107.1328, 107.1717, 107.2106, 107.2495, 107.2883, 107.3272, 107.3661,
  55.     107.4049, 107.4438, 107.4826, 107.5215, 107.5604, 107.5992, 107.6381, 107.6769, 107.7158, 107.7546,
  56.     107.7935, 107.8324, 107.8712, 107.9101, 107.9489, 107.9877, 108.0266, 108.0654, 108.1043, 108.1431,
  57.     108.1820, 108.2208, 108.2596, 108.2985, 108.3373, 108.3762, 108.4150, 108.4538, 108.4926, 108.5315,
  58.     108.5703, 108.6091, 108.6480, 108.6868, 108.7256, 108.7644, 108.8033, 108.8421, 108.8809, 108.9197,
  59.     108.9585, 108.9974, 109.0362, 109.0750, 109.1138, 109.1526, 109.1914, 109.2302, 109.2690, 109.3078,
  60.     109.3467, 109.3855, 109.4243, 109.4631, 109.5019, 109.5407, 109.5795, 109.6183, 109.6571, 109.6959,
  61.     109.7347, 109.7734, 109.8122, 109.8510, 109.8898, 109.9286, 109.9674, 110.0062, 110.0450, 110.0838,
  62.     110.1225, 110.1613, 110.2001, 110.2389, 110.2777, 110.3164, 110.3552, 110.3940, 110.4328, 110.4715,
  63.     110.5103, 110.5491, 110.5879, 110.6266, 110.6654, 110.7042, 110.7429, 110.7817, 110.8204, 110.8592,
  64.     110.8980, 110.9367, 110.9755, 111.0142, 111.0530, 111.0917, 111.1305, 111.1693, 111.2080, 111.2468,
  65.     111.2855, 111.3242, 111.3630, 111.4017, 111.4405, 111.4792, 111.5180, 111.5567, 111.5954, 111.6342,
  66.     111.6729, 111.7117, 111.7504, 111.7891, 111.8279, 111.8666, 111.9053, 111.9441, 111.9828, 112.0215,
  67.     112.0602, 112.0990, 112.1377, 112.1764, 112.2151, 112.2538, 112.2926, 112.3313, 112.3700, 112.4087,
  68.     112.4474, 112.4861, 112.5248, 112.5636, 112.6023, 112.6410, 112.6797, 112.7184, 112.7571, 112.7958,
  69.     112.8345, 112.8732, 112.9119, 112.9506, 112.9893, 113.0280, 113.0667, 113.1054, 113.1441, 113.1828,
  70.     113.2215, 113.2602, 113.2988, 113.3375, 113.3762, 113.4149, 113.4536, 113.4923, 113.5309, 113.5696,
  71.     113.6083, 113.6470, 113.6857, 113.7243, 113.7630, 113.8017, 113.8404, 113.8790, 113.9177, 113.9564,
  72.     113.9950, 114.0337, 114.0724, 114.1110, 114.1497, 114.1884, 114.2270, 114.2657, 114.3043, 114.3430,
  73.     114.3817, 114.4203, 114.4590, 114.4976, 114.5363, 114.5749, 114.6136, 114.6522, 114.6909, 114.7295,
  74.     114.7681, 114.8068, 114.8454, 114.8841, 114.9227, 114.9614, 115.0000, 115.0386, 115.0773, 115.1159,
  75.     115.1545, 115.1932, 115.2318, 115.2704, 115.3091, 115.3477, 115.3863, 115.4249, 115.4636, 115.5022,
  76.     115.5408, 115.5794, 115.6180, 115.6567, 115.6953, 115.7339, 115.7725, 115.8111, 115.8497, 115.8883,
  77.     115.9270, 115.9656, 116.0042, 116.0428, 116.0814, 116.1200, 116.1586, 116.1972, 116.2358, 116.2744,
  78.     116.3130, 116.3516, 116.3902, 116.4288, 116.4674, 116.5060, 116.5446, 116.5831, 116.6217, 116.6603,
  79.     116.6989, 116.7375, 116.7761, 116.8147, 116.8532, 116.8918, 116.9304, 116.9690, 117.0076, 117.0461,
  80.     117.0847, 117.1233, 117.1619, 117.2004, 117.2390, 117.2776, 117.3161, 117.3547, 117.3933, 117.4318,
  81.     117.4704, 117.5090, 117.5475, 117.5861, 117.6247, 117.6632, 117.7018, 117.7403, 117.7789, 117.8174,
  82.     117.8560, 117.8945, 117.9331, 117.9716, 118.0102, 118.0487, 118.0873, 118.1258, 118.1644, 118.2029,
  83.     118.2414, 118.2800, 118.3185, 118.3571, 118.3956, 118.4341, 118.4727, 118.5112, 118.5497, 118.5883,
  84.     118.6268, 118.6653, 118.7038, 118.7424, 118.7809, 118.8194, 118.8579, 118.8965, 118.9350, 118.9735,
  85.     119.0120, 119.0505, 119.0890, 119.1276, 119.1661, 119.2046, 119.2431, 119.2816, 119.3201, 119.3586,
  86.     119.3971, 119.4356, 119.4741, 119.5126, 119.5511, 119.5896, 119.6281, 119.6666, 119.7051, 119.7436,
  87.     119.7821, 119.8206, 119.8591, 119.8976, 119.9361, 119.9746, 120.0131, 120.0516, 120.0900, 120.1285,
  88.     120.1670, 120.2055, 120.2440, 120.2824, 120.3209, 120.3594, 120.3979, 120.4364, 120.4748, 120.5133,
  89.     120.5518, 120.5902, 120.6287, 120.6672, 120.7056, 120.7441, 120.7826, 120.8210, 120.8595, 120.8980,
  90.     120.9364, 120.9749, 121.0133, 121.0518, 121.0902, 121.1287, 121.1672, 121.2056, 121.2441, 121.2825,
  91.     121.3210, 121.3594, 121.3978, 121.4363, 121.4747, 121.5132, 121.5516, 121.5901, 121.6285, 121.6669,
  92.     121.7054, 121.7438, 121.7822, 121.8207, 121.8591, 121.8975, 121.9360, 121.9744, 122.0128, 122.0513,
  93.     122.0897, 122.1281, 122.1665, 122.2049, 122.2434, 122.2818, 122.3202, 122.3586, 122.3970, 122.4355,
  94.     122.4739, 122.5123, 122.5507, 122.5891, 122.6275, 122.6659, 122.7043, 122.7427, 122.7811, 122.8195,
  95.     122.8579, 122.8963, 122.9347, 122.9731, 123.0115, 123.0499, 123.0883, 123.1267, 123.1651, 123.2035,
  96.     123.2419, 123.2803, 123.3187, 123.3571, 123.3955, 123.4338, 123.4722, 123.5106, 123.5490, 123.5874,
  97.     123.6257, 123.6641, 123.7025, 123.7409, 123.7792, 123.8176, 123.8560, 123.8944, 123.9327, 123.9711,
  98.     124.0095, 124.0478, 124.0862, 124.1246, 124.1629, 124.2013, 124.2396, 124.2780, 124.3164, 124.3547,
  99.     124.3931, 124.4314, 124.4698, 124.5081, 124.5465, 124.5848, 124.6232, 124.6615, 124.6999, 124.7382,
  100.     124.7766, 124.8149, 124.8533, 124.8916, 124.9299, 124.9683, 125.0066, 125.0450, 125.0833, 125.1216,
  101.     125.1600, 125.1983, 125.2366, 125.2749, 125.3133, 125.3516, 125.3899, 125.4283, 125.4666, 125.5049,
  102.     125.5432, 125.5815, 125.6199, 125.6582, 125.6965, 125.7348, 125.7731, 125.8114, 125.8497, 125.8881,
  103.     125.9264, 125.9647, 126.0030, 126.0413, 126.0796, 126.1179, 126.1562, 126.1945, 126.2328, 126.2711,
  104.     126.3094, 126.3477, 126.3860, 126.4243, 126.4626, 126.5009, 126.5392, 126.5775, 126.6157, 126.6540,
  105.     126.6923, 126.7306, 126.7689, 126.8072, 126.8455, 126.8837, 126.9220, 126.9603, 126.9986, 127.0368,
  106.     127.0751, 127.1134, 127.1517, 127.1899, 127.2282, 127.2665, 127.3048, 127.3430, 127.3813, 127.4195,
  107.     127.4578, 127.4961, 127.5343, 127.5726, 127.6109, 127.6491, 127.6874, 127.7256, 127.7639, 127.8021,
  108.     127.8404, 127.8786, 127.9169, 127.9551, 127.9934, 128.0316, 128.0699, 128.1081, 128.1464, 128.1846,
  109.     128.2228, 128.2611, 128.2993, 128.3376, 128.3758, 128.4140, 128.4523, 128.4905, 128.5287, 128.5670,
  110.     128.6052, 128.6434, 128.6816, 128.7199, 128.7581, 128.7963, 128.8345, 128.8728, 128.9110, 128.9492,
  111.     128.9874, 129.0256, 129.0638, 129.1021, 129.1403, 129.1785, 129.2167, 129.2549, 129.2931, 129.3313,
  112.     129.3695, 129.4077, 129.4459, 129.4841, 129.5223, 129.5605, 129.5987, 129.6369, 129.6751, 129.7133,
  113.     129.7515, 129.7897, 129.8279, 129.8661, 129.9043, 129.9425, 129.9807, 130.0188, 130.0570, 130.0952,
  114.     130.1334, 130.1716, 130.2098, 130.2479, 130.2861, 130.3243, 130.3625, 130.4006, 130.4388, 130.4770,
  115.     130.5152, 130.5533, 130.5915, 130.6297, 130.6678, 130.7060, 130.7442, 130.7823, 130.8205, 130.8586,
  116.     130.8968, 130.9350, 130.9731, 131.0113, 131.0494, 131.0876, 131.1257, 131.1639, 131.2020, 131.2402,
  117.     131.2783, 131.3165, 131.3546, 131.3928, 131.4309, 131.4691, 131.5072, 131.5453, 131.5835, 131.6216,
  118.     131.6597, 131.6979, 131.7360, 131.7742, 131.8123, 131.8504, 131.8885, 131.9267, 131.9648, 132.0029,
  119.     132.0411, 132.0792, 132.1173, 132.1554, 132.1935, 132.2317, 132.2698, 132.3079, 132.3460, 132.3841,
  120.     132.4222, 132.4603, 132.4985, 132.5366, 132.5747, 132.6128, 132.6509, 132.6890, 132.7271, 132.7652,
  121.     132.8033, 132.8414, 132.8795, 132.9176, 132.9557, 132.9938, 133.0319, 133.0700, 133.1081, 133.1462,
  122.     133.1843, 133.2224, 133.2604, 133.2985, 133.3366, 133.3747, 133.4128, 133.4509, 133.4889, 133.5270,
  123.     133.5651, 133.6032, 133.6413, 133.6793, 133.7174, 133.7555, 133.7935, 133.8316, 133.8697, 133.9078,
  124.     133.9458, 133.9839, 134.0220, 134.0600, 134.0981, 134.1361, 134.1742, 134.2123, 134.2503, 134.2884,
  125.     134.3264, 134.3645, 134.4025, 134.4406, 134.4786, 134.5167, 134.5547, 134.5928, 134.6308, 134.6689,
  126.     134.7069, 134.7450, 134.7830, 134.8211, 134.8591, 134.8971, 134.9352, 134.9732, 135.0112, 135.0493,
  127.     135.0873, 135.1253, 135.1634, 135.2014, 135.2394, 135.2774, 135.3155, 135.3535, 135.3915, 135.4295,
  128.     135.4676, 135.5056, 135.5436, 135.5816, 135.6196, 135.6577, 135.6957, 135.7337, 135.7717, 135.8097,
  129.     135.8477, 135.8857, 135.9237, 135.9617, 135.9997, 136.0377, 136.0757, 136.1137, 136.1517, 136.1897,
  130.     136.2277, 136.2657, 136.3037, 136.3417, 136.3797, 136.4177, 136.4557, 136.4937, 136.5317, 136.5697,
  131.     136.6077, 136.6456, 136.6836, 136.7216, 136.7596, 136.7976, 136.8355, 136.8735, 136.9115, 136.9495,
  132.     136.9875, 137.0254, 137.0634, 137.1014, 137.1393, 137.1773, 137.2153, 137.2532, 137.2912, 137.3292,
  133.     137.3671, 137.4051, 137.4431, 137.4810, 137.5190, 137.5569, 137.5949, 137.6329, 137.6708, 137.7088,
  134.     137.7467, 137.7847, 137.8226, 137.8606, 137.8985, 137.9365, 137.9744, 138.0123, 138.0503, 138.0882,
  135.     138.1262, 138.1641, 138.2020, 138.2400, 138.2779, 138.3158, 138.3538, 138.3917, 138.4296, 138.4676,
  136.     138.5055
  137. };

  138. /* Private function prototypes -----------------------------------------------*/
  139. /* Private functions ---------------------------------------------------------*/

  140. /*******************************************************************************
  141. * @Function Name: ADS1248_Init
  142. * @Description  : ADS1248初始化
  143. * @param                : void
  144. * @retval                   : void
  145. * @date                           : 2014/10/04
  146. *******************************************************************************/
  147. void ADS1248_Init(void)
  148. {
  149.     ADS1248_Config(); // 配置SPI,GPIO和RCC

  150.     ADS1248_RST_L();
  151.     ADS1248_START_L();
  152.     Delay(4);
  153.     ADS1248_RST_H();
  154.     ADS1248_START_H(); //连续
  155.     Delay(20);
  156.     ADS1248_CS_L();

  157.     ADS1248_SetInputChannel(P_AIN0, N_AIN1);

  158. #ifdef  USE_INTER_VREF
  159.     ADS1248_SetReference(REF_Inter_AlwaysOn, SELT_Inter);            // 设置内部基准为参考源
  160. #else  /*   USE REF0  */
  161.     ADS1248_SetReference(REF_Inter_AlwaysOn, SELT_REF0);            // 设置外部REF0为参考源
  162. #endif

  163.     Delay(10);
  164.     ADS1248_SetIDAC(IDAC1_AIN0, IDAC2_AIN1, IMAG_1000);                        // 设置电流源
  165.     ADS1248_SetPGAGainAndDataRate(PGAGain_8, DataRate_20);                // 设置PGA倍数和传输速率
  166. }

  167. /*******************************************************************************
  168. * @Function Name: ADS1248_Config
  169. * @Description  : SPI和GPIO初始化
  170. * @param                : void
  171. * @retval                   : void
  172. * @date                           : 2014/10/04
  173. *******************************************************************************/
  174. void ADS1248_Config(void)
  175. {
  176.     SPI_InitTypeDef  SPI_InitStructure;
  177.     GPIO_InitTypeDef GPIO_InitStructure;

  178.     /* Enable SPI and GPIO clocks */
  179.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADS1248_CS_PORT, ENABLE);
  180.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADS1248_PORT, ENABLE);
  181.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_ADS1248_SPI, ENABLE);

  182.     /* Configure SPI pins: SCK, MISO and MOSI */
  183.     GPIO_InitStructure.GPIO_Pin = ADS1248_SCK | ADS1248_DO | ADS1248_DIN;
  184.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  185.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  186.     GPIO_Init(ADS1248_PORT, &GPIO_InitStructure);

  187.     /* Configure ADS1248 Control Pins: RST, START */
  188.     GPIO_InitStructure.GPIO_Pin = ADS1248_RST | ADS1248_START;
  189.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  190.     GPIO_Init(ADS1248_PORT, &GPIO_InitStructure);

  191.     /* Configure I/O for ADS1248 Chip select */
  192.     GPIO_InitStructure.GPIO_Pin = ADS1248_CS;
  193.     GPIO_Init(ADS1248_CS_PORT, &GPIO_InitStructure);

  194.     /* Configure ADS1248 Status Pins: READY */
  195.     GPIO_InitStructure.GPIO_Pin =  ADS1248_READY;
  196.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  197.     GPIO_Init(ADS1248_PORT, &GPIO_InitStructure);

  198.     /* Deselect the FLASH: Chip Select high */
  199.     ADS1248_CS_H();

  200.     /* SPI configuration 初始化阶段*/
  201.     SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  202.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  203.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  204.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
  205.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  206.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  207.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //PCLK1/32=24/32=0.75MHz,ADS1248的SCLK最快约2MHz
  208.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  209.     SPI_InitStructure.SPI_CRCPolynomial = 7;
  210.     SPI_Init(ADS1248_SPI, &SPI_InitStructure);

  211.     /* Enable SPI  */
  212.     SPI_Cmd(ADS1248_SPI, ENABLE);
  213. }

  214. /*******************************************************************************
  215. * @Function Name: ADS1248_ReadByte
  216. * @Description  : Reads a byte from the SPI Device
  217. * @param                : void
  218. * @retval                   : u8 Byte Read from the SPI Device
  219. * @date                           : 2014/10/04
  220. *******************************************************************************/
  221. u8 ADS1248_ReadByte(void)
  222. {
  223.     return (ADS1248_WriteByte(ADS_NOP));
  224. }

  225. /*******************************************************************************
  226. * @Function Name: ADS1248_WriteByte
  227. * @Description  : Sends a byte through the SPI interface and return the byte received from the SPI bus.
  228. * @param                : u8 data byte to send
  229. * @retval                   : u8 The value of the received byte
  230. * @date                           : 2014/10/04
  231. *******************************************************************************/
  232. u8 ADS1248_WriteByte(u8 data)
  233. {
  234.     /* Loop while DR register in not emplty */
  235.     while(SPI_I2S_GetFlagStatus(ADS1248_SPI, SPI_I2S_FLAG_TXE) == RESET);

  236.     /* Send u8 through the SPI bus peripheral */
  237.     SPI_I2S_SendData(ADS1248_SPI, data);

  238.     /* Wait to receive a u8 */
  239.     while(SPI_I2S_GetFlagStatus(ADS1248_SPI, SPI_I2S_FLAG_RXNE) == RESET);

  240.     /* Return the u8 read from the SPI bus */
  241.     return SPI_I2S_ReceiveData(ADS1248_SPI);
  242. }

  243. /*******************************************************************************
  244. * @Function Name: ADS1248_SetIDAC
  245. * @Description  :
  246. * @param                : u8 idac1
  247. * @param                : u8 idac2
  248. * @param                : u8 idacImage
  249. * @retval                   : void
  250. * @date                           : 2014/10/04
  251. *******************************************************************************/
  252. void ADS1248_SetIDAC(u8 idac1, u8 idac2, u8 idacImage)
  253. {
  254.     ADS1248_WriteByte(ADS_WREG | ADS_IDAC0);
  255.     ADS1248_WriteByte(0x01);
  256.     ADS1248_WriteByte(idacImage);
  257.     ADS1248_WriteByte(idac1 | idac2);
  258. }

  259. /*******************************************************************************
  260. * @Function Name: ADS1248_SetPGAGainAndDataRate
  261. * @Description  : Set PGA gain and data rate (SPS)
  262. * @param                : u8 pgaGain
  263. * @param                : u8 dataRate
  264. * @retval                   : void
  265. * @date                           : 2014/10/04
  266. *******************************************************************************/
  267. void ADS1248_SetPGAGainAndDataRate(u8 pgaGain, u8 dataRate)
  268. {
  269.     ADS1248_WriteByte(ADS_WREG | ADS_SYS0);
  270.     ADS1248_WriteByte(0x00);
  271.     ADS1248_WriteByte(pgaGain | dataRate);
  272. }

  273. /*******************************************************************************
  274. * @Function Name: ADS1248_SetInputChannel
  275. * @Description  :
  276. * @param                : u8 positiveChannel
  277. * @param                : u8 negativeChannel
  278. * @retval                   : void
  279. * @date                           : 2014/10/04
  280. *******************************************************************************/
  281. void ADS1248_SetInputChannel(u8 positiveChannel, u8 negativeChannel)
  282. {
  283.     ADS1248_WriteByte(ADS_WREG | ADS_MUX0);
  284.     ADS1248_WriteByte(0x00);
  285.     ADS1248_WriteByte(positiveChannel | negativeChannel);
  286. }

  287. /*******************************************************************************
  288. * @Function Name: ADS1248_SetReference
  289. * @Description  :
  290. * @param                : u8 interVrefOnOff
  291. * @param                : u8 refSelected
  292. * @retval                   : void
  293. * @date                           : 2014/10/04
  294. *******************************************************************************/
  295. void ADS1248_SetReference(u8 interVrefOnOff, u8 refSelected)
  296. {
  297.     ADS1248_WriteByte(ADS_WREG | ADS_MUX1);
  298.     ADS1248_WriteByte(0x00);
  299.     ADS1248_WriteByte(interVrefOnOff | refSelected);
  300. }

  301. /*******************************************************************************
  302. * @Function Name: ADS1248_ReadREG
  303. * @Description  : 读取寄存器的第byteToRead个字节
  304. * @param                : u8 regName
  305. * @param                : u8 byteToRead
  306. * @retval                   : u8
  307. * @date                           : 2014/10/05
  308. *******************************************************************************/
  309. u8 ADS1248_ReadREG(u8 regName, u8 byteToRead)
  310. {
  311.     ADS1248_WriteByte(ADS_RREG | regName);

  312.     if(byteToRead == 1)
  313.     {
  314.         ADS1248_WriteByte(0x00);
  315.     }
  316.     else if(byteToRead == 2)
  317.     {
  318.         ADS1248_WriteByte(0x01);
  319.         ADS1248_ReadByte();
  320.     }

  321.     return ADS1248_ReadByte();
  322. }

  323. /*******************************************************************************
  324. * @Function Name: ADS1248_ReadADC
  325. * @Description  : 返回有符号数值
  326. * @retval                   : s32
  327. * @date                           : 2014/10/04
  328. *******************************************************************************/
  329. s32 ADS1248_ReadADC()
  330. {
  331.     u8 temp[3];
  332.     s32 adcVal = 0;

  333. //    while(ADS1248_READY_PIN()) //DRDY引脚高电平表示数据没准备好
  334. //    {
  335. //    }

  336.     if(ADS1248_READY_PIN()) //DRDY引脚高电平表示数据没准备好
  337.     {
  338.         return 0;
  339.     }

  340.     ADS1248_WriteByte(ADS_RDATA);
  341.     temp[0] = ADS1248_ReadByte();
  342.     temp[1] = ADS1248_ReadByte();
  343.     temp[2] = ADS1248_ReadByte();

  344.     adcVal = (s32)(temp[0] << 24) + (temp[1] << 16) + (temp[2] << 8); // 左移8位,放大256倍识别正负号

  345.     return (adcVal >> 8); // 右移8位恢复原值
  346. }

  347. /*******************************************************************************
  348. * @Function Name: ADS1248_ResToTemp
  349. * @Description  : 二分法查表,将PT100的电阻值转为对应温度0-100
  350. * @param                : float resistance
  351. * @retval                   : float
  352. * @date                           : 2014/10/06
  353. *******************************************************************************/
  354. float ADS1248_ResToTemp(float resistance)
  355. {
  356.     u16 low = 0;
  357.     u16 mid = sizeof(pt100_table) / sizeof(pt100_table[0]) / 2;
  358.     u16 high = sizeof(pt100_table) / sizeof(pt100_table[0]) - 1;

  359.     if((resistance < pt100_table[0]) || (resistance > pt100_table[high]))
  360.     {
  361.         return -1; // 超限,不做特殊处理
  362.     }

  363.     while(high >= low)
  364.     {
  365.         mid = (high + low) / 2;

  366.         if(resistance >= pt100_table[mid])
  367.         {
  368.             if(resistance < pt100_table[mid + 1])
  369.             {
  370.                 return (0.1 * low + (resistance - pt100_table[mid]) * 0.1 / ((pt100_table[mid + 1]) - pt100_table[mid]));
  371.                 break;
  372.             }
  373.             else
  374.             {
  375.                 low = mid + 1;
  376.             }
  377.         }
  378.         else if(resistance < pt100_table[mid])
  379.         {
  380.             high = mid - 1;
  381.         }
  382.     }
  383. }

  384. /*****************************************END OF FILE**********************************/
复制代码

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-10-7 21:00:52 | 显示全部楼层
用查表法么?直接用公式计算对STM32来说也够用。

出130入129汤圆

 楼主| 发表于 2014-10-7 21:08:38 | 显示全部楼层
lingdianhao 发表于 2014-10-7 21:00
用查表法么?直接用公式计算对STM32来说也够用。

肉眼看表格比较直观

出0入0汤圆

发表于 2014-10-7 21:11:29 | 显示全部楼层
收藏了,多谢楼主。

出0入4汤圆

发表于 2014-10-7 21:29:15 | 显示全部楼层
收藏了   。。。

出0入0汤圆

发表于 2014-10-7 21:39:12 | 显示全部楼层
谢谢了,参考一下

出130入129汤圆

 楼主| 发表于 2014-10-16 21:50:02 | 显示全部楼层
我是楼主,纠正下上面 二分法函数里面的一个BUG,会引起不小误差

红色地方原来是low,应该mid才对,我调了几天程序,总是发现读数偶尔会波动过大,查了1天才发现是这里打错了

float ADS1248_ResToTemp(float resistance)
{
    u16 low = 0;
    u16 mid = sizeof(pt100_table) / sizeof(pt100_table[0]) / 2;
    u16 high = sizeof(pt100_table) / sizeof(pt100_table[0]) - 1;

    if((resistance < pt100_table[0]) || (resistance > pt100_table[high]))
    {
        return -1; // 超限,不做特殊处理
    }

    while(high >= low)
    {
        mid = (high + low) / 2;

        if(resistance >= pt100_table[mid])
        {
            if(resistance < pt100_table[mid + 1])
            {
                return (0.1 * mid + (resistance - pt100_table[mid]) * 0.1 / ((pt100_table[mid + 1]) - pt100_table[mid]));
            }
            else
            {
                low = mid + 1;
            }
        }
        else if(resistance < pt100_table[mid])
        {
            high = mid - 1;
        }
    }

    return -1; // 查找失败,不做特殊处理
}

出0入0汤圆

发表于 2014-10-16 22:45:58 | 显示全部楼层
嗯,不错,支持,有空玩一下PT100

出0入0汤圆

发表于 2014-10-16 22:52:25 | 显示全部楼层
支持开源,顶一下

出0入0汤圆

发表于 2014-10-17 20:46:12 | 显示全部楼层
楼主,能否传一个完整的STM32的工程上来,学习下,谢谢

出130入129汤圆

 楼主| 发表于 2014-10-17 21:28:07 | 显示全部楼层
本帖最后由 68336016 于 2014-10-18 09:31 编辑
xyz2008 发表于 2014-10-17 20:46
楼主,能否传一个完整的STM32的工程上来,学习下,谢谢


特地花了10几分钟将自己正在的项目精简掉,发给你参考,仅供参考

FreeRTOS+STM32+ADS1248

这个附近有个错误,在精简时候搞错2个变量位置,请下载后面那个


正确的附近是这个

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-10-17 23:19:58 | 显示全部楼层
PT100 ADS1248 , 记下了

出0入0汤圆

发表于 2014-10-18 00:44:39 | 显示全部楼层
68336016 发表于 2014-10-17 21:28
特地花了10几分钟将自己正在的项目精简掉,发给你参考,仅供参考

FreeRTOS+STM32+ADS1248

感谢楼主,这个公式不知道怎么推导出来的res = (ADS1248_ReadADC() * 2 * 120 / 0x7fffff) / 64 + 1000;

出130入129汤圆

 楼主| 发表于 2014-10-18 01:04:00 来自手机 | 显示全部楼层
xyz2008 发表于 2014-10-18 00:44
感谢楼主,这个公式不知道怎么推导出来的res = (ADS1248_ReadADC() * 2 * 120 / 0x7fffff) / 64 + 1000; ...

我是用REF0上的外电压当做基准源,1000是Rbias阻值,120是Rcomp阻值,64是PGA增益倍数,恒流源设置为1mA,其实就是比例法测电阻

出0入0汤圆

发表于 2014-10-18 01:14:25 | 显示全部楼层
68336016 发表于 2014-10-18 01:04
我是用REF0上的外电压当做基准源,1000是Rbias阻值,120是Rcomp阻值,64是PGA增益倍数,恒流源设置为1mA ...

比例法测电阻视乎也推导不出来这样的公式啊,有没有相关的资料,给论坛传一份,还有为什么乘以2

出130入129汤圆

 楼主| 发表于 2014-10-18 02:46:33 | 显示全部楼层
xyz2008 发表于 2014-10-18 01:14
比例法测电阻视乎也推导不出来这样的公式啊,有没有相关的资料,给论坛传一份,还有为什么乘以2 ...

没有资料,就只有pdf

Rbiad是2个恒流源电流,所以有个系数2

出0入8汤圆

发表于 2014-10-18 03:30:21 | 显示全部楼层
弱弱的问下   是不是买PT100的时候卖家会给个电阻表格    还是自己下的        我买了一个pt1000   ,不知道啥牌子   也没表格

出130入129汤圆

 楼主| 发表于 2014-10-18 04:06:40 来自手机 | 显示全部楼层
justdomyself 发表于 2014-10-18 03:30
弱弱的问下   是不是买PT100的时候卖家会给个电阻表格    还是自己下的        我买了一个pt1000   ,不知 ...

是利用铂电阻的特性,不用管什么厂家

出0入8汤圆

发表于 2014-10-18 06:06:29 | 显示全部楼层
68336016 发表于 2014-10-18 04:06
是利用铂电阻的特性,不用管什么厂家

const float pt100_table[1001] =/*PT100 0-100度对应的电阻值,0.1度间隔*/


总不能每一个铂电阻都是你这个表格吧  没有个体的差异么  

出130入129汤圆

 楼主| 发表于 2014-10-18 06:18:55 | 显示全部楼层
justdomyself 发表于 2014-10-18 06:06
const float pt100_table[1001] =/*PT100 0-100度对应的电阻值,0.1度间隔*/

不同价钱的质量明显不同,铂电阻还有什么一级二级标准电阻,那些好像是天价。

但是我们平时能买到的,都是统一表格 ,都是理论值,实际跟杂质啊,工艺啊估计都多少有关系,不能100%理论化。

像我6个小时之前,2个PT100同时开始测量,当时调节温度是一模一样的,现在两个已经相差0.02度了

出0入0汤圆

发表于 2014-10-18 09:22:04 | 显示全部楼层
68336016 发表于 2014-10-18 06:18
不同价钱的质量明显不同,铂电阻还有什么一级二级标准电阻,那些好像是天价。

但是我们平时能买到的,都 ...

楼主,为什么我按你这个图算出来的公式如下呢,解释下
res = (ADS1248_ReadADC() * 2 * 1000 / 0x7fffff) / 64 + 120;

本帖子中包含更多资源

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

x

出130入129汤圆

 楼主| 发表于 2014-10-18 09:36:55 | 显示全部楼层
本帖最后由 68336016 于 2014-10-18 09:38 编辑
xyz2008 发表于 2014-10-18 09:22
楼主,为什么我按你这个图算出来的公式如下呢,解释下
res = (ADS1248_ReadADC() * 2 * 1000 / 0x7fffff) ...


你是对的,我昨天在精简代码时候,将一些变量替换成常量(因为这个2个精密电阻值我是当作系数存在EEPROM的,所以用变量),由于连续N天敲代码,眼花搞错了
已在原楼层补充正确代码压缩包

Rbias我用的是1K,Rcomp用的是120欧姆,这样测量0-100度范围,增益64倍

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-10-18 09:43:39 | 显示全部楼层
感谢楼主热心指导,谢谢

出0入0汤圆

发表于 2014-10-19 12:15:51 | 显示全部楼层
谢谢分享。

出0入0汤圆

发表于 2014-10-19 12:23:50 | 显示全部楼层

谢谢分享。

出0入0汤圆

发表于 2014-10-19 15:13:59 来自手机 | 显示全部楼层
mark      

出0入0汤圆

发表于 2014-10-19 19:58:23 | 显示全部楼层
收藏一下。。

出0入0汤圆

发表于 2014-10-22 02:07:04 | 显示全部楼层
楼主,还有一事不明,就是楼主查表的表格,是怎么算出来的,比如,我 想以1欧姆为单位建立一个表格,然后查表,应该怎么算,是不是有一个公式什么呀

出130入129汤圆

 楼主| 发表于 2014-10-22 04:47:08 来自手机 | 显示全部楼层
xyz2008 发表于 2014-10-22 02:07
楼主,还有一事不明,就是楼主查表的表格,是怎么算出来的,比如,我 想以1欧姆为单位建立一个表格,然后查 ...

表格其实是通过公式算出的,我是在老外网站下载的,具体忘记了,你可以搜索下 铂电阻公式

出0入0汤圆

发表于 2014-10-23 21:43:02 | 显示全部楼层
我怎么打开内部参考源,用万用表量不出2.04v的电压?一直都是0v,请问是什么原因,是知道吗,谢谢回答?

出130入129汤圆

 楼主| 发表于 2014-10-23 21:45:20 | 显示全部楼层
本帖最后由 68336016 于 2014-10-23 21:48 编辑
finelei2002 发表于 2014-10-23 21:43
我怎么打开内部参考源,用万用表量不出2.04v的电压?一直都是0v,请问是什么原因,是知道吗,谢谢回答? ...


ADS1248_SetReference(REF_Inter_AlwaysOn, SELT_Inter);            // 设置内部基准为参考源

这句就是启动内部参考源,在VREF VCOM引脚可以测到2.048V电源

不过在我的代码里,内部AD用的基准无论是内部还是外部,内部基准都是一样要启动的,因为恒流源要依赖内部基准源。

有一点要注意,设置完基准源后,要给够足够的延时,你可以调整下后面的延时大小

出0入0汤圆

发表于 2014-10-23 21:50:20 | 显示全部楼层
用fpga做过 不知道你这个能到几位

出0入0汤圆

发表于 2014-10-23 21:54:14 | 显示全部楼层
最近刚好要用到PT100 学习下

出0入0汤圆

发表于 2014-10-29 09:38:11 | 显示全部楼层
为什么不直接用STM32的ADC来采集电压呢?

出130入129汤圆

 楼主| 发表于 2014-10-29 09:42:27 | 显示全部楼层
xinmulan 发表于 2014-10-29 09:38
为什么不直接用STM32的ADC来采集电压呢?

STM32的AD只有12位,太低了。

出0入0汤圆

发表于 2014-10-29 09:46:22 | 显示全部楼层
我就想测量一个0-100度温度,STM32自己的ADC应该够用了吧

出130入129汤圆

 楼主| 发表于 2014-10-29 09:56:00 | 显示全部楼层
xinmulan 发表于 2014-10-29 09:46
我就想测量一个0-100度温度,STM32自己的ADC应该够用了吧

那你得用电桥法,将0度时候100欧姆这个电压消除掉,不然0-100度对应电阻是100欧姆-139欧姆,放大倍数很有限。
再说了,还得接运放,还得考虑差分电阻配对,很理想化

我用ADS1248要考虑的精密电阻只有2个,而且如果放大倍数低点,只需考虑1个精密电阻就够了,即使电阻误差0.1%都问题不大。

你自己要搭建前面这些电桥,运放电路什么的,我不信你能那么容易把合格的电阻凑齐。

你参考下这文章,看完后绝对收获不少,作者也是论坛的一位高人。
铂电阻Pt100与温度测试

出0入0汤圆

发表于 2014-10-29 11:41:22 | 显示全部楼层
确实是这么的,看来我是想的简单了。没有实际做过

出0入0汤圆

发表于 2014-11-4 19:48:57 | 显示全部楼层
我看了你的PT100的方案,感觉好很实用。谢谢你的分享。
我想DIY一个电脑风扇的控制器。自己的风扇太吵了
读取温度用PID的算法,通过调整PWM调整风扇的转速。。
通过usb接口可以调整各种参数。
不知道使用操作系统好呢,还是自己调度方便呢。另外你会freertos下usb的编程不呢
谢谢了,上班时间太紧。没有什么时间。。所以想问问大虾

出0入97汤圆

发表于 2014-12-5 09:14:24 | 显示全部楼层
本帖最后由 hero245 于 2014-12-5 10:35 编辑

你好,我想问一下,PT100是怎么接到JP1的端子上。
我买的PT100是两根线的要怎么接。



是A还是B呢?

我想用ADS1248测试 PT100,但手册是英文的,看了两天,看得云里雾里的。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2014-12-25 14:59:05 | 显示全部楼层
楼主,能把硬件原理图全部传上来吗,想借你的学习一下!!

出0入53汤圆

发表于 2014-12-25 15:06:02 | 显示全部楼层
68336016 发表于 2014-10-29 09:56
那你得用电桥法,将0度时候100欧姆这个电压消除掉,不然0-100度对应电阻是100欧姆-139欧姆,放大倍数很有 ...

ADS1248 数据能稳定在多少位不跳动?

出0入0汤圆

发表于 2014-12-25 16:23:00 来自手机 | 显示全部楼层
mark,回头研究一下

出0入0汤圆

发表于 2014-12-30 09:37:40 | 显示全部楼层
ADS1247、ADS1248,参考电压用的外部2.5V,当输入信号接成单端输入时,可测量的信号范围是多少呀?0~2.5V?还是0-5V?

出0入0汤圆

发表于 2015-1-14 16:10:38 | 显示全部楼层
楼主这个电路,能同时测量4路PT100的温度值吗?官网的原理图上怎么还加上了一个TS3A5017D 四路转换开关呢?

出0入85汤圆

发表于 2015-1-14 16:30:12 | 显示全部楼层
0~100° 量程,  0.1度分辨率?

出0入0汤圆

发表于 2015-1-14 23:17:05 | 显示全部楼层
这么好的东西,果断要顶啊

出0入0汤圆

发表于 2015-1-16 21:46:47 | 显示全部楼层
楼主您好,我最近在调试ADS1247,下载了你的代码,你的代码是在哪里显示读出值的啊,串口吗?请问这个读出来的数据是十进制的吗,还有怎么验证我成功驱动ADS1247,好为难啊,调了好久了

出0入0汤圆

发表于 2015-1-21 11:17:29 | 显示全部楼层
为什么 输出那个公式需要除以0x7fffff,解释下可以吗!!

出130入129汤圆

 楼主| 发表于 2015-1-21 11:23:23 | 显示全部楼层
本帖最后由 68336016 于 2015-1-21 11:28 编辑
电子学生 发表于 2015-1-21 11:17
为什么 输出那个公式需要除以0x7fffff,解释下可以吗!!


不好意思各位,这阵子事情很多,都没写过程序了,很多都没印象了。
为什么要除这个数?你看下ADS1247/ADS1248的手册吧,输入正电压、负电压该怎么计算,那手册里面写得很详细。
像读取一个PT100要怎么配置,按照什么顺序,手册是没写得很明白,但是各个寄存器含义,还有一些转换用的参数,手册都是有详细描述的。

本帖子中包含更多资源

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

x

出130入129汤圆

 楼主| 发表于 2015-1-21 11:31:02 | 显示全部楼层
电子学生 发表于 2015-1-16 21:46
楼主您好,我最近在调试ADS1247,下载了你的代码,你的代码是在哪里显示读出值的啊,串口吗?请问这个读出 ...

STM32都通过SPI读取到ADS1248的数值了,你想怎么显示就怎么显示,看你自己需求了。
你问怎么验证结果对不对?读取的温度跟室温大概比较下,不就知道了。

出130入129汤圆

 楼主| 发表于 2015-1-21 11:41:33 | 显示全部楼层
hero245 发表于 2014-12-5 09:14
你好,我想问一下,PT100是怎么接到JP1的端子上。
我买的PT100是两根线的要怎么接。

好久没注意到

本帖子中包含更多资源

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

x

出0入97汤圆

发表于 2015-1-21 13:23:42 | 显示全部楼层

谢谢你的回复,这个问题已经解决了。

还想问下,ADS1248AD值稳定吗?

我测试的时候有好像有8-9位有跳动的,温度跳动也有0.03-0.05度左右的跳动,一致性也有点差。

我测的是PT1000,测得电阻会偏大2-5欧,要每个都校准一下才能用。

下面的结果是  内部参考源,Rcomp=1000时测得 的温度误差,马马虎虎能用,就是感觉没将ADS1248用好,跳动有点大,误差也有点大。不知道问题出在哪里?

本帖子中包含更多资源

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

x

出130入129汤圆

 楼主| 发表于 2015-1-21 14:03:20 | 显示全部楼层
hero245 发表于 2015-1-21 13:23
谢谢你的回复,这个问题已经解决了。

还想问下,ADS1248AD值稳定吗?


ADS1248_SetPGAGainAndDataRate(PGAGain_8, DataRate_20);                // 设置PGA倍数和传输速率

我用PT100,PGA和速率设置为上面这个,同时采用比例法,温度小数点后面第二位偶尔会跳,如果采用内部参考源,跳动就比较厉害。

我买的PT100是40多块钱三线的,如果2,3个轮流接ADS1248同一个端口,温度小数点后面第二位有时会差1个数。

我觉得几十块钱的一致性不会很好,所以每个通道固定一个PT100,软件里面对每个通道都校准一次。

其它的我也不太懂,项目完成后没问题也没再去研究了。

出0入0汤圆

发表于 2015-1-21 15:38:54 | 显示全部楼层
68336016 发表于 2015-1-21 11:31
STM32都通过SPI读取到ADS1248的数值了,你想怎么显示就怎么显示,看你自己需求了。
你问怎么验证结果对不 ...

就是怎么验证SPI读出来的数据对不对,它好像是个很长的数据,有78位呢

出0入0汤圆

发表于 2015-1-21 15:43:41 | 显示全部楼层
68336016 发表于 2015-1-21 11:23
不好意思各位,这阵子事情很多,都没写过程序了,很多都没印象了。
为什么要除这个数?你看下ADS1247/ADS ...

我也看过这里,看了几遍,没看明白,他是说他的满偏值是0x7fffff,好像没写具体过程,所以就不太懂,主要还是英文的,头疼啊

出0入0汤圆

发表于 2015-1-21 16:31:10 | 显示全部楼层
楼主您好,温度超过100度,用查表法精确吗,还是用公式好!!

出130入129汤圆

 楼主| 发表于 2015-1-21 16:51:19 | 显示全部楼层
电子学生 发表于 2015-1-21 15:43
我也看过这里,看了几遍,没看明白,他是说他的满偏值是0x7fffff,好像没写具体过程,所以就不太懂,主要 ...

这个数含义你不清楚,AD分辨率总应该知道吧?
就是多少等分意思。

出130入129汤圆

 楼主| 发表于 2015-1-21 16:52:21 | 显示全部楼层
电子学生 发表于 2015-1-21 16:31
楼主您好,温度超过100度,用查表法精确吗,还是用公式好!!

表格其实也是公式计算出来的,单片机要是速度快,直接公式计算也可以,慢的话查表就行。

出0入0汤圆

发表于 2015-1-21 19:09:46 | 显示全部楼层
68336016 发表于 2015-1-21 16:51
这个数含义你不清楚,AD分辨率总应该知道吧?
就是多少等分意思。

这个是24位的ADC,不是应该是0xffffff吗,没怎么用过ADC,R(t)=R(0 ℃)×(1+At+Bt+Bt²),用公式法,是不是要解方程啊!!return (0.1 * low + (resistance - pt100_table[mid]) * 0.1 / ((pt100_table[mid + 1]) - pt100_table[mid]));

这个公式没看懂,不知道咋来的!!

出0入0汤圆

发表于 2016-3-15 12:00:35 | 显示全部楼层
不错的资料,谢谢楼主了。

出0入0汤圆

发表于 2016-3-23 10:47:30 | 显示全部楼层
不错的资料,谢谢楼主了。

出0入53汤圆

发表于 2016-3-23 14:56:47 | 显示全部楼层
lzADS1248 抗干扰能力怎么样?还有稳定数据读数是多少位,记得当时测试ADS1247读取数据稳定在16bit

出0入0汤圆

发表于 2016-9-10 17:31:09 | 显示全部楼层
现在ad读出来的数据是乱的,120欧姆跟470欧姆的AD数据差的特别少,是为什么?

出0入0汤圆

发表于 2016-9-10 18:00:46 | 显示全部楼层
收藏了,多谢楼主。

出0入0汤圆

发表于 2016-9-13 22:00:17 | 显示全部楼层
楼主这个PT100温度采集看来还不错,没有机会验证,有没有完整的电路图呢

出0入0汤圆

发表于 2016-11-22 11:25:28 | 显示全部楼层
你好,我想做一个温度检测功能,想用你的方案。老板给的时间太短了,可以买你的方案吗?

出0入0汤圆

发表于 2016-11-22 11:25:53 | 显示全部楼层
你好,我想做一个温度检测功能,想用你的方案。老板给的时间太短了,可以买你的方案吗?

出130入129汤圆

 楼主| 发表于 2016-11-23 04:48:04 来自手机 | 显示全部楼层
dyl 发表于 2016-11-22 11:25
你好,我想做一个温度检测功能,想用你的方案。老板给的时间太短了,可以买你的方案吗? ...

电路图和代码我在楼主位都有啊,也就是stm32的spi引脚加上几个控制引脚,代码里都用宏定义的,你只需要修改宏定义就可以。
至于读取温度,代码里也有现成的函数。
这ads1248,只要电路图对了,读写时序对了,都挺简单的。
先用我的代码调通能读取了,再根据自己需求修改代码。

出0入0汤圆

发表于 2016-11-23 09:45:13 | 显示全部楼层
先收藏,后备用,谢谢分享~

出235入235汤圆

发表于 2016-11-23 09:53:59 | 显示全部楼层
68336016 发表于 2016-11-23 04:48
电路图和代码我在楼主位都有啊,也就是stm32的spi引脚加上几个控制引脚,代码里都用宏定义的,你只需要修 ...

楼主你好,不知道您测试的时候一个比较稳定的温度环境时。温度度数可以稳定到那个级别呢。就是温度分辨率,并非温度的精度。

出0入0汤圆

发表于 2016-11-30 12:18:53 | 显示全部楼层
谢谢楼主分享。直接用了,非常好。以前用模拟开关和运放做,不光PCB面积,元件加起来都贵过1248了。一片1248解决所有。

出0入0汤圆

发表于 2016-12-5 14:41:03 | 显示全部楼层
好帖子留个记号;STM32+ADS1248+PT100代码

出0入0汤圆

发表于 2016-12-8 22:47:43 | 显示全部楼层
还不错,有用的着的地方可以借鉴下

出0入0汤圆

发表于 2016-12-30 09:39:07 | 显示全部楼层
MARK,借鉴

出0入0汤圆

发表于 2017-4-8 13:15:08 | 显示全部楼层
好贴,现在正在考虑用pt100测温,谢谢,楼主分享!

出0入0汤圆

发表于 2017-4-15 16:31:30 | 显示全部楼层
用楼主的代码解决了问题,谢谢楼主!

出0入0汤圆

发表于 2017-4-24 20:57:14 | 显示全部楼层
谢谢楼主,后面也会学校PT100温度测量

出0入0汤圆

发表于 2017-5-27 11:39:57 | 显示全部楼层
mark,谢谢楼主

出0入0汤圆

发表于 2017-5-31 16:23:05 | 显示全部楼层
谢谢楼主分享,我们用到PT100测温,参考下

出0入0汤圆

发表于 2017-12-30 10:24:46 | 显示全部楼层
谢谢楼主分享的资料  

出5入10汤圆

发表于 2018-1-22 17:31:35 | 显示全部楼层
楼主恒流源从IDAC1_AIN0, IDAC2_AIN1,转到IDAC1_AIN2, IDAC2_AIN3通道时,看你的程序每次都从新设置恒流源,是没用过一次,恒流源会自己关闭吗? 这恒流源就一组,每次使用它时只开到你开启,没看到在哪里关闭了

出0入0汤圆

发表于 2018-1-24 13:03:38 | 显示全部楼层
不错的资料,正好在学习温度检测,谢谢楼主了

出0入0汤圆

发表于 2018-2-26 18:17:35 | 显示全部楼层
刚好要用到ADS1248测温,谢谢楼主的分享

出0入0汤圆

发表于 2018-2-26 19:32:49 | 显示全部楼层
PT100 ADS1248 , 记下了

出0入0汤圆

发表于 2018-2-27 16:07:53 | 显示全部楼层
不错,学习了,着手做一下,谢谢楼主分享

出0入0汤圆

发表于 2018-3-3 10:00:58 | 显示全部楼层
战略mark:STM32+ADS1248+PT100

出0入0汤圆

发表于 2018-5-9 10:52:47 | 显示全部楼层
谢谢楼主分享

出0入0汤圆

发表于 2018-5-20 23:10:10 | 显示全部楼层
谢谢楼主,做个记号。

出0入0汤圆

发表于 2018-5-21 08:56:26 | 显示全部楼层
PT100 ADS1248,先测试一下稳定性如何,再研究温度读数不再跳动的问题。

出0入0汤圆

发表于 2018-5-23 16:44:17 | 显示全部楼层
mark,ads1248+pt100

出0入0汤圆

发表于 2018-8-4 20:52:20 | 显示全部楼层
谢谢,分享。

出0入0汤圆

发表于 2018-8-17 16:05:56 | 显示全部楼层
STM32+ADS1248+PT100,谢谢楼主分享!

出0入0汤圆

发表于 2018-8-17 16:15:31 | 显示全部楼层
谢谢分享非常不错

出0入0汤圆

发表于 2018-10-21 23:01:10 | 显示全部楼层
谢谢分享非常不错

出200入0汤圆

发表于 2019-1-17 08:51:10 来自手机 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2019-1-17 11:25:06 | 显示全部楼层
PT100 marker 一下,过后再看

出0入0汤圆

发表于 2019-1-17 11:43:16 | 显示全部楼层
好资料,学习一下。

出0入0汤圆

发表于 2019-1-17 11:57:54 | 显示全部楼层
MARK,借鉴           

出0入0汤圆

发表于 2019-11-17 14:58:31 | 显示全部楼层
楼主,你这个精度能做到什么程序!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 19:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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