找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3984|回复: 3
收起左侧

求助关AD7705双通道STC15F2K60S2单片机读取问题

[复制链接]
ID:38631 发表于 2018-6-10 13:25 | 显示全部楼层 |阅读模式
STC15F2K60S2、晶振11.0592、AD7705晶振2.4576、基准2.485V、串口波特率9600
AIN1和AIN2并联同时接输入信号67mV左右下面是串口接收到的不同增益时读到的数据
CH1: 1                                CH2: 16
CH1=28047 ( 2139mV) CH2=28352 ( 2163mV)
CH1=28047 ( 2139mV) CH2=28352 ( 2163mV)
CH1=28047 ( 2139mV) CH2=28352 ( 2163mV)
CH1=28046 ( 2139mV) CH2=28352 ( 2163mV)
CH1=28046 ( 2139mV) CH2=28351 ( 2163mV)
CH1=28046 ( 2139mV) CH2=28352 ( 2163mV)

CH1: 16                                CH2: 1
CH1= 2035 (  155mV) CH2= 1772 (  135mV)
CH1= 2035 (  155mV) CH2= 1772 (  135mV)
CH1= 2035 (  155mV) CH2= 1772 (  135mV)
CH1= 2035 (  155mV) CH2= 1772 (  135mV)
CH1= 2035 (  155mV) CH2= 1772 (  135mV)
CH1= 2035 (  155mV) CH2= 1772 (  135mV)

CH1: 1                                  CH2: 1
CH1= 1772 (  135mV) CH2= 1772 (  135mV)
CH1= 1773 (  135mV) CH2= 1772 (  135mV)
CH1= 1773 (  135mV) CH2= 1772 (  135mV)
CH1= 1772 (  135mV) CH2= 1772 (  135mV)
CH1= 1773 (  135mV) CH2= 1772 (  135mV)
CH1= 1773 (  135mV) CH2= 1772 (  135mV)

CH1: 16                                CH2: 16
CH1=28354 ( 2163mV) CH2=28352 ( 2163mV)
CH1=28355 ( 2163mV) CH2=28351 ( 2163mV)
CH1=28355 ( 2163mV) CH2=28352 ( 2163mV)
CH1=28355 ( 2163mV) CH2=28351 ( 2163mV)
CH1=28355 ( 2163mV) CH2=28351 ( 2163mV)
CH1=28355 ( 2163mV) CH2=28352 ( 2163mV)

两个通道设不同增益时读到的数据不对
程序是本站找的按电路改了一下请各位帮忙看一下哪里不对。

以下是部分代码
  1.         uint16_t adc1, adc2;
  2.         
  3.         bsp_InitTM7705();                        /* 初始化配置TM7705 */

  4.         TM7705_CalibSelf(1);                /* 自校准。执行时间较长,约180ms */               
  5.         adc1 = TM7705_ReadAdc(1);                                
  6.         
  7.         TM7705_CalibSelf(2);                /* 自校准。执行时间较长,约180ms */
  8.         adc2 = TM7705_ReadAdc(2);        
  9.         
  10.         while (1)
  11.         {        
  12.                 bsp_Idle();               

  13.                 #if 1        
  14.                         /* 双通道切换采样,执行一轮实际那约 160ms */                        
  15.                         adc1 = TM7705_ReadAdc(1);        /* 执行时间 80ms */               
  16.                         adc2 = TM7705_ReadAdc(2);        /* 执行时间 80ms */
  17.                 #else
  18.                         /* 如果只采集1个通道,则刷新速率 50Hz (缺省设置的,最大可以设置为500Hz) */
  19.                         adc1 = TM7705_ReadAdc(1);        /* 执行时间 20ms (50Hz速率刷新时) */               
  20.                         adc2 = 0;
  21.                 #endif
  22.                         
  23.                 /* 打印采集数据 */
  24.                 {
  25.                         int volt1, volt2;
  26.                         
  27.                         /* 计算实际电压值(近似估算的),如需准确,请进行校准 */
  28.                         volt1 = ((int32_t)adc1 * 5000) / 65535;
  29.                         volt2 = ((int32_t)adc2 * 5000) / 65535;
  30.                         
  31.                         /* 打印ADC采样结果 */        
  32.                         printf("CH1=%5ld (%5dmV) CH2=%5ld (%5dmV)\r\n", (long int)adc1, volt1, (long int)adc2, volt2);
  33.                 }
  34.         }
