久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4685|回復: 5
打印 上一主題 下一主題
收起左側

野火STM32F429+AD7705程序移植

[復制鏈接]
跳轉到指定樓層
樓主
因為項目需要所以把AD7705程序移植到野火stm32挑戰者開發板上,需要的朋友可以下載


單片機源程序如下:
  1. /*
  2. *********************************************************************************************************
  3. 需要注意的是模塊使用3.3V供電較穩定,使用5V供電可能回出問題,讀出來的數據有時候是錯的
  4. 還有就是AIN1-和AIN2-引腳的電壓最高為1V,AIN1+,AIN2+的最高電壓為2.5V,詳情請見數據手冊說明,
  5. 用來檢測開發板3.3V和5V的的電壓也是可以的,一般不會出現問題。
  6. 本例程是單極性輸入,增益為1,帶輸入緩沖。帶緩沖可以解決ADC采樣端,由于未進行電壓跟隨而造成的
  7. ADC檢測錯誤。
  8. 測試條件:串接3個1K的電阻和一個10K的電阻進行采樣,采樣的結果和萬用表測量的結果基本一致

  9. AD7705的供電電壓盡量    不要為5V這點很重要!!!!!   不要為5V這點很重要!!!!!
  10. 不要為5V這點很重要!!!!!不要為5V這點很重要!!!!!不要為5V這點很重要!!!!!
  11. *********************************************************************************************************
  12. */
  13. #include "AD7705.h"
  14. #include "systick.h"
  15. #define SOFT_SPI                /* 定義此行表示使用GPIO模擬SPI接口 */
  16. //#define HARD_SPI                /* 定義此行表示使用CPU的硬件SPI接口 */

  17. /* 通道1和通道2的增益,輸入緩沖,單極性 */
  18. #define __CH1_GAIN_BIPOLAR_BUF        (GAIN_1 | UNIPOLAR | BUF_EN)
  19. #define __CH2_GAIN_BIPOLAR_BUF        (GAIN_1 | UNIPOLAR | BUF_EN)

  20. /*

  21.                         TM7705模塊   野火STM32挑戰者 STM32F429開發板
  22.       SCK   ------  PE2
  23.       DOUT  ------  PE4
  24.       DIN   ------  PE3
  25.       CS    ------  PE5
  26.       DRDY  ------  PE6
  27.       RST   ------  PI8
  28. */

  29. #if !defined(SOFT_SPI) && !defined(HARD_SPI)
  30.         #error "Please define SPI Interface mode : SOFT_SPI or HARD_SPI"
  31. #endif

  32. #ifdef SOFT_SPI                /* 軟件SPI */
  33.         /* 定義GPIO端口 */
  34.         #define RCC_SCK         RCC_AHB1Periph_GPIOE
  35.         #define PORT_SCK        GPIOE
  36.         #define PIN_SCK                GPIO_Pin_2

  37.         #define RCC_DIN         RCC_AHB1Periph_GPIOE
  38.         #define PORT_DIN        GPIOE
  39.         #define PIN_DIN                GPIO_Pin_3

  40.         #define RCC_DOUT         RCC_AHB1Periph_GPIOE
  41.         #define PORT_DOUT        GPIOE
  42.         #define PIN_DOUT        GPIO_Pin_4

  43.         #define RCC_CS                 RCC_AHB1Periph_GPIOE
  44.         #define PORT_CS                GPIOE
  45.         #define PIN_CS                GPIO_Pin_5

  46.         #define RCC_DRDY         RCC_AHB1Periph_GPIOE
  47.         #define PORT_DRDY        GPIOE
  48.         #define PIN_DRDY        GPIO_Pin_6

  49.         #define RCC_RESET         RCC_AHB1Periph_GPIOI
  50.         #define PORT_RESET        GPIOI
  51.         #define PIN_RESET        GPIO_Pin_8

  52.         /* 定義口線置0和置1的宏 */
  53.         #define RESET_0()        GPIO_ResetBits(PORT_RESET, PIN_RESET)
  54.         #define RESET_1()        GPIO_SetBits(PORT_RESET, PIN_RESET)

  55.         #define CS_0()                GPIO_ResetBits(PORT_CS, PIN_CS)
  56.         #define CS_1()                GPIO_SetBits(PORT_CS, PIN_CS)

  57.         #define SCK_0()                GPIO_ResetBits(PORT_SCK, PIN_SCK)
  58.         #define SCK_1()                GPIO_SetBits(PORT_SCK, PIN_SCK)

  59.         #define DI_0()                GPIO_ResetBits(PORT_DIN, PIN_DIN)
  60.         #define DI_1()                GPIO_SetBits(PORT_DIN, PIN_DIN)

  61.         #define DO_IS_HIGH()        (GPIO_ReadInputDataBit(PORT_DOUT, PIN_DOUT) == Bit_SET)

  62.         #define DRDY_IS_LOW()        (GPIO_ReadInputDataBit(PORT_DRDY, PIN_DRDY) == Bit_RESET)
  63. #endif

  64. #ifdef HARD_SPI                /* 硬件SPI */
  65.         ;
  66. #endif

  67. /* 通信寄存器bit定義 */
  68. enum
  69. {
  70.         /* 寄存器選擇  RS2 RS1 RS0  */
  71.         REG_COMM        = 0x00,        /* 通信寄存器 */
  72.         REG_SETUP        = 0x10,        /* 設置寄存器 */
  73.         REG_CLOCK        = 0x20,        /* 時鐘寄存器 */
  74.         REG_DATA        = 0x30,        /* 數據寄存器 */
  75.         REG_ZERO_CH1        = 0x60,        /* CH1 偏移寄存器 */
  76.         REG_FULL_CH1        = 0x70,        /* CH1 滿量程寄存器 */
  77.         REG_ZERO_CH2        = 0x61,        /* CH2 偏移寄存器 */
  78.         REG_FULL_CH2        = 0x71,        /* CH2 滿量程寄存器 */

  79.         /* 讀寫操作 */
  80.         WRITE                 = 0x00,        /* 寫操作 */
  81.         READ                 = 0x08,        /* 讀操作 */

  82.         /* 通道 */
  83.         CH_1                = 0,        /* AIN1+  AIN1- */
  84.         CH_2                = 1,        /* AIN2+  AIN2- */
  85.         CH_3                = 2,        /* AIN1-  AIN1- */
  86.         CH_4                = 3                /* AIN1-  AIN2- */
  87. };

  88. /* 設置寄存器bit定義 */
  89. enum
  90. {
  91.         MD_NORMAL                = (0 << 6),        /* 正常模式 */
  92.         MD_CAL_SELF                = (1 << 6),        /* 自校準模式 */
  93.         MD_CAL_ZERO                = (2 << 6),        /* 校準0刻度模式 */
  94.         MD_CAL_FULL                = (3 << 6),        /* 校準滿刻度模式 */

  95.         GAIN_1                        = (0 << 3),        /* 增益 */
  96.         GAIN_2                        = (1 << 3),        /* 增益 */
  97.         GAIN_4                        = (2 << 3),        /* 增益 */
  98.         GAIN_8                        = (3 << 3),        /* 增益 */
  99.         GAIN_16                        = (4 << 3),        /* 增益 */
  100.         GAIN_32                        = (5 << 3),        /* 增益 */
  101.         GAIN_64                        = (6 << 3),        /* 增益 */
  102.         GAIN_128                = (7 << 3),        /* 增益 */

  103.         /* 無論雙極性還是單極性都不改變任何輸入信號的狀態,它只改變輸出數據的代碼和轉換函數上的校準點 */
  104.         BIPOLAR                        = (0 << 2),        /* 雙極性輸入 */
  105.         UNIPOLAR                = (1 << 2),        /* 單極性輸入 */

  106.         BUF_NO                        = (0 << 1),        /* 輸入無緩沖(內部緩沖器不啟用) */
  107.         BUF_EN                        = (1 << 1),        /* 輸入有緩沖 (啟用內部緩沖器) */

  108.         FSYNC_0                        = 0,
  109.         FSYNC_1                        = 1                /* 不啟用 */
  110. };

  111. /* 時鐘寄存器bit定義 */
  112. enum
  113. {
  114.         CLKDIS_0        = 0x00,                /* 時鐘輸出使能 (當外接晶振時,必須使能才能振蕩) */
  115.         CLKDIS_1        = 0x10,                /* 時鐘禁止 (當外部提供時鐘時,設置該位可以禁止MCK_OUT引腳輸出時鐘以省電 */

  116.         /*
  117.                 2.4576MHz(CLKDIV=0 )或為 4.9152MHz (CLKDIV=1 ),CLK 應置 “0”。
  118.                 1MHz (CLKDIV=0 )或 2MHz   (CLKDIV=1 ),CLK 該位應置  “1”
  119.         */
  120.         CLK_4_9152M = 0x08,
  121.         CLK_2_4576M = 0x00,
  122.         CLK_1M                 = 0x04,
  123.         CLK_2M                 = 0x0C,

  124.         FS_50HZ                = 0x00,
  125.         FS_60HZ                = 0x01,
  126.         FS_250HZ        = 0x02,
  127.         FS_500HZ        = 0x04,

  128. //        FS_50HZ                = 0x04,
  129. //        FS_60HZ                = 0x05,
  130. //        FS_250HZ        = 0x06,
  131. //        FS_500HZ        = 0x07,
  132.         /*
  133.                 四十九、電子秤應用中提高TM7705 精度的方法
  134.                         當使用主時鐘為 2.4576MHz 時,強烈建議將時鐘寄存器設為 84H,此時數據輸出更新率為10Hz,即每0.1S 輸出一個新數據。
  135.                         當使用主時鐘為 1MHz 時,強烈建議將時鐘寄存器設為80H, 此時數據輸出更新率為4Hz, 即每0.25S 輸出一個新數據
  136.         */
  137.         ZERO_0                = 0x00,
  138.         ZERO_1                = 0x80
  139. };

  140. static void TM7705_SyncSPI(void);
  141. static void TM7705_Send8Bit(uint8_t _data);
  142. static uint8_t TM7705_Recive8Bit(void);
  143. static void TM7705_WriteByte(uint8_t _data);
  144. static void TM7705_Write3Byte(uint32_t _data);
  145. static uint8_t TM7705_ReadByte(void);
  146. static uint16_t TM7705_Read2Byte(void);
  147. static uint32_t TM7705_Read3Byte(void);
  148. static void TM7705_WaitDRDY(void);
  149. void TM7705_ResetHard(void);
  150. static void TM7705_Delay(void);

  151. /*
  152. *********************************************************************************************************
  153. *        函 數 名: bsp_DelayMS
  154. *        功能說明: ms級延遲,延遲精度為正負1ms
  155. *        形    參:  n : 延遲長度,單位1 ms。 n 應大于2
  156. *        返 回 值: 無
  157. * 這2個全局變量轉用于 bsp_DelayMS() 函數
  158. */
  159. extern volatile uint32_t s_uiDelayCount;
  160. extern volatile uint8_t s_ucTimeOutFlag;

  161. /* 開關全局中斷的宏 */
  162. #define ENABLE_INT()        __set_PRIMASK(0)        /* 使能全局中斷  core_cmFunc.h 的頭文件中*/
  163. #define DISABLE_INT()        __set_PRIMASK(1)        /* 禁止全局中斷 */

  164. void bsp_DelayMS(uint32_t n)
  165. {
  166.         if (n == 0)
  167.         {
  168.                 return;
  169.         }
  170.         else if (n == 1)
  171.         {
  172.                 n = 2;
  173.         }
  174.        
  175.         DISABLE_INT();                          /* 關中斷 */
  176.        
  177.         s_uiDelayCount = n;
  178.         s_ucTimeOutFlag = 0;
  179.        
  180.         ENABLE_INT();                                  /* 開中斷 */
  181.        
  182.         while (1)
  183.         {
  184.                 /*
  185.                         等待延遲時間到
  186.                         注意:編譯器認為 s_ucTimeOutFlag = 0,所以可能優化錯誤,因此 s_ucTimeOutFlag 變量必須申明為 volatile
  187.                 */
  188.                 if (s_ucTimeOutFlag == 1)
  189.                 {
  190.                         break;
  191.                 }
  192.         }
  193. }

  194. /*
  195. *********************************************************************************************************
  196. *        函 數 名: bsp_InitTM7705
  197. *        功能說明: 配置STM32的GPIO和SPI接口,用于連接 TM7705
  198. *        形    參: 無
  199. *        返 回 值: 無
  200. *********************************************************************************************************
  201. */
  202. void bsp_InitTM7705(void)
  203. {
  204.         GPIO_InitTypeDef GPIO_InitStructure;

  205. #ifdef SOFT_SPI                /* 軟件SPI */
  206.         CS_1();
  207.         SCK_1();
  208.         DI_1();       
  209.        
  210.         /* 打開GPIO時鐘 */
  211.         RCC_AHB1PeriphClockCmd(RCC_SCK | RCC_DIN | RCC_DOUT | RCC_CS | RCC_DRDY | RCC_RESET, ENABLE);
  212.        
  213.         /* 配置幾個推完輸出IO */
  214.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                /* 設為輸出口 */
  215.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                /* 設為推挽模式 */
  216.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        /* 上下拉電阻不使能 */
  217.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        /* IO口最大速度 */

  218.         GPIO_InitStructure.GPIO_Pin = PIN_SCK;
  219.         GPIO_Init(PORT_SCK, &GPIO_InitStructure);

  220.         GPIO_InitStructure.GPIO_Pin = PIN_DIN;
  221.         GPIO_Init(PORT_DIN, &GPIO_InitStructure);

  222.         GPIO_InitStructure.GPIO_Pin = PIN_CS;
  223.         GPIO_Init(PORT_CS, &GPIO_InitStructure);

  224.         GPIO_InitStructure.GPIO_Pin = PIN_RESET;
  225.         GPIO_Init(PORT_RESET, &GPIO_InitStructure);

  226.         /* 配置GPIO為浮動輸入模式(實際上CPU復位后就是輸入狀態) */
  227.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                /* 設為輸入口 */
  228.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                /* 設為推挽模式 */
  229.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;        /* 無需上下拉電阻 */
  230.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        /* IO口最大速度 */

  231.         GPIO_InitStructure.GPIO_Pin = PIN_DOUT;
  232.         GPIO_Init(PORT_DOUT, &GPIO_InitStructure);

  233.         GPIO_InitStructure.GPIO_Pin = PIN_DRDY;
  234.         GPIO_Init(PORT_DRDY, &GPIO_InitStructure);
  235.        

  236. #endif

  237.         bsp_DelayMS(10);
  238.        
  239.         TM7705_ResetHard();                /* 硬件復位 */
  240.        
  241.         /*
  242.                 在接口序列丟失的情況下,如果在DIN 高電平的寫操作持續了足夠長的時間(至少 32個串行時鐘周期),
  243.                 TM7705 將會回到默認狀態。
  244.         */       
  245.         bsp_DelayMS(5);

  246.         TM7705_SyncSPI();                /* 同步SPI接口時序 */

  247.         bsp_DelayMS(5);

  248.         /* 配置時鐘寄存器 通道1*/
  249.         TM7705_WriteByte(REG_CLOCK | WRITE | CH_1);                        /* 先寫通信寄存器,下一步是寫時鐘寄存器 */
  250.         TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ);        /* 刷新速率50Hz */
  251. //        TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_500HZ);        /* 刷新速率500Hz */
  252.         /* 配置時鐘寄存器 通道2*/
  253.         TM7705_WriteByte(REG_CLOCK | WRITE | CH_2);                        /* 先寫通信寄存器,下一步是寫時鐘寄存器 */
  254.         TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_500HZ);        /* 刷新速率50Hz */
  255.        
  256.         /* 每次上電進行一次自校準  通道2 */
  257.         TM7705_CalibSelf(1);        /* 內部自校準 CH1 */
  258.         bsp_DelayMS(5);
  259.        
  260.                 /* 每次上電進行一次自校準 */
  261.         TM7705_CalibSelf(2);        /* 內部自校準 CH2 */
  262.         bsp_DelayMS(5);
  263. }

  264. /*
  265. *********************************************************************************************************
  266. *        函 數 名: TM7705_Delay
  267. *        功能說明: CLK之間的延遲,時序延遲. 用于STM32F407  168M主頻
  268. *        形    參: 無
  269. *        返 回 值: 無
  270. *********************************************************************************************************
  271. */
  272. static void TM7705_Delay(void)
  273. {
  274.         uint16_t i;

  275.         for (i = 0; i < 5; i++);
  276. }



  277. /*
  278. *********************************************************************************************************
  279. *        函 數 名: TM7705_ResetHard
  280. *        功能說明: 硬件復位 TM7705芯片
  281. *        形    參: 無
  282. *        返 回 值: 無
  283. *********************************************************************************************************
  284. */
  285. void TM7705_ResetHard(void)
  286. {
  287.         RESET_1();
  288. //        bsp_DelayMS(1);                                                ///增大延時時間,從407 移植到429上
  289.         bsp_DelayMS(5);
  290.         RESET_0();
  291. //        bsp_DelayMS(2);
  292.         bsp_DelayMS(10);
  293.         RESET_1();
  294. //        bsp_DelayMS(1);
  295.         bsp_DelayMS(5);
  296. }

  297. /*
  298. *********************************************************************************************************
  299. *        函 數 名: TM7705_SyncSPI
  300. *        功能說明: 同步TM7705芯片SPI接口時序
  301. *        形    參: 無
  302. *        返 回 值: 無
  303. *********************************************************************************************************
  304. */
  305. static void TM7705_SyncSPI(void)
  306. {
  307.         /* AD7705串行接口失步后將其復位。復位后要延時500us再訪問 */
  308.         CS_0();
  309.         TM7705_Send8Bit(0xFF);
  310.         TM7705_Send8Bit(0xFF);
  311.         TM7705_Send8Bit(0xFF);
  312.         TM7705_Send8Bit(0xFF);       
  313.         CS_1();
  314. }

  315. /*
  316. *********************************************************************************************************
  317. *        函 數 名: TM7705_Send8Bit
  318. *        功能說明: 向SPI總線發送8個bit數據。 不帶CS控制。
  319. *        形    參: _data : 數據
  320. *        返 回 值: 無
  321. *********************************************************************************************************
  322. */
  323. static void TM7705_Send8Bit(uint8_t _data)
  324. {
  325.         uint8_t i;

  326.         for(i = 0; i < 8; i++)
  327.         {
  328.                 if (_data & 0x80)
  329.                 {
  330.                         DI_1();
  331.                 }
  332.                 else
  333.                 {
  334.                         DI_0();
  335.                 }
  336.                 SCK_0();
  337.                 _data <<= 1;
  338.                 TM7705_Delay();
  339.                 SCK_1();       
  340.                 TM7705_Delay();               
  341.         }
  342. }

  343. /*
  344. *********************************************************************************************************
  345. *        函 數 名: TM7705_Recive8Bit
  346. *        功能說明: 從SPI總線接收8個bit數據。 不帶CS控制。
  347. *        形    參: 無
  348. *        返 回 值: 無
  349. *********************************************************************************************************
  350. */
  351. static uint8_t TM7705_Recive8Bit(void)
  352. {
  353.         uint8_t i;
  354.         uint8_t read = 0;

  355.         for (i = 0; i < 8; i++)
  356.         {
  357.                 SCK_0();
  358.                 TM7705_Delay();               
  359.                 read = read<<1;
  360.                 if (DO_IS_HIGH())
  361.                 {
  362.                         read++;
  363.                 }
  364.                 SCK_1();               
  365.                 TM7705_Delay();
  366.         }
  367.         return read;
  368. }

  369. /*
  370. *********************************************************************************************************
  371. *        函 數 名: TM7705_WriteByte
  372. *        功能說明: 寫入1個字節。帶CS控制
  373. *        形    參: _data :將要寫入的數據
  374. *        返 回 值: 無
  375. *********************************************************************************************************
  376. */
  377. void TM7705_WriteByte(uint8_t _data)
  378. {
  379.         CS_0();
  380.         TM7705_Send8Bit(_data);
  381.         CS_1();
  382. }

  383. /*
  384. *********************************************************************************************************
  385. *        函 數 名: TM7705_Write3Byte
  386. *        功能說明: 寫入3個字節。帶CS控制
  387. *        形    參: _data :將要寫入的數據
  388. *        返 回 值: 無
  389. *********************************************************************************************************
  390. */
  391. static void TM7705_Write3Byte(uint32_t _data)
  392. {
  393.         CS_0();
  394.         TM7705_Send8Bit((_data >> 16) & 0xFF);
  395.         TM7705_Send8Bit((_data >> 8) & 0xFF);
  396.         TM7705_Send8Bit(_data);
  397.         CS_1();
  398. }

  399. /*
  400. *********************************************************************************************************
  401. *        函 數 名: TM7705_ReadByte
  402. *        功能說明: 從AD芯片讀取一個字(16位)
  403. *        形    參: 無
  404. *        返 回 值: 讀取的字(16位)
  405. *********************************************************************************************************
  406. */
  407. static uint8_t TM7705_ReadByte(void)
  408. {
  409.         uint8_t read;

  410.         CS_0();
  411.         read = TM7705_Recive8Bit();
  412.         CS_1();
  413.        
  414.         return read;
  415. }

  416. /*
  417. *********************************************************************************************************
  418. *        函 數 名: TM7705_Read2Byte
  419. *        功能說明: 讀2字節數據
  420. *        形    參: 無
  421. *        返 回 值: 讀取的數據(16位)
  422. *********************************************************************************************************
  423. */
  424. static uint16_t TM7705_Read2Byte(void)
  425. {
  426.         uint16_t read;

  427.         CS_0();
  428.         read = TM7705_Recive8Bit();
  429.         read <<= 8;
  430.         read += TM7705_Recive8Bit();
  431.         CS_1();

  432.         return read;
  433. }

  434. /*
  435. *********************************************************************************************************
  436. *        函 數 名: TM7705_Read3Byte
  437. *        功能說明: 讀3字節數據
  438. *        形    參: 無
  439. *        返 回 值: 讀取到的數據(24bit) 高8位固定為0.
  440. *********************************************************************************************************
  441. */
  442. static uint32_t TM7705_Read3Byte(void)
  443. {
  444.         uint32_t read;

  445.         CS_0();
  446.         read = TM7705_Recive8Bit();
  447.         read <<= 8;
  448.         read += TM7705_Recive8Bit();
  449.         read <<= 8;
  450.         read += TM7705_Recive8Bit();
  451.         CS_1();
  452.         return read;
  453. }

  454. /*
  455. *********************************************************************************************************
  456. *        函 數 名: TM7705_WaitDRDY
  457. *        功能說明: 等待內部操作完成。 自校準時間較長,需要等待。
  458. *        形    參: 無
  459. *        返 回 值: 無
  460. *********************************************************************************************************
  461. */
  462. static void TM7705_WaitDRDY(void)
  463. {
  464.         uint32_t i;

  465.         for (i = 0; i < 4000000; i++)
  466.         {
  467.                 if (DRDY_IS_LOW())
  468.                 {
  469.                         break;
  470.                 }
  471.         }
  472.         if (i >= 4000000)
  473.         {
  474.                 printf("TM7705_WaitDRDY() Time Out ...\r\n");                /* 調試語句. 用語排錯 */
  475.         }
  476. }

  477. /*
  478. *********************************************************************************************************
  479. *        函 數 名: TM7705_WriteReg
  480. *        功能說明: 寫指定的寄存器
  481. *        形    參:  _RegID : 寄存器ID
  482. *                          _RegValue : 寄存器值。 對于8位的寄存器,取32位形參的低8bit
  483. *        返 回 值: 無
  484. *********************************************************************************************************
  485. */
  486. void TM7705_WriteReg(uint8_t _RegID, uint32_t _RegValue)
  487. {
  488.         uint8_t bits;

  489.         switch (_RegID)
  490.         {
  491.                 case REG_COMM:                /* 通信寄存器 */               
  492.                 case REG_SETUP:                /* 設置寄存器 8bit */
  493.                 case REG_CLOCK:                /* 時鐘寄存器 8bit */
  494.                         bits = 8;
  495.                         break;

  496.                 case REG_ZERO_CH1:        /* CH1 偏移寄存器 24bit */
  497.                 case REG_FULL_CH1:        /* CH1 滿量程寄存器 24bit */
  498.                 case REG_ZERO_CH2:        /* CH2 偏移寄存器 24bit */
  499.                 case REG_FULL_CH2:        /* CH2 滿量程寄存器 24bit*/
  500.                         bits = 24;
  501.                         break;

  502.                 case REG_DATA:                /* 數據寄存器 16bit */
  503.                 default:
  504.                         return;
  505.         }

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

  507.         if (bits == 8)
  508.         {
  509.                 TM7705_WriteByte((uint8_t)_RegValue);
  510.         }
  511.         else        /* 24bit */
  512.         {
  513.                 TM7705_Write3Byte(_RegValue);
  514.         }
  515. }

  516. /*
  517. *********************************************************************************************************
  518. *        函 數 名: TM7705_ReadReg
  519. *        功能說明: 讀指定的寄存器
  520. *        形    參:  _RegID : 寄存器ID
  521. *                          _RegValue : 寄存器值。 對于8位的寄存器,取32位形參的低8bit
  522. *        返 回 值: 讀到的寄存器值。 對于8位的寄存器,取32位形參的低8bit
  523. *********************************************************************************************************
  524. */
  525. uint32_t TM7705_ReadReg(uint8_t _RegID)
  526. {
  527.         uint8_t bits;
  528.         uint32_t read;

  529.         switch (_RegID)
  530.         {
  531.                 case REG_COMM:                /* 通信寄存器 */
  532.                 case REG_SETUP:                /* 設置寄存器 8bit */
  533.                 case REG_CLOCK:                /* 時鐘寄存器 8bit */
  534.                         bits = 8;
  535.                         break;

  536.                 case REG_ZERO_CH1:        /* CH1 偏移寄存器 24bit */
  537.                 case REG_FULL_CH1:        /* CH1 滿量程寄存器 24bit */
  538.                 case REG_ZERO_CH2:        /* CH2 偏移寄存器 24bit */
  539.                 case REG_FULL_CH2:        /* CH2 滿量程寄存器 24bit*/
  540.                         bits = 24;
  541.                         break;

  542.                 case REG_DATA:                /* 數據寄存器 16bit */
  543.                 default:
  544.                         return 0xFFFFFFFF;
  545.         }

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

  547.         if (bits == 16)
  548.         {
  549.                 read = TM7705_Read2Byte();
  550.         }
  551.         else if (bits == 8)
  552.         {
  553.                 read = TM7705_ReadByte();
  554.         }
  555.         else        /* 24bit */
  556.         {
  557.                 read = TM7705_Read3Byte();
  558.         }
  559.         return read;
  560. }

  561. /*
  562. *********************************************************************************************************
  563. *        函 數 名: TM7705_CalibSelf
  564. *        功能說明: 啟動自校準. 內部自動短接AIN+ AIN-校準0位,內部短接到Vref 校準滿位。此函數執行過程較長,
  565. *                          實測約 180ms
  566. *        形    參:  _ch : ADC通道,1或2
  567. *        返 回 值: 無
  568. *********************************************************************************************************
  569. */
  570. void TM7705_CalibSelf(uint8_t _ch)
  571. {
  572.         if (_ch == 1)
  573.         {
  574.                 /* 自校準CH1 */
  575.                 TM7705_WriteByte(REG_SETUP | WRITE | CH_1);        /* 寫通信寄存器,下一步是寫設置寄存器,通道1 */               
  576.                 TM7705_WriteByte(MD_CAL_SELF | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 啟動自校準 */
  577.                 TM7705_WaitDRDY();        /* 等待內部操作完成 --- 時間較長,約180ms */
  578.         }
  579.         else if (_ch == 2)
  580.         {
  581.                 /* 自校準CH2 */
  582.                 TM7705_WriteByte(REG_SETUP | WRITE | CH_2);        /* 寫通信寄存器,下一步是寫設置寄存器,通道2 */
  583.                 TM7705_WriteByte(MD_CAL_SELF | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);        /* 啟動自校準 */
  584.                 TM7705_WaitDRDY();        /* 等待內部操作完成  --- 時間較長,約180ms */
  585.         }
  586. }

  587. /*
  588. *********************************************************************************************************
  589. *        函 數 名: TM7705_SytemCalibZero
  590. *        功能說明: 啟動系統校準零位. 請將AIN+ AIN-短接后,執行該函數。校準應該由主程序控制并保存校準參數。
  591. *                         執行完畢后。可以通過 TM7705_ReadReg(REG_ZERO_CH1) 和  TM7705_ReadReg(REG_ZERO_CH2) 讀取校準參數。
  592. *        形    參: _ch : ADC通道,1或2
  593. *        返 回 值: 無
  594. *********************************************************************************************************
  595. */
  596. ……………………

  597. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
  1.   #include "stm32f4xx.h"
  2.         #include "uart.h"
  3.         #include "systick.h"
  4.         #include "AD7705.h"
  5.         #include "time.h"
  6. uint16_t receive_bit = 0,ADC_Value = 0,ADC_succse = 0,ADC_Value1,mm = 0,nn = 0;
  7. #define ADC_Error_MAX   10000
  8. float adc1,adc2;
  9. /*
  10.         如果ADC一直讀不出來,每次讀取ADC之前重新設置一下AD7705時鐘寄存器和設置寄存器
  11. */
  12. /**
  13.   * @brief  主函數
  14.   * @param  無
  15.   * @retval 無
  16.   */
  17.        
  18.         /**
  19.         *        推薦使用查詢發送,中斷接收的方法來實現串口功能
  20.         *
  21.         *////
  22.         void GPIO_config()
  23. {
  24.         GPIO_InitTypeDef GPIO_InitStruct;
  25.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH,ENABLE);
  26.         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  27.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  28.         GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
  29.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  30.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
  31.         GPIO_Init(GPIOH,&GPIO_InitStruct);
  32.         GPIO_SetBits(GPIOH,GPIO_Pin_10);
  33. }
  34. void delay(unsigned int x)
  35. {
  36.         while(x--);
  37. }
  38. /*
  39. 形參為ADC的通道號   采用限幅濾波算法  
  40. */
  41. uint16_t GET_ADC(uint8_t x)
  42. {
  43.                 unsigned j;
  44.                 ADC_Value = TM7705_ReadAdc(x);                        //使用AD7705ADC通道1進行檢測。                       
  45.                 if(ADC_Value != 0&&mm == 0){ADC_Value1 = ADC_Value;mm = 1;}                        //第一次獲取ADC
  46.                 if((ADC_Value1 - ADC_Value) < ADC_Error_MAX||(ADC_Value - ADC_Value1) < ADC_Error_MAX)
  47.                 {
  48.                         j = 0;
  49.                         ADC_Value1 = ADC_Value;                        //數據符合要求
  50.                         return ADC_Value;
  51.                 }
  52.                 else                                                 //數據不符合要求返回上次的值
  53.                 {
  54.                         j++;
  55.                         if(j >= 15){j = 0;bsp_InitTM7705();}        //連續15次讀取的數據不合要求 重新初始化ADC               
  56.                         return ADC_Value1;                               
  57.                 }
  58. }
  59. int main(void)
  60. {
  61.                 int i;
  62.                 Uart_Config();
  63.                 GPIO_config();
  64.                 TIME_config();
  65.                 systick_Init();
  66.                 TM7705_ResetHard();                //上電先AD7705復位
  67.                 bsp_InitTM7705();                        //AD7705初始化
  68.                 TM7705_CalibSelf(1);                                //校準ADC通道一
  69.                 ADC_Value = TM7705_ReadAdc(1);       
  70.                 TM7705_CalibSelf(2);                                //校準ADC通道二
  71.                 ADC_Value = TM7705_ReadAdc(2);
  72.                 while(1)
  73.                 {
  74.                         i++;
  75.                         if(i >= 10)
  76.                         {
  77.                                 i = 0;               
  78.                                 adc1 = GET_ADC(1);
  79.                                 bsp_DelayMS(10);                        //讀完延時一下 不要一直讀取
  80.                                 adc2 = GET_ADC(2);
  81.                                 bsp_DelayMS(10);                        //讀完延時一下 不要一直讀取
  82.                         }                       
  83.                         if(ADC_succse == 1)
  84.                         {
  85.                                 ADC_succse = 0;
  86.                                 printf("通道1的電壓值 = %fV\n",(float)adc1*5/65535);
  87.                                 bsp_DelayMS(20);                        //延時一下,防止發的過快亂碼
  88.                                 printf("通道2的電壓值 = %fV\n",(float)adc2*5/65535);
  89.                                 bsp_DelayMS(20);
  90.                         }
  91.                         if(ADC_Value != 0)GPIO_ResetBits(GPIOH,GPIO_Pin_10);
  92.                 }
  93. }

  94. /*********************************************END OF FILE**********************/

