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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

采用STM32F103ZET6驅動TM7705或者AD7705程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:376031 發表于 2023-3-30 17:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*===================================================
  2. =        模塊名稱:TM7705 驅動模塊(2通道帶PGA的16位ADC)
  3. =        說明:使用芯片自帶的SPI2驅動
  4. =        作者:xcm
  5. =         版本:V1.0
  6. =======================================================*/

  7. #include <drv_tm7705.h>
  8. #include <drv_spi.h>
  9. #include <delay.h>
  10. #include <lcd.h>
  11. /*
  12.         TM7705模塊可以直接插到STM32f103開發板nRF24L01模塊的排母接口上。
  13.     TM7705模塊   STM32F103開發板
  14.       SCK   ------  PB13/SPI2_SCK
  15.       DOUT  ------  PB14/SPI2_MISO
  16.       DIN   ------  PB15/SPI3_MOSI
  17.       CS    ------  PG7/NRF24L01_CS
  18.       DRDY  ------  PG8/NRF24L01_IRQ
  19.       RST   ------  PG6/NRF_CE                                       
  20. */

  21. #define TM7705_CS                         PGout(7)  //CS片選宏定義,低電平有效
  22. #define TM7705_RST                         PGout(6)  //RST使能復位宏定義,低電平有效
  23. #define TM7705_DRDY         PGin(8)  //DRDY,低電平時表示TM7705可讀


  24. /*================下面為芯片的驅動數據定義============================*/
  25. /* 通信寄存器bit定義 */
  26. enum
  27. {
  28.         /* 寄存器選擇  RS2 RS1 RS0  */
  29.         REG_COMM        = 0x00,        /* 通信寄存器 */
  30.         REG_SETUP        = 0x10,        /* 設置寄存器 */
  31.         REG_CLOCK        = 0x20,        /* 時鐘寄存器 */
  32.         REG_DATA        = 0x30,        /* 數據寄存器 */
  33.         REG_ZERO_CH1        = 0x60,        /* CH1 偏移寄存器 */
  34.         REG_FULL_CH1        = 0x70,        /* CH1 滿量程寄存器 */
  35.         REG_ZERO_CH2        = 0x61,        /* CH2 偏移寄存器 */
  36.         REG_FULL_CH2        = 0x71,        /* CH2 滿量程寄存器 */

  37.         /* 讀寫操作 */
  38.         WRITE                 = 0x00,        /* 寫操作 */
  39.         READ                 = 0x08,        /* 讀操作 */

  40.         /* 通道 */
  41.         CH_1                = 0,        /* AIN1+  AIN1- */
  42.         CH_2                = 1,        /* AIN2+  AIN2- */
  43.         CH_3                = 2,        /* AIN1-  AIN1- */
  44.         CH_4                = 3                /* AIN1-  AIN2- */
  45. };

  46. /* 設置寄存器bit定義 */
  47. enum
  48. {
  49.         MD_NORMAL                = (0 << 6),        /* 正常模式 */
  50.         MD_CAL_SELF                = (1 << 6),        /* 自校準模式 */
  51.         MD_CAL_ZERO                = (2 << 6),        /* 校準0刻度模式 */
  52.         MD_CAL_FULL                = (3 << 6),        /* 校準滿刻度模式 */

  53.         GAIN_1                        = (0 << 3),        /* 增益 */
  54.         GAIN_2                        = (1 << 3),        /* 增益 */
  55.         GAIN_4                        = (2 << 3),        /* 增益 */
  56.         GAIN_8                        = (3 << 3),        /* 增益 */
  57.         GAIN_16                        = (4 << 3),        /* 增益 */
  58.         GAIN_32                        = (5 << 3),        /* 增益 */
  59.         GAIN_64                        = (6 << 3),        /* 增益 */
  60.         GAIN_128                = (7 << 3),        /* 增益 */

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

  64.         BUF_NO                        = (0 << 1),        /* 輸入無緩沖(內部緩沖器不啟用) */
  65.         BUF_EN                        = (1 << 1),        /* 輸入有緩沖 (啟用內部緩沖器) 可處理高阻抗源 */

  66.         FSYNC_0                        = 0,
  67.         FSYNC_1                        = 1                /* 不啟用 */
  68. };

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

  74.         /*
  75.                 2.4576MHz(CLKDIV=0 )或為 4.9152MHz (CLKDIV=1 ),CLK 應置 “0”。
  76.                 1MHz (CLKDIV=0 )或 2MHz   (CLKDIV=1 ),CLK 該位應置  “1”
  77.         */
  78.         CLK_4_9152M = 0x08,
  79.         CLK_2_4576M = 0x00,
  80.         CLK_1M                 = 0x04,
  81.         CLK_2M                 = 0x0C,
  82.         
  83. /*輸出更新速率設置*/
  84.         FS_20HZ     = 0X00,
  85.         FS_25HZ     = 0x01,
  86.         FS_100HZ    = 0x20,
  87.         FS_200HZ    = 0x03,
  88.         FS_50HZ                = 0x04,
  89.         FS_60HZ                = 0x05,
  90.         FS_250HZ        = 0x06,
  91.         FS_500HZ        = 0x07,

  92.         /*
  93.                 四十九、電子秤應用中提高TM7705 精度的方法
  94.                         當使用主時鐘為 2.4576MHz 時,強烈建議將時鐘寄存器設為 84H,此時數據輸出更新率為10Hz,即每0.1S 輸出一個新數據。
  95.                         當使用主時鐘為 1MHz 時,強烈建議將時鐘寄存器設為80H, 此時數據輸出更新率為4Hz, 即每0.25S 輸出一個新數據
  96.         */
  97.         ZERO_0                = 0x00,
  98.         ZERO_1                = 0x80
  99. };

  100. static void TM7705_ResetHard(void);                //硬件復位
  101. static void TM7705_SyncSPI(void);


  102. /*====================芯片的驅動數據定義到此結束==========================*/

  103. void TM7705_Init(void) //初始化函數
  104. {
  105.         /*==信號引腳初始化==*/
  106.         GPIO_InitTypeDef GPIO_InitStructure;


  107.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG, ENABLE);         //使能PB,G端口時鐘
  108.             
  109.         
  110.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                                 //PB12上拉 防止W25X的干擾
  111.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                  //推挽輸出
  112.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  113.          GPIO_Init(GPIOB, &GPIO_InitStructure);        //初始化指定IO
  114.          GPIO_SetBits(GPIOB,GPIO_Pin_12);//上拉                                
  115.          

  116.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;        //PG 7 推挽          CS
  117.          GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定IO
  118.         GPIO_SetBits(GPIOG,GPIO_Pin_7);        
  119.         
  120.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;        //PG6  推挽   RST              
  121.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  122.          GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定IO
  123.         GPIO_ResetBits(GPIOG,GPIO_Pin_6 );
  124.         
  125.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;   
  126.         GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IN_FLOATING; //PG8 輸入  DRAY
  127.         //GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU; //PG8 輸入  DRAY   兩種方式親測都可以
  128.         GPIO_Init(GPIOG, &GPIO_InitStructure);
  129.         GPIO_ResetBits(GPIOG,GPIO_Pin_8 );
  130.         
  131.         
  132.         
  133.         
  134.         
  135.         SPI2_Init();                        //初始化SPI2外設,在drv_spi.h中實現
  136.         SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//設置為18M時鐘,高速模式
  137.         
  138.         TM7705_CS = 1;                         //TM7705初始化不選中
  139.         TM7705_RST = 0;
  140.         delay_ms(10);
  141.         TM7705_ResetHard();                //硬件復位
  142.         delay_ms(5);
  143.         
  144.         TM7705_SyncSPI();      //同步SPI接口時序
  145.         delay_ms(10);
  146.         
  147.         /*配置時鐘寄存器*/
  148.         TM7705_CS = 0;
  149.         SPI2_ReadWriteByte(REG_CLOCK | WRITE |CH_1); //先寫通信寄存器,下一步寫時鐘寄存器
  150.         delay_ms(10);
  151.         SPI2_ReadWriteByte(CLKDIS_0 | CLK_4_9152M | FS_100HZ ); //刷新速率250HZ
  152.         delay_ms(10);
  153.         SPI2_ReadWriteByte(REG_CLOCK | WRITE |CH_2); //先寫通信寄存器,下一步寫時鐘寄存器
  154.         delay_ms(10);
  155.         SPI2_ReadWriteByte(CLKDIS_0 | CLK_4_9152M | FS_100HZ ); //刷新速率250HZ
  156.         delay_ms(10);
  157.         TM7705_CS = 1;
  158. /*下面注釋內容在TM7705_CalibSelf(1);函數中集成實現*/
  159. //        SPI2_ReadWriteByte(REG_SETUP | WRITE |CH_1); //先寫通信寄存器,下一步寫設置寄存器
  160. //        delay_ms(10);
  161. //        SPI2_ReadWriteByte(MD_CAL_SELF | GAIN_1 | BIPOLAR |BUF_EN |FSYNC_0        ); //寫設置寄存器,雙極性、有緩沖、增益為1、濾波器工作、自校準
  162. //        delay_ms(5 00);

  163.         /*每次上電進行一次自校準*/
  164.         TM7705_CalibSelf(1);      //內部自校準
  165.         TM7705_CalibSelf(2);      //內部自校準
  166.         delay_ms(5);
  167. }        

  168. /*===硬件復位Tm7705芯片,無出入參數===*/
  169. static void TM7705_ResetHard(void)        //硬件復位
  170. {
  171.         TM7705_RST = 1;
  172.         delay_ms(1);
  173.         TM7705_RST = 0;
  174.         delay_ms(2);
  175.         TM7705_RST = 1;
  176.         delay_ms(1);
  177. }

  178. /*=============================================
  179. = 功能:同步TM7705芯片SPI接口時序
  180. = 說明:連續發送32個1即可,不同步會發生數據錯位   
  181. ==============================================*/

  182. static void TM7705_SyncSPI(void)      //同步SPI接口時序
  183. {
  184.         TM7705_CS = 0;
  185.         SPI2_ReadWriteByte(0xFF);//32個1
  186.         SPI2_ReadWriteByte(0xFF);
  187.         SPI2_ReadWriteByte(0xFF);
  188.         SPI2_ReadWriteByte(0xFF);
  189.         
  190.         TM7705_CS = 1;

  191. }
  192. /*====================================================================
  193. =功能說明: 等待內部操作完成,自校準時間較長,需要等待
  194. =參           數: 無
  195. ======================================================================*/
  196. static void TM7705_WaitDRDY(void)
  197. {
  198.         uint32_t i;
  199.         for(i = 0; i<4000000; i++)
  200.         {
  201.                 if(TM7705_DRDY == 0)
  202.                 {
  203.                         break;
  204.                 }
  205.         
  206.         }
  207.         if(i >=4000000 )
  208.         {
  209.                 LCD_ShowString(50,100,200,16,16,"TM7705 WAIT TIME OUT !!!");
  210.         
  211.         }


  212. }



  213. /*====================================================================
  214. = 功能說明: 啟動自校準. 內部自動短接AIN+ AIN-校準0位,內部短接到Vref
  215.                         校準滿位。此函數執行過程較長,實測約 180ms        
  216. = 形    參:  _ch : ADC通道,1或2
  217. =====================================================================*/

  218. void TM7705_CalibSelf(uint8_t _ch)
  219. {
  220.         if (_ch == 1)
  221.         {
  222.                 /* 自校準CH1 */
  223.                 SPI2_ReadWriteByte(REG_SETUP | WRITE | CH_1);        /* 寫通信寄存器,下一步是寫設置寄存器,通道1 */               
  224.                 SPI2_ReadWriteByte(MD_CAL_SELF | GAIN_1 | UNIPOLAR        |BUF_EN |FSYNC_0);/* 啟動自校準 *///寫設置寄存器,單極性、有緩沖、增益為1、濾波器工作、自校準
  225.                 //SPI2_ReadWriteByte(0x4C);
  226.                 TM7705_WaitDRDY();        /* 等待內部操作完成 --- 時間較長,約180ms */
  227.         }
  228.         else if (_ch == 2)
  229.         {
  230.                 /* 自校準CH2 */
  231.                 SPI2_ReadWriteByte(REG_SETUP | WRITE | CH_2);        /* 寫通信寄存器,下一步是寫設置寄存器,通道2 */
  232.                 SPI2_ReadWriteByte(MD_CAL_SELF | GAIN_1 | UNIPOLAR |BUF_EN |FSYNC_0);        /* 啟動自校準 */
  233.                 //SPI2_ReadWriteByte(0x44);
  234.                 TM7705_WaitDRDY();        /* 等待內部操作完成  --- 時間較長,約180ms */
  235.         }


  236. }

  237. /*=====================================================================
  238. =功能說明:讀到一個8位數據
  239. =參    數:返回讀到的值
  240. =====================================================================*/
  241. static uint8_t TM7705_ReadByte(void)
  242. {
  243.         uint8_t read = 0;
  244.         TM7705_CS = 0;
  245.         read = SPI2_ReadWriteByte(0xFF);
  246.         TM7705_CS = 1;
  247.         
  248.         return read;
  249. }

  250. /*=====================================================================
  251. =功能說明:讀到一個16位數據(半字)
  252. =參    數:返回讀到16位數據的值
  253. =====================================================================*/
  254. static uint16_t TM7705_Read2Byte()
  255. {
  256.         uint16_t read = 0;
  257.         
  258.         TM7705_CS =0 ;
  259.         read = SPI2_ReadWriteByte(0xFF);
  260.         read <<=8;
  261.         read += SPI2_ReadWriteByte(0xFF);
  262.         TM7705_CS =1 ;

  263.         return read;
  264.         
  265. }

  266. /*=====================================================================
  267. =功能說明:讀到一個24位數據(3字節)
  268. =參    數:返回讀到24位數據的值
  269. =====================================================================*/
  270. static uint16_t TM7705_Read3Byte(void)
  271. {
  272.         uint32_t read = 0;
  273.         TM7705_CS = 0;
  274.         read = SPI2_ReadWriteByte(0xFF);
  275.         read <<=8;
  276.         read += SPI2_ReadWriteByte(0xFF);
  277.         read <<=8;
  278.         read += SPI2_ReadWriteByte(0xFF);
  279.         TM7705_CS =1 ;
  280.         
  281.         return read;
  282.         
  283. }

  284. /*=====================================================================
  285. =功能說明:讀取采樣電壓值
  286. =參    數:返回采樣值
  287. =====================================================================*/
  288. uint16_t TM7705_ReadAdc(uint8_t _ch)
  289. {
  290.         uint8_t i;
  291.         uint16_t read = 0;
  292.         
  293.         /* 為了避免通道切換造成讀數失效,讀2次 */
  294.         for (i = 0; i < 2; i++)
  295.         {
  296.                 TM7705_WaitDRDY();                /* 等待DRDY口線為0 */               

  297.                 if (_ch == 1)
  298.                 {
  299.                         TM7705_CS = 0;
  300.                         SPI2_ReadWriteByte(0x38);
  301.                         TM7705_CS = 1;
  302.                 }
  303.                 else if (_ch == 2)
  304.                 {
  305.                         TM7705_CS = 0;
  306.                         SPI2_ReadWriteByte(0x39);
  307.                         TM7705_CS = 1;
  308.                 }
  309.                 //TM7705_WaitDRDY();        /* 等待內部操作完成 --- 時間較長,約180ms */
  310.                 read = TM7705_Read2Byte();
  311.         }
  312.         return read;        



  313. }
復制代碼



#include <delay.h>

#include <sys.h>
#include <usart.h>
#include <lcd.h>
#include <drv_spi.h>
#include <drv_tm7705.h>
char BUFFER[200];
int main(void)
{
        int volt1,volt2;
        uint16_t adc1,adc2;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置NVUC中斷分組為2
    uart_init(115200);
        delay_init();
        LCD_Init();
        POINT_COLOR = RED;
        
        TM7705_Init();
        TM7705_CalibSelf(1); //自校準
        adc1 = TM7705_ReadAdc(1);
        TM7705_CalibSelf(2); //自校準
        adc2 = TM7705_ReadAdc(2);
        while(1)
        {   
                adc1 = TM7705_ReadAdc(1);
                adc2 = TM7705_ReadAdc(2);
               
                volt1 = (adc1 * 5000) / 65535;
                volt2 = (adc2 * 5000) / 65535;
               
                sprintf(BUFFER,"CH1=%5d v1:%5dmv",adc1,volt1);
               
                LCD_ShowString(60,154,200,16,16,BUFFER);
               
                sprintf(BUFFER,"CH2=%5d v2:%5dmv",adc2,volt2);
               
                LCD_ShowString(60,170,200,16,16,BUFFER);
        }
}

Keil代碼下載: Keil代碼.7z (238.86 KB, 下載次數: 27)

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区视频 | 欧美日本在线观看 | 看av片网站 | 亚洲69p | 中国黄色在线视频 | 色综合天天网 | 欧美一区二区三区精品 | 国产区在线看 | 三级黄视频在线观看 | 欧美日韩一区在线 | 亚洲国产精品视频一区 | 欧美aaa一级片 | 美日韩一区二区 | 91视频精选 | 久久久久久久久久久久久9999 | 欧美午夜一区 | 色久影院 | 9porny九色视频自拍 | 精品一区二区不卡 | 一区二区三区四区五区在线视频 | 欧美色综合一区二区三区 | 完全免费av在线 | 国产精品99久久久久久宅男 | 久久久久网站 | 国产伦一区二区三区视频 | 国产成人精品午夜 | 99精品免费久久久久久日本 | 视频一区二区国产 | 日本成人片在线观看 | 伊人伊成久久人综合网站 | 国产精品国产精品国产专区不片 | 亚洲一二三区在线观看 | 亚洲 欧美 激情 另类 校园 | 久久久www成人免费无遮挡大片 | 日韩美av | 亚洲一区二区三区在线 | 国内在线视频 | 视频一区二区在线观看 | 国产丝袜一区二区三区免费视频 | 亚洲成人福利视频 | 亚洲欧美国产精品久久 |