[通用8051核FLASH系列] 【芯圣电子HC89S105A测评报告】+TM7705

[复制链接]
2122|1
 楼主| 比神乐 发表于 2023-6-15 18:13 | 显示全部楼层 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-19 16:39 编辑

今天搞了一下TM7705。TM7705是16位模数转换器。
4.jpg
我采样另外一块STM8板子上的可调电阻,通过串口发出来。
5.jpg
代码:
  1. #define ALLOCATE_EXTERN
  2. #include "HC89S105AC8.h"

  3. #define uint8_t unsigned char
  4. #define uint16_t  unsigned short
  5. #define uint32_t  unsigned long int
  6. #define int32_t   long int

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

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


  12. #define CS     P1_0
  13. #define RESET  P1_1
  14. #define DIN    P1_2
  15. #define SCK    P1_3
  16. #define DOUT   P1_4
  17. #define DRDY   P1_5

  18.         /* 定义口线置0和置1的宏 */
  19.         #define CS_0()                CS = 0
  20.         #define CS_1()                CS = 1

  21.         #define RESET_0()        RESET = 0
  22.         #define RESET_1()        RESET = 1

  23.         #define DI_0()                DIN = 0
  24.         #define DI_1()                DIN = 1

  25.         #define SCK_0()                SCK = 0
  26.         #define SCK_1()                SCK = 1

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

  28.         #define DRDY_IS_LOW()        (DRDY == 0)


  29. /* 通信寄存器bit定义 */
  30. enum
  31. {
  32.         /* 寄存器选择  RS2 RS1 RS0  */
  33.         REG_COMM        = 0x00,        /* 通信寄存器 */
  34.         REG_SETUP        = 0x10,        /* 设置寄存器 */
  35.         REG_CLOCK        = 0x20,        /* 时钟寄存器 */
  36.         REG_DATA        = 0x30,        /* 数据寄存器 */
  37.         REG_ZERO_CH1        = 0x60,        /* CH1 偏移寄存器 */
  38.         REG_FULL_CH1        = 0x70,        /* CH1 满量程寄存器 */
  39.         REG_ZERO_CH2        = 0x61,        /* CH2 偏移寄存器 */
  40.         REG_FULL_CH2        = 0x71,        /* CH2 满量程寄存器 */

  41.         /* 读写操作 */
  42.         WRITE                 = 0x00,        /* 写操作 */
  43.         READ                 = 0x08,        /* 读操作 */

  44.         /* 通道 */
  45.         CH_1                = 0,        /* AIN1+  AIN1- */
  46.         CH_2                = 1,        /* AIN2+  AIN2- */
  47.         CH_3                = 2,        /* AIN1-  AIN1- */
  48.         CH_4                = 3                /* AIN1-  AIN2- */
  49. };

  50. /* 设置寄存器bit定义 */
  51. enum
  52. {
  53.         MD_NORMAL                = (0 << 6),        /* 正常模式 */
  54.         MD_CAL_SELF                = (1 << 6),        /* 自校准模式 */
  55.         MD_CAL_ZERO                = (2 << 6),        /* 校准0刻度模式 */
  56.         MD_CAL_FULL                = (3 << 6),        /* 校准满刻度模式 */

  57.         GAIN_1                        = (0 << 3),        /* 增益 */
  58.         GAIN_2                        = (1 << 3),        /* 增益 */
  59.         GAIN_4                        = (2 << 3),        /* 增益 */
  60.         GAIN_8                        = (3 << 3),        /* 增益 */
  61.         GAIN_16                        = (4 << 3),        /* 增益 */
  62.         GAIN_32                        = (5 << 3),        /* 增益 */
  63.         GAIN_64                        = (6 << 3),        /* 增益 */
  64.         GAIN_128                = (7 << 3),        /* 增益 */

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

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

  70.         FSYNC_0                        = 0,
  71.         FSYNC_1                        = 1                /* 不启用 */
  72. };

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

  78.         /*
  79.                 2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “0”。
  80.                 1MHz (CLKDIV=0 )或 2MHz   (CLKDIV=1 ),CLK 该位应置  “1”
  81.         */
  82.         CLK_4_9152M = 0x08,
  83.         CLK_2_4576M = 0x00,
  84.         CLK_1M                 = 0x04,
  85.         CLK_2M                 = 0x0C,

  86.         FS_50HZ                = 0x00,
  87.         FS_60HZ                = 0x01,
  88.         FS_250HZ        = 0x02,
  89.         FS_500HZ        = 0x04,

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


  98. uint16_t adc1;
  99. int volt1;
  100. uint8_t txBuf[] = "CH1=     ,     mV\r\n";
  101.                                     //发送数据计数
  102.                                        
  103. void DelayMs(uint16_t nms)
  104. {
  105.         uint16_t i,j;                  
  106.         for(i=0;i<nms;i++)
  107.        for(j=0;j<200;j++);
  108. }









  109. static void TM7705_SyncSPI(void);
  110. static void TM7705_Send8Bit(uint8_t _data);
  111. static uint8_t TM7705_Recive8Bit(void);
  112. static void TM7705_WriteByte(uint8_t _data);
  113. static void TM7705_Write3Byte(uint32_t _data);
  114. static uint8_t TM7705_ReadByte(void);
  115. static uint16_t TM7705_Read2Byte(void);
  116. static uint32_t TM7705_Read3Byte(void);
  117. static void TM7705_WaitDRDY(void);
  118. static void TM7705_ResetHard(void);
  119. static void TM7705_Delay(void);
  120. void TM7705_CalibSelf(uint8_t _ch);

  121. /*
  122. *********************************************************************************************************
  123. *        函 数 名: bsp_DelayMS
  124. *        功能说明: 延时函数。按照89C52调试, 12T指令周期, 11.0592晶振
  125. *        形    参:无
  126. *        返 回 值: 无
  127. *********************************************************************************************************
  128. */
  129. void bsp_DelayMS(uint16_t n)
  130. {
  131.         /* 安富莱电子: 2014-04-23
  132.            以下代码,已经通过逻辑分析验证。        bsp_DelayMS(500) 时,实际延迟498ms
  133.         */
  134.         uint16_t k;

  135.         while(n--)
  136.         {
  137.                 for (k = 0; k < 75; k++);
  138.         }
  139. }

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

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

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

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

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

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

  158.         bsp_DelayMS(10);

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

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

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

  166.         bsp_DelayMS(5);

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

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

  171.         /* 每次上电进行一次自校准 */
  172.         TM7705_CalibSelf(1);        /* 内部自校准 CH1 */
  173.         bsp_DelayMS(5);
  174. }

  175. /*
  176. *********************************************************************************************************
  177. *        函 数 名: TM7705_Delay
  178. *        功能说明: CLK之间的延迟,时序延迟. 对于51,可以不延迟
  179. *        形    参: 无
  180. *        返 回 值: 无
  181. *********************************************************************************************************
  182. */
  183. static void TM7705_Delay(void)
  184. {
  185. //        uint16_t i;
  186. //
  187. //        for (i = 0; i < 5; i++);
  188. }

  189. /*
  190. *********************************************************************************************************
  191. *        函 数 名: TM7705_ResetHard
  192. *        功能说明: 硬件复位 TM7705芯片
  193. *        形    参: 无
  194. *        返 回 值: 无
  195. *********************************************************************************************************
  196. */
  197. static void TM7705_ResetHard(void)
  198. {
  199.         RESET_1();
  200.         bsp_DelayMS(1);
  201.         RESET_0();
  202.         bsp_DelayMS(2);
  203.         RESET_1();
  204.         bsp_DelayMS(1);
  205. }

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

  224. /*
  225. *********************************************************************************************************
  226. *        函 数 名: TM7705_Send8Bit
  227. *        功能说明: 向SPI总线发送8个bit数据。 不带CS控制。
  228. *        形    参: _data : 数据
  229. *        返 回 值: 无
  230. *********************************************************************************************************
  231. */
  232. static void TM7705_Send8Bit(uint8_t _data)
  233. {
  234.         uint8_t i;

  235.         for(i = 0; i < 8; i++)
  236.         {
  237.                 if (_data & 0x80)
  238.                 {
  239.                         DI_1();
  240.                 }
  241.                 else
  242.                 {
  243.                         DI_0();
  244.                 }
  245.                 SCK_0();
  246.                 TM7705_Delay();
  247.                 _data <<= 1;
  248.                 TM7705_Delay();
  249.                 SCK_1();
  250.                 TM7705_Delay();
  251.                 TM7705_Delay();
  252.         }
  253. }

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

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

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

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

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

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

  328.         return read;
  329. }

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

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

  346.         return read;
  347. }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  580.                 read = TM7705_Read2Byte();
  581.         }
  582.         return read;
  583. }

  584. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
  585. /*
  586. *********************************************************************************************************
  587. *        函 数 名: TM7705_Demo
  588. *        功能说明: 定时读取TM7705的ADC值,并打印到串口。请通过PC机串口工具查看结果。
  589. *        形    参:无
  590. *        返 回 值: 无
  591. *********************************************************************************************************
  592. */
  593. static void TM7705_Demo(void)
  594. {
  595.         uint16_t adc1, adc2;
  596.         
  597.         bsp_InitTM7705();                        /* 初始化配置TM7705 */

  598.         TM7705_CalibSelf(1);                /* 自校准。执行时间较长,约180ms */               
  599.         adc1 = TM7705_ReadAdc(1);                                
  600.         
  601.         TM7705_CalibSelf(2);                /* 自校准。执行时间较长,约180ms */
  602.         adc2 = TM7705_ReadAdc(2);        
  603.         
  604.         while (1)
  605.         {        
  606.                 //bsp_Idle();               

  607.                
  608.                         /* 如果只采集1个通道,则刷新速率 50Hz (缺省设置的,最大可以设置为500Hz) */
  609.                         adc1 = TM7705_ReadAdc(1);        /* 执行时间 20ms (50Hz速率刷新时) */               
  610.                         adc2 = 0;
  611.                
  612.                         
  613.                 /* 打印采集数据 */
  614.                 {
  615.                
  616.                         
  617.                         /* 计算实际电压值(近似估算的),如需准确,请进行校准 */
  618.                           volt1 = ((int32_t)adc1 * 5000) / 65535;
  619.                         //volt2 = ((int32_t)adc2 * 5000) / 65535;
  620.                         
  621.                         /* 打印ADC采样结果 */        
  622.                         //printf("CH1=%5ld (%5dmV) CH2=%5ld (%5dmV)\r", (long int)adc1, volt1, (long int)adc2, volt2);
  623.                 }
  624.         }
  625. }
  626.         

  627. /***************************************************************************************
  628.   * @实现效果        UART1接收到上位机发送的数据后,把接收的数据再次发送给上位机
  629.   * @注意                波特率1200,8位数据,无校验位               
  630. ***************************************************************************************/
  631. void main(void)
  632. {
  633.         uint8_t i;
  634.         uint8_t wan,qian,bai,shi,ge;
  635. /********************************系统初始化*******************************************/               
  636.         WDTCCR = 0x00;                           //关闭看门狗
  637.                                                            //本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
  638.         CLKCON = 0x02;                           //选择内部高频RC为系统时钟,Fosc=32MHz
  639.         CLKDIV = 0x02;                           //Fosc 2分频得到Fper,Fper=16MHz        
  640. /**********************************IO配置初始化**************************************/        
  641.     P0M0 = P0M0&0xF0|0x02;                //P00设置为上拉输入
  642.     P0M0 = P0M0&0x0F|0x80;                //P01设置为推挽输出
  643.         P1M0 = 0xcc;
  644.         P1M1 = 0xcc;
  645.         P1M2 = 0x66;        
  646. /**********************************UART配置初始化**************************************/        
  647.     TXD_MAP = 0x01;                                                //TXD映射P01
  648.         RXD_MAP = 0x00;                                                //RXD映射P00
  649.         
  650.         //8位数据发送,波特率1200
  651.         //波特率计算
  652.         //波特率 = 1/16 * 时钟源频率 / (65536 - 0xFCBE)
  653.         //       = 1/16 * 16000000 / 834)
  654.         //        = 1199.04(误差0.05%)

  655.         //波特率1200
  656.         //反推初值
  657.         //初值 = (65536 - (Fper / 波特率) * (1 / 16))
  658.         //           = (65536 - (16000000 / 1200) * (1 / 16))
  659.         //           = (65536 - 833.33)
  660.         //     = FCBE
  661.         

  662.     SBRTH = 0xFCBE/256;      
  663.         SBRTL = 0xFCBE%256;
  664.         SCON2 = 0x12;                                //8位UART 独立波特率,波特率可变
  665.         SCON  = 0x10;                                 //开串口接收
  666.         bsp_InitTM7705();                        /* 初始化配置TM7705 */

  667.         TM7705_CalibSelf(1);                /* 自校准。执行时间较长,约180ms */               
  668.         adc1 = TM7705_ReadAdc(1);        
  669.         //IE = 0x10;                                         //使能串口中断
  670.         //EA = 1;                                                //使能总中断
  671. //        while(1)
  672. //        {
  673. //                CS_0();
  674. //
  675. //                CS_1();        
  676. //        }
  677.         while(1)
  678.         {

  679.                 adc1 = TM7705_ReadAdc(1);        /* 执行时间 20ms (50Hz速率刷新时) */
  680.                 volt1 = ((int32_t)adc1 * 5000) / 65535;
  681.         wan=adc1/10000+0x30;
  682.                 qian=adc1%10000/1000+0x30;
  683.                 bai=adc1%1000/100+0x30;
  684.                 shi=adc1%100/10+0x30;
  685.                 ge=adc1%10+0x30;
  686.                 txBuf[4]=wan;
  687.                 txBuf[5]=qian;
  688.                 txBuf[6]=bai;
  689.                 txBuf[7]=shi;
  690.                 txBuf[8]=ge;

  691.                 wan=volt1/10000+0x30;
  692.                 qian=volt1%10000/1000+0x30;
  693.                 bai=volt1%1000/100+0x30;
  694.                 shi=volt1%100/10+0x30;
  695.                 ge=volt1%10+0x30;
  696.                 txBuf[10]=wan;
  697.                 txBuf[11]=qian;
  698.                 txBuf[12]=bai;
  699.                 txBuf[13]=shi;
  700.                 txBuf[14]=ge;
  701.                                        
  702.                 for(i = 0; i < sizeof(txBuf); i++)
  703.                 {
  704.                                 SBUF = txBuf[i];                          //发送数据
  705.                                 while(!(SCON&0x02));
  706.                                 SCON &=~ 0x02;                        //发送中断请求中断标志位?
  707.                 }
  708.                 bsp_DelayMS(500);
  709.      
  710.         }
  711. }
效果图:
0.jpg 1.jpg 2.jpg 3.jpg
lajfda002 发表于 2023-6-19 17:51 | 显示全部楼层
这个工程师笔记不错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部