復制代碼


所有資料51hei提供下載:
stm32f429+16位ADC AD7705.7z (364.58 KB, 下載次數: 45)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:578991 發表于 2019-8-8 21:03 | 只看該作者
輸出全是0是什么原因     還總超時  求解答
回復

使用道具 舉報

板凳
ID:484359 發表于 2019-8-26 21:24 | 只看該作者
余思宇 發表于 2019-8-8 21:03
輸出全是0是什么原因     還總超時  求解答

看看是不是通信的問題
回復

使用道具 舉報

地板
ID:603436 發表于 2019-8-31 13:50 | 只看該作者
用3.3v供電,然后計算公式是(float)adc1*5/65535嗎?這里有沒有搞錯呢?為什么是乘以5,不是乘以3.3??
回復

使用道具 舉報

5#
ID:282095 發表于 2019-8-31 17:02 | 只看該作者
應該是有范圍的吧
回復

使用道具 舉報

6#
ID:484359 發表于 2019-9-17 22:14 | 只看該作者
wenfengtou 發表于 2019-8-31 13:50
用3.3v供電,然后計算公式是(float)adc1*5/65535嗎?這里有沒有搞錯呢?為什么是乘以5,不是乘以3.3??

經過測試發現這樣是對的,,你說為啥,我也不清楚。模塊在用5v供電的時候會出問題,會時不時的冒出來一個很小的值,后來發現5v供電的問題,造成模塊輸出問題
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 人操人人| 国产视频福利一区 | 久久国产传媒 | 91久久精品一区二区二区 | 国产精品久久久久久模特 | 国产欧美精品一区二区 | 成年免费大片黄在线观看岛国 | 日韩天堂av | 国产做爰 | 拍戏被cao翻了h承欢 | 亚洲精品福利在线 | 综合亚洲视频 | 亚洲精品一区二区三区中文字幕 | 欧美一级久久精品 | 国产一区二区三区 | 国产精品二区三区 | 久久久免费电影 | 亚洲日韩中文字幕一区 | 亚洲福利视频一区二区 | 欧美精品一区二区三区四区五区 | 欧美日韩在线综合 | 亚洲精品久久久久久久不卡四虎 | av天天操| 久久狠狠 | 国产精品久久久久久久久图文区 | jizjizjiz中国护士18| 最新国产精品精品视频 | 欧美精品一区二区三区四区五区 | 一区二区三区四区国产精品 | 成人九区 | 亚洲精品美女 | 欧美精品乱码99久久影院 | 国产三级| 国内自拍真实伦在线观看 | 精品视频在线播放 | 欧美一区二 | 在线三级电影 | 久久久久久久久久久久久久av | 黄色一级大片视频 | 亚洲精品久久久久久国产精华液 | 日韩av福利在线观看 |