复制代码
  1. /*
  2. *********************************************************************************************************
  3. *
  4. *        模块名称 : TM7705 驱动模块(2通道带PGA的16位ADC)
  5. *        文件名称 : bsp_tm7705.c
  6. *        版    本 : V1.0
  7. *        说    明 : TM7705模块和CPU之间采用SPI接口。本驱动程序支持软件SPI接口。
  8. *
  9. *        修改记录 :
  10. *                版本号  日期        作者     说明
  11. *                V1.0    2013-10-20  armfly  正式发布
  12. *
  13. *        Copyright (C), 2013-2014, 安富莱电子 www.armfly.com
  14. *
  15. *********************************************************************************************************
  16. */

  17. #include "bsp.h"

  18. #define SOFT_SPI                /* 定义此行表示使用GPIO模拟SPI接口 */
  19. //#define HARD_SPI                /* 定义此行表示使用CPU的硬件SPI接口 */

  20. /* 通道1和通道2的增益,输入缓冲,极性 */
  21. #define __CH1_GAIN_BIPOLAR_BUF        (GAIN_1 | UNIPOLAR | BUF_EN)
  22. #define __CH2_GAIN_BIPOLAR_BUF        (GAIN_16 | UNIPOLAR | BUF_EN)

  23. /*                                                                                
  24.         接线方法: STC89C52开发板,请使用杜邦线连接。

  25.     TM7705模块   STC89C52开发板
  26.       VCC   ------  5.0V (3.3V)
  27.       GND   ------  GND
  28.       CS    ------  P1.0
  29.       RST   ------  P1.1   
  30.       DIN   ------  P1.2
  31.           SCK   ------  P1.3
  32.       DOUT  ------  P1.4
  33.       DRDY  ------  P1.5        
  34. */

  35. #if !defined(SOFT_SPI) && !defined(HARD_SPI)
  36.          #error "Please define SPI Interface mode : SOFT_SPI or HARD_SPI"
  37. #endif

  38. #ifdef SOFT_SPI                /* 软件SPI */
  39.         /* 定义GPIO端口 */
  40.         sbit CS     = P1^0;
  41.         sbit RESET  = P1^1;
  42.         sbit DIN    = P3^7;
  43.         sbit SCK    = P4^1;
  44.         sbit DOUT   = P3^6;
  45.         sbit DRDY        = P3^5;

  46.         /* 定义口线置0和置1的宏 */
  47.         #define CS_0()                CS = 0
  48.         #define CS_1()                CS = 1

  49.         #define RESET_0()        RESET = 0
  50.         #define RESET_1()        RESET = 1

  51.         #define DI_0()                DIN = 0
  52.         #define DI_1()                DIN = 1

  53.         #define SCK_0()                SCK = 0
  54.         #define SCK_1()                SCK = 1

  55.         #define DO_IS_HIGH()        (DOUT != 0)

  56.         #define DRDY_IS_LOW()        (DRDY == 0)
  57. #endif

  58. #ifdef HARD_SPI                /* 硬件SPI */
  59.         #error "Don't surport Hard SPI Interface mode"
  60. #endif

  61. /* 通信寄存器bit定义 */
  62. enum
  63. {
  64.         /* 寄存器选择  RS2 RS1 RS0  */
  65.         REG_COMM        = 0x00,        /* 通信寄存器 */
  66.         REG_SETUP        = 0x10,        /* 设置寄存器 */
  67.         REG_CLOCK        = 0x20,        /* 时钟寄存器 */
  68.         REG_DATA        = 0x30,        /* 数据寄存器 */
  69.         REG_ZERO_CH1        = 0x60,        /* CH1 偏移寄存器 */
  70.         REG_FULL_CH1        = 0x70,        /* CH1 满量程寄存器 */
  71.         REG_ZERO_CH2        = 0x61,        /* CH2 偏移寄存器 */
  72.         REG_FULL_CH2        = 0x71,        /* CH2 满量程寄存器 */

  73.         /* 读写操作 */
  74.         WRITE                 = 0x00,        /* 写操作 */
  75.         READ                 = 0x08,        /* 读操作 */

  76.         /* 通道 */
  77.         CH_1                = 0,        /* AIN1+  AIN1- */
  78.         CH_2                = 1,        /* AIN2+  AIN2- */
  79.         CH_3                = 2,        /* AIN1-  AIN1- */
  80.         CH_4                = 3                /* AIN1-  AIN2- */
  81. };

  82. /* 设置寄存器bit定义 */
  83. enum
  84. {
  85.         MD_NORMAL                = (0 << 6),        /* 正常模式 */
  86.         MD_CAL_SELF                = (1 << 6),        /* 自校准模式 */
  87.         MD_CAL_ZERO                = (2 << 6),        /* 校准0刻度模式 */
  88.         MD_CAL_FULL                = (3 << 6),        /* 校准满刻度模式 */

  89.         GAIN_1                        = (0 << 3),        /* 增益 */
  90.         GAIN_2                        = (1 << 3),        /* 增益 */
  91.         GAIN_4                        = (2 << 3),        /* 增益 */
  92.         GAIN_8                        = (3 << 3),        /* 增益 */
  93.         GAIN_16                        = (4 << 3),        /* 增益 */
  94.         GAIN_32                        = (5 << 3),        /* 增益 */
  95.         GAIN_64                        = (6 << 3),        /* 增益 */
  96.         GAIN_128                = (7 << 3),        /* 增益 */

  97.         /* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
  98.         BIPOLAR                        = (0 << 2),        /* 双极性输入 */
  99.         UNIPOLAR                = (1 << 2),        /* 单极性输入 */

  100.         BUF_NO                        = (0 << 1),        /* 输入无缓冲(内部缓冲器不启用) */
  101.         BUF_EN                        = (1 << 1),        /* 输入有缓冲 (启用内部缓冲器) */

  102.         FSYNC_0                        = 0,
  103.         FSYNC_1                        = 1                /* 不启用 */
  104. };

  105. /* 时钟寄存器bit定义 */
  106. enum
  107. {
  108.         CLKDIS_0        = 0x00,                /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
  109.         CLKDIS_1        = 0x10,                /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */

  110.         /*
  111.                 2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “0”。
  112.                 1MHz (CLKDIV=0 )或 2MHz   (CLKDIV=1 ),CLK 该位应置  “1”
  113.         */
  114.         CLK_4_9152M = 0x08,
  115.         CLK_2_4576M = 0x00,
  116.         CLK_1M                 = 0x04,
  117.         CLK_2M                 = 0x0C,

  118.         FS_50HZ                = 0x00,
  119.         FS_60HZ                = 0x01,
  120.         FS_250HZ        = 0x02,
  121.         FS_500HZ        = 0x04,

  122.         /*
  123.                 四十九、电子秤应用中提高TM7705 精度的方法
  124.                         当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。
  125.                         当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据
  126.         */
  127.         ZERO_0                = 0x00,
  128.         ZERO_1                = 0x80
  129. };

  130. static void TM7705_SyncSPI(void);
  131. static void TM7705_Send8Bit(uint8_t _data);
  132. static uint8_t TM7705_Recive8Bit(void);
  133. static void TM7705_WriteByte(uint8_t _data);
  134. static void TM7705_Write3Byte(uint32_t _data);
  135. static uint8_t TM7705_ReadByte(void);
  136. static uint16_t TM7705_Read2Byte(void);
  137. static uint32_t TM7705_Read3Byte(void);
  138. static void TM7705_WaitDRDY(void);
  139. static void TM7705_ResetHard(void);
  140. static void TM7705_Delay(void);

  141. /*
  142. *********************************************************************************************************
  143. *        函 数 名: bsp_InitTM7705
  144. *        功能说明: 配置STM32的GPIO和SPI接口,用于连接 TM7705
  145. *        形    参: 无
  146. *        返 回 值: 无
  147. *********************************************************************************************************
  148. */
  149. void bsp_InitTM7705(void)
  150. {
  151. #ifdef SOFT_SPI                /* 软件SPI */
  152.         /* 配置REST口线为推挽输出,缺省输出高电平 */

  153.         /* 配置CS口线为推挽输出,缺省输出高电平 */

  154.         /* 配置SCK口线为推挽输出,缺省输出高电平 */

  155.         /* 配置DIN口线为推挽输出,缺省输出高电平 */

  156.         /* 配置DOUT口线为输入浮空模式 */

  157.         /* 配置DOUT口线为输入上拉模式 */
  158. #endif

  159.         bsp_DelayMS(10);

  160.         TM7705_ResetHard();                /* 硬件复位 */

  161.         /*
  162.                 在接口序列丢失的情况下,如果在DIN 高电平的写操作持续了足够长的时间(至少 32个串行时钟周期),
  163.                 TM7705 将会回到默认状态。
  164.         */
  165.         bsp_DelayMS(5);

  166.         TM7705_SyncSPI();                /* 同步SPI接口时序 */

  167.         bsp_DelayMS(5);

  168.         /* 配置时钟寄存器 */
  169.         TM7705_WriteByte(REG_CLOCK | WRITE | CH_1);                        /* 先写通信寄存器,下一步是写时钟寄存器 */

  170.         TM7705_WriteByte(CLKDIS_0 | CLK_2_4576M | FS_50HZ);        /* 刷新速率50Hz */
  171.         //TM7705_WriteByte(CLKDIS_0 | CLK_2_4576M | FS_500HZ);        /* 刷新速率500Hz */

  172.         /* 每次上电进行一次自校准 */
  173.         TM7705_CalibSelf(1);        /* 内部自校准 CH1 */
  174.         bsp_DelayMS(5);
  175.         /* 配置时钟寄存器 */
  176.         TM7705_WriteByte(REG_CLOCK | WRITE | CH_2);                        /* 先写通信寄存器,下一步是写时钟寄存器 */

  177.         TM7705_WriteByte(CLKDIS_0 | CLK_2_4576M | FS_50HZ);        /* 刷新速率50Hz */
  178.         //TM7705_WriteByte(CLKDIS_0 | CLK_2_4576M | FS_500HZ);        /* 刷新速率500Hz */

  179.         /* 每次上电进行一次自校准 */
  180.         TM7705_CalibSelf(2);        /* 内部自校准 CH1 */
  181.         bsp_DelayMS(5);
  182. }

  183. /*
  184. *********************************************************************************************************
  185. *        函 数 名: TM7705_Delay
  186. *        功能说明: CLK之间的延迟,时序延迟. 对于51,可以不延迟
  187. *        形    参: 无
  188. *        返 回 值: 无
  189. *********************************************************************************************************
  190. */
  191. static void TM7705_Delay(void)
  192. {
  193.         uint16_t i;

  194.         for (i = 0; i < 50; i++);
  195. }

  196. /*
  197. *********************************************************************************************************
  198. *        函 数 名: TM7705_ResetHard
  199. *        功能说明: 硬件复位 TM7705芯片
  200. *        形    参: 无
  201. *        返 回 值: 无
  202. *********************************************************************************************************
  203. */
  204. static void TM7705_ResetHard(void)
  205. {
  206.         RESET_1();
  207.         bsp_DelayMS(1);
  208.         RESET_0();
  209.         bsp_DelayMS(2);
  210.         RESET_1();
  211.         bsp_DelayMS(1);
  212. }

  213. /*
  214. *********************************************************************************************************
  215. *        函 数 名: TM7705_SyncSPI
  216. *        功能说明: 同步TM7705芯片SPI接口时序
  217. *        形    参: 无
  218. *        返 回 值: 无
  219. *********************************************************************************************************
  220. */
  221. static void TM7705_SyncSPI(void)
  222. {
  223.         /* AD7705串行接口失步后将其复位。复位后要延时500us再访问 */
  224.         CS_0();
  225.         TM7705_Send8Bit(0xFF);
  226.         TM7705_Send8Bit(0xFF);
  227.         TM7705_Send8Bit(0xFF);
  228.         TM7705_Send8Bit(0xFF);
  229.         CS_1();
  230. }

  231. /*
  232. *********************************************************************************************************
  233. *        函 数 名: TM7705_Send8Bit
  234. *        功能说明: 向SPI总线发送8个bit数据。 不带CS控制。
  235. *        形    参: _data : 数据
  236. *        返 回 值: 无
  237. *********************************************************************************************************
  238. */
  239. static void TM7705_Send8Bit(uint8_t _data)
  240. {
  241.         uint8_t i;

  242.         for(i = 0; i < 8; i++)
  243.         {
  244.                 if (_data & 0x80)
  245.                 {
  246.                         DI_1();
  247.                 }
  248.                 else
  249.                 {
  250.                         DI_0();
  251.                 }
  252.                 SCK_0();
  253.                 _data <<= 1;
  254.                 TM7705_Delay();
  255.                 SCK_1();
  256.                 TM7705_Delay();
  257.         }
  258. }

  259. /*
  260. *********************************************************************************************************
  261. *        函 数 名: TM7705_Recive8Bit
  262. *        功能说明: 从SPI总线接收8个bit数据。 不带CS控制。
  263. *        形    参: 无
  264. *        返 回 值: 无
  265. *********************************************************************************************************
  266. */
  267. static uint8_t TM7705_Recive8Bit(void)
  268. {
  269.         uint8_t i;
  270.         uint8_t read = 0;

  271.         for (i = 0; i < 8; i++)
  272.         {
  273.                 SCK_0();
  274.                 TM7705_Delay();
  275.                 read = read<<1;
  276.                 if (DO_IS_HIGH())
  277.                 {
  278.                         read++;
  279.                 }
  280.                 SCK_1();
  281.                 TM7705_Delay();
  282.         }
  283.         return read;
  284. }

  285. /*
  286. *********************************************************************************************************
  287. *        函 数 名: TM7705_WriteByte
  288. *        功能说明: 写入1个字节。带CS控制
  289. *        形    参: _data :将要写入的数据
  290. *        返 回 值: 无
  291. *********************************************************************************************************
  292. */
  293. static void TM7705_WriteByte(uint8_t _data)
  294. {
  295.         CS_0();
  296.         TM7705_Send8Bit(_data);
  297.         CS_1();
  298. }

  299. /*
  300. *********************************************************************************************************
  301. *        函 数 名: TM7705_Write3Byte
  302. *        功能说明: 写入3个字节。带CS控制
  303. *        形    参: _data :将要写入的数据
  304. *        返 回 值: 无
  305. *********************************************************************************************************
  306. */
  307. static void TM7705_Write3Byte(uint32_t _data)
  308. {
  309.         CS_0();
  310.         TM7705_Send8Bit((_data >> 16) & 0xFF);
  311.         TM7705_Send8Bit((_data >> 8) & 0xFF);
  312.         TM7705_Send8Bit(_data);
  313.         CS_1();
  314. }

  315. /*
  316. *********************************************************************************************************
  317. *        函 数 名: TM7705_ReadByte
  318. *        功能说明: 从AD芯片读取一个字(16位)
  319. *        形    参: 无
  320. *        返 回 值: 读取的字(16位)
  321. *********************************************************************************************************
  322. */
  323. static uint8_t TM7705_ReadByte(void)
  324. {
  325.         uint8_t read;

  326.         CS_0();
  327.         read = TM7705_Recive8Bit();
  328.         CS_1();

  329.         return read;
  330. }

  331. /*
  332. *********************************************************************************************************
  333. *        函 数 名: TM7705_Read2Byte
  334. *        功能说明: 读2字节数据
  335. *        形    参: 无
  336. *        返 回 值: 读取的数据(16位)
  337. *********************************************************************************************************
  338. */
  339. static uint16_t TM7705_Read2Byte(void)
  340. {
  341.         uint16_t read;

  342.         CS_0();
  343.         read = TM7705_Recive8Bit();
  344.         read <<= 8;
  345.         read += TM7705_Recive8Bit();
  346.         CS_1();

  347.         return read;
  348. }

  349. /*
  350. *********************************************************************************************************
  351. *        函 数 名: TM7705_Read3Byte
  352. *        功能说明: 读3字节数据
  353. *        形    参: 无
  354. *        返 回 值: 读取到的数据(24bit) 高8位固定为0.
  355. *********************************************************************************************************
  356. */
  357. static uint32_t TM7705_Read3Byte(void)
  358. {
  359.         uint32_t read;

  360.         CS_0();
  361.         read = TM7705_Recive8Bit();
  362.         read <<= 8;
  363.         read += TM7705_Recive8Bit();
  364.         read <<= 8;
  365.         read += TM7705_Recive8Bit();
  366.         CS_1();
  367.         return read;
  368. }

  369. /*
  370. *********************************************************************************************************
  371. *        函 数 名: TM7705_WaitDRDY
  372. *        功能说明: 等待内部操作完成。 自校准时间较长,需要等待。
  373. *        形    参: 无
  374. *        返 回 值: 无
  375. *********************************************************************************************************
  376. */
  377. static void TM7705_WaitDRDY(void)
  378. {
  379.         uint32_t i;

  380.         for (i = 0; i < 8000; i++)
  381.         {
  382.                 if (DRDY_IS_LOW())
  383.                 {
  384.                         break;
  385.                 }
  386.         }
  387.         if (i >= 8000)
  388.         {
  389.                 printf("TM7705_WaitDRDY() 芯片应答超时 ...\r\n");                /* 调试语句. 用语排错 */

  390.                 printf("重新同步SPI接口时序\r\n");                /* 调试语句. 用语排错 */

  391.                 TM7705_SyncSPI();                /* 同步SPI接口时序 */

  392.                 bsp_DelayMS(5);
  393.         }
  394. }

  395. /*
  396. *********************************************************************************************************
  397. *        函 数 名: TM7705_WriteReg
  398. *        功能说明: 写指定的寄存器
  399. *        形    参:  _RegID : 寄存器ID
  400. *                          _RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit
  401. *        返 回 值: 无
  402. *********************************************************************************************************
  403. */
  404. void TM7705_WriteReg(uint8_t _RegID, uint32_t _RegValue)
  405. {
  406.         uint8_t bits;

  407.         switch (_RegID)
  408.         {
  409.                 case REG_COMM:                /* 通信寄存器 */
  410.                 case REG_SETUP:                /* 设置寄存器 8bit */
  411.                 case REG_CLOCK:                /* 时钟寄存器 8bit */
  412.                         bits = 8;
  413.                         break;

  414.                 case REG_ZERO_CH1:        /* CH1 偏移寄存器 24bit */
  415.                 case REG_FULL_CH1:        /* CH1 满量程寄存器 24bit */
  416.                 case REG_ZERO_CH2:        /* CH2 偏移寄存器 24bit */
  417.                 case REG_FULL_CH2:        /* CH2 满量程寄存器 24bit*/
  418.                         bits = 24;
  419.                         break;

  420.                 case REG_DATA:                /* 数据寄存器 16bit */
  421.                 default:
  422.                         return;
  423.         }

  424.         TM7705_WriteByte(_RegID | WRITE);        /* 写通信寄存器, 指定下一步是写操作,并指定写哪个寄存器 */

  425.         if (bits == 8)
  426.         {
  427.                 TM7705_WriteByte((uint8_t)_RegValue);
  428.         }
  429.         else        /* 24bit */
  430.         {
  431.                 TM7705_Write3Byte(_RegValue);
  432.         }
  433. }

  434. /*
  435. *********************************************************************************************************
  436. *        函 数 名: TM7705_ReadReg
  437. *        功能说明: 写指定的寄存器
  438. *        形    参:  _RegID : 寄存器ID
  439. *                          _RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit
  440. *        返 回 值: 读到的寄存器值。 对于8位的寄存器,取32位形参的低8bit
  441. *********************************************************************************************************
  442. */
  443. uint32_t TM7705_ReadReg(uint8_t _RegID)
  444. {
  445.         uint8_t bits;
  446.         uint32_t read;

  447.         switch (_RegID)
  448.         {
  449.                 case REG_COMM:                /* 通信寄存器 */
  450.                 case REG_SETUP:                /* 设置寄存器 8bit */
  451.                 case REG_CLOCK:                /* 时钟寄存器 8bit */
  452.                         bits = 8;
  453.                         break;

  454.                 case REG_ZERO_CH1:        /* CH1 偏移寄存器 24bit */
  455.                 case REG_FULL_CH1:        /* CH1 满量程寄存器 24bit */
  456.                 case REG_ZERO_CH2:        /* CH2 偏移寄存器 24bit */
  457.                 case REG_FULL_CH2:        /* CH2 满量程寄存器 24bit*/
  458.                         bits = 24;
  459.                         break;

  460.                 case REG_DATA:                /* 数据寄存器 16bit */
  461.                 default:
  462.                         return 0xFFFFFFFF;
  463.         }

  464.         TM7705_WriteByte(_RegID | READ);        /* 写通信寄存器, 指定下一步是写操作,并指定写哪个寄存器 */

  465.         if (bits == 16)
  466.         {
  467.                 read = TM7705_Read2Byte();
  468.         }
  469.         else if (bits == 8)
  470.         {
  471.                 read = TM7705_ReadByte();
  472.         }
  473.         else        /* 24bit */
  474.         {
  475.                 read = TM7705_Read3Byte();
  476.         }
  477.         return read;
  478. }

  479. /*
  480. *********************************************************************************************************
  481. *        函 数 名: TM7705_CalibSelf
  482. *        功能说明: 启动自校准. 内部自动短接AIN+ AIN-校准0位,内部短接到Vref 校准满位。此函数执行过程较长,
  483. *                          实测约 180ms
  484. *        形    参:  _ch : ADC通道,1或2
  485. *        返 回 值: 无
  486. *********************************************************************************************************
  487. */
  488. void TM7705_CalibSelf(uint8_t _ch)
  489. {
  490.         if (_ch == 1)
  491.         {
  492.                 /* 自校准CH1 */
  493.                 TM7705_WriteByte(REG_SETUP | WRITE | CH_1);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
  494.                 TM7705_WriteByte(MD_CAL_SELF | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
  495.                 TM7705_WaitDRDY();        /* 等待内部操作完成 --- 时间较长,约180ms */
  496.         }
  497.         else if (_ch == 2)
  498.         {
  499.                 /* 自校准CH2 */
  500.                 TM7705_WriteByte(REG_SETUP | WRITE | CH_2);        /* 写通信寄存器,下一步是写设置寄存器,通道2 */
  501.                 TM7705_WriteByte(MD_CAL_SELF | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);        /* 启动自校准 */
  502.                 TM7705_WaitDRDY();        /* 等待内部操作完成  --- 时间较长,约180ms */
  503.         }
  504. }

  505. /*
  506. *********************************************************************************************************
  507. *        函 数 名: TM7705_SytemCalibZero
  508. *        功能说明: 启动系统校准零位. 请将AIN+ AIN-短接后,执行该函数。校准应该由主程序控制并保存校准参数。
  509. *                         执行完毕后。可以通过 TM7705_ReadReg(REG_ZERO_CH1) 和  TM7705_ReadReg(REG_ZERO_CH2) 读取校准参数。
  510. *        形    参: _ch : ADC通道,1或2
  511. *        返 回 值: 无
  512. *********************************************************************************************************
  513. */
  514. void TM7705_SytemCalibZero(uint8_t _ch)
  515. {
  516.         if (_ch == 1)
  517.         {
  518.                 /* 校准CH1 */
  519.                 TM7705_WriteByte(REG_SETUP | WRITE | CH_1);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
  520.                 TM7705_WriteByte(MD_CAL_ZERO | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
  521.                 TM7705_WaitDRDY();        /* 等待内部操作完成 */
  522.         }
  523.         else if (_ch == 2)
  524.         {
  525.                 /* 校准CH2 */
  526.                 TM7705_WriteByte(REG_SETUP | WRITE | CH_2);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
  527.                 TM7705_WriteByte(MD_CAL_ZERO | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);        /* 启动自校准 */
  528.                 TM7705_WaitDRDY();        /* 等待内部操作完成 */
  529.         }
  530. }

  531. /*
  532. *********************************************************************************************************
  533. *        函 数 名: TM7705_SytemCalibFull
  534. *        功能说明: 启动系统校准满位. 请将AIN+ AIN-接最大输入电压源,执行该函数。校准应该由主程序控制并保存校准参数。
  535. *                         执行完毕后。可以通过 TM7705_ReadReg(REG_FULL_CH1) 和  TM7705_ReadReg(REG_FULL_CH2) 读取校准参数。
  536. *        形    参:  _ch : ADC通道,1或2
  537. *        返 回 值: 无
  538. *********************************************************************************************************
  539. */
  540. void TM7705_SytemCalibFull(uint8_t _ch)
  541. {
  542.         if (_ch == 1)
  543.         {
  544.                 /* 校准CH1 */
  545.                 TM7705_WriteByte(REG_SETUP | WRITE | CH_1);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
  546.                 TM7705_WriteByte(MD_CAL_FULL | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
  547.                 TM7705_WaitDRDY();        /* 等待内部操作完成 */
  548.         }
  549.         else if (_ch == 2)
  550.         {
  551.                 /* 校准CH2 */
  552.                 TM7705_WriteByte(REG_SETUP | WRITE | CH_2);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */
  553.                 TM7705_WriteByte(MD_CAL_FULL | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);        /* 启动自校准 */
  554.                 TM7705_WaitDRDY();        /* 等待内部操作完成 */
  555.         }
  556. }

  557. /*
  558. *********************************************************************************************************
  559. *        函 数 名: TM7705_ReadAdc1
  560. *        功能说明: 读通道1或2的ADC数据
  561. *        形    参: 无
  562. *        返 回 值: 无
  563. *********************************************************************************************************
  564. */
  565. uint16_t TM7705_ReadAdc(uint8_t _ch)
  566. {
  567.         uint8_t i;
  568.         uint16_t read = 0;

  569.         /* 为了避免通道切换造成读数失效,读2次 */
  570.         for (i = 0; i < 2; i++)
  571.         {
  572.                 TM7705_WaitDRDY();                /* 等待DRDY口线为0 */

  573.                 if (_ch == 1)
  574.                 {
  575.                         TM7705_WriteByte(0x38);
  576.                 }
  577.                 else if (_ch == 2)
  578.                 {
  579.                         TM7705_WriteByte(0x39);
  580.                 }

  581.                 read = TM7705_Read2Byte();
  582.         }
  583.         return read;
  584. }
复制代码
完整程序连接  
AD7705(串口打印采集数据).rar (186.12 KB, 下载次数: 37)
回复

使用道具 举报

ID:225521 发表于 2018-7-17 00:22 | 显示全部楼层
我用STC15W4K32S为啥出来都是芯片读取超时
回复

使用道具 举报

ID:588670 发表于 2019-8-2 16:12 | 显示全部楼层
ykk杨克坤 发表于 2018-7-17 00:22
我用STC15W4K32S为啥出来都是芯片读取超时

请问您解决了吗?我也遇到这个问题啦,求助~
回复

使用道具 举报

ID:91901 发表于 2022-1-14 14:34 | 显示全部楼层
我也碰到这个问题,也是使用这个程序,是否这个程序有什么地方有问题?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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