- /*===================================================
- = 模塊名稱:TM7705 驅動模塊(2通道帶PGA的16位ADC)
- = 說明:使用芯片自帶的SPI2驅動
- = 作者:xcm
- = 版本:V1.0
- =======================================================*/
- #include <drv_tm7705.h>
- #include <drv_spi.h>
- #include <delay.h>
- #include <lcd.h>
- /*
- TM7705模塊可以直接插到STM32f103開發板nRF24L01模塊的排母接口上。
- TM7705模塊 STM32F103開發板
- SCK ------ PB13/SPI2_SCK
- DOUT ------ PB14/SPI2_MISO
- DIN ------ PB15/SPI3_MOSI
- CS ------ PG7/NRF24L01_CS
- DRDY ------ PG8/NRF24L01_IRQ
- RST ------ PG6/NRF_CE
- */
- #define TM7705_CS PGout(7) //CS片選宏定義,低電平有效
- #define TM7705_RST PGout(6) //RST使能復位宏定義,低電平有效
- #define TM7705_DRDY PGin(8) //DRDY,低電平時表示TM7705可讀
- /*================下面為芯片的驅動數據定義============================*/
- /* 通信寄存器bit定義 */
- enum
- {
- /* 寄存器選擇 RS2 RS1 RS0 */
- REG_COMM = 0x00, /* 通信寄存器 */
- REG_SETUP = 0x10, /* 設置寄存器 */
- REG_CLOCK = 0x20, /* 時鐘寄存器 */
- REG_DATA = 0x30, /* 數據寄存器 */
- REG_ZERO_CH1 = 0x60, /* CH1 偏移寄存器 */
- REG_FULL_CH1 = 0x70, /* CH1 滿量程寄存器 */
- REG_ZERO_CH2 = 0x61, /* CH2 偏移寄存器 */
- REG_FULL_CH2 = 0x71, /* CH2 滿量程寄存器 */
- /* 讀寫操作 */
- WRITE = 0x00, /* 寫操作 */
- READ = 0x08, /* 讀操作 */
- /* 通道 */
- CH_1 = 0, /* AIN1+ AIN1- */
- CH_2 = 1, /* AIN2+ AIN2- */
- CH_3 = 2, /* AIN1- AIN1- */
- CH_4 = 3 /* AIN1- AIN2- */
- };
- /* 設置寄存器bit定義 */
- enum
- {
- MD_NORMAL = (0 << 6), /* 正常模式 */
- MD_CAL_SELF = (1 << 6), /* 自校準模式 */
- MD_CAL_ZERO = (2 << 6), /* 校準0刻度模式 */
- MD_CAL_FULL = (3 << 6), /* 校準滿刻度模式 */
- GAIN_1 = (0 << 3), /* 增益 */
- GAIN_2 = (1 << 3), /* 增益 */
- GAIN_4 = (2 << 3), /* 增益 */
- GAIN_8 = (3 << 3), /* 增益 */
- GAIN_16 = (4 << 3), /* 增益 */
- GAIN_32 = (5 << 3), /* 增益 */
- GAIN_64 = (6 << 3), /* 增益 */
- GAIN_128 = (7 << 3), /* 增益 */
- /* 無論雙極性還是單極性都不改變任何輸入信號的狀態,它只改變輸出數據的代碼和轉換函數上的校準點 */
- BIPOLAR = (0 << 2), /* 雙極性輸入 */
- UNIPOLAR = (1 << 2), /* 單極性輸入 */
- BUF_NO = (0 << 1), /* 輸入無緩沖(內部緩沖器不啟用) */
- BUF_EN = (1 << 1), /* 輸入有緩沖 (啟用內部緩沖器) 可處理高阻抗源 */
- FSYNC_0 = 0,
- FSYNC_1 = 1 /* 不啟用 */
- };
- /* 時鐘寄存器bit定義 */
- enum
- {
- CLKDIS_0 = 0x00, /* 時鐘輸出使能 (當外接晶振時,必須使能才能振蕩) */
- CLKDIS_1 = 0x10, /* 時鐘禁止 (當外部提供時鐘時,設置該位可以禁止MCK_OUT引腳輸出時鐘以省電 */
- /*
- 2.4576MHz(CLKDIV=0 )或為 4.9152MHz (CLKDIV=1 ),CLK 應置 “0”。
- 1MHz (CLKDIV=0 )或 2MHz (CLKDIV=1 ),CLK 該位應置 “1”
- */
- CLK_4_9152M = 0x08,
- CLK_2_4576M = 0x00,
- CLK_1M = 0x04,
- CLK_2M = 0x0C,
-
- /*輸出更新速率設置*/
- FS_20HZ = 0X00,
- FS_25HZ = 0x01,
- FS_100HZ = 0x20,
- FS_200HZ = 0x03,
- FS_50HZ = 0x04,
- FS_60HZ = 0x05,
- FS_250HZ = 0x06,
- FS_500HZ = 0x07,
- /*
- 四十九、電子秤應用中提高TM7705 精度的方法
- 當使用主時鐘為 2.4576MHz 時,強烈建議將時鐘寄存器設為 84H,此時數據輸出更新率為10Hz,即每0.1S 輸出一個新數據。
- 當使用主時鐘為 1MHz 時,強烈建議將時鐘寄存器設為80H, 此時數據輸出更新率為4Hz, 即每0.25S 輸出一個新數據
- */
- ZERO_0 = 0x00,
- ZERO_1 = 0x80
- };
- static void TM7705_ResetHard(void); //硬件復位
- static void TM7705_SyncSPI(void);
- /*====================芯片的驅動數據定義到此結束==========================*/
- void TM7705_Init(void) //初始化函數
- {
- /*==信號引腳初始化==*/
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG, ENABLE); //使能PB,G端口時鐘
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PB12上拉 防止W25X的干擾
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽輸出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化指定IO
- GPIO_SetBits(GPIOB,GPIO_Pin_12);//上拉
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PG 7 推挽 CS
- GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定IO
- GPIO_SetBits(GPIOG,GPIO_Pin_7);
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PG6 推挽 RST
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化指定IO
- GPIO_ResetBits(GPIOG,GPIO_Pin_6 );
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PG8 輸入 DRAY
- //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PG8 輸入 DRAY 兩種方式親測都可以
- GPIO_Init(GPIOG, &GPIO_InitStructure);
- GPIO_ResetBits(GPIOG,GPIO_Pin_8 );
-
-
-
-
-
- SPI2_Init(); //初始化SPI2外設,在drv_spi.h中實現
- SPI2_SetSpeed(SPI_BaudRatePrescaler_2);//設置為18M時鐘,高速模式
-
- TM7705_CS = 1; //TM7705初始化不選中
- TM7705_RST = 0;
- delay_ms(10);
- TM7705_ResetHard(); //硬件復位
- delay_ms(5);
-
- TM7705_SyncSPI(); //同步SPI接口時序
- delay_ms(10);
-
- /*配置時鐘寄存器*/
- TM7705_CS = 0;
- SPI2_ReadWriteByte(REG_CLOCK | WRITE |CH_1); //先寫通信寄存器,下一步寫時鐘寄存器
- delay_ms(10);
- SPI2_ReadWriteByte(CLKDIS_0 | CLK_4_9152M | FS_100HZ ); //刷新速率250HZ
- delay_ms(10);
- SPI2_ReadWriteByte(REG_CLOCK | WRITE |CH_2); //先寫通信寄存器,下一步寫時鐘寄存器
- delay_ms(10);
- SPI2_ReadWriteByte(CLKDIS_0 | CLK_4_9152M | FS_100HZ ); //刷新速率250HZ
- delay_ms(10);
- TM7705_CS = 1;
- /*下面注釋內容在TM7705_CalibSelf(1);函數中集成實現*/
- // SPI2_ReadWriteByte(REG_SETUP | WRITE |CH_1); //先寫通信寄存器,下一步寫設置寄存器
- // delay_ms(10);
- // SPI2_ReadWriteByte(MD_CAL_SELF | GAIN_1 | BIPOLAR |BUF_EN |FSYNC_0 ); //寫設置寄存器,雙極性、有緩沖、增益為1、濾波器工作、自校準
- // delay_ms(5 00);
- /*每次上電進行一次自校準*/
- TM7705_CalibSelf(1); //內部自校準
- TM7705_CalibSelf(2); //內部自校準
- delay_ms(5);
- }
- /*===硬件復位Tm7705芯片,無出入參數===*/
- static void TM7705_ResetHard(void) //硬件復位
- {
- TM7705_RST = 1;
- delay_ms(1);
- TM7705_RST = 0;
- delay_ms(2);
- TM7705_RST = 1;
- delay_ms(1);
- }
- /*=============================================
- = 功能:同步TM7705芯片SPI接口時序
- = 說明:連續發送32個1即可,不同步會發生數據錯位
- ==============================================*/
- static void TM7705_SyncSPI(void) //同步SPI接口時序
- {
- TM7705_CS = 0;
- SPI2_ReadWriteByte(0xFF);//32個1
- SPI2_ReadWriteByte(0xFF);
- SPI2_ReadWriteByte(0xFF);
- SPI2_ReadWriteByte(0xFF);
-
- TM7705_CS = 1;
- }
- /*====================================================================
- =功能說明: 等待內部操作完成,自校準時間較長,需要等待
- =參 數: 無
- ======================================================================*/
- static void TM7705_WaitDRDY(void)
- {
- uint32_t i;
- for(i = 0; i<4000000; i++)
- {
- if(TM7705_DRDY == 0)
- {
- break;
- }
-
- }
- if(i >=4000000 )
- {
- LCD_ShowString(50,100,200,16,16,"TM7705 WAIT TIME OUT !!!");
-
- }
- }
- /*====================================================================
- = 功能說明: 啟動自校準. 內部自動短接AIN+ AIN-校準0位,內部短接到Vref
- 校準滿位。此函數執行過程較長,實測約 180ms
- = 形 參: _ch : ADC通道,1或2
- =====================================================================*/
- void TM7705_CalibSelf(uint8_t _ch)
- {
- if (_ch == 1)
- {
- /* 自校準CH1 */
- SPI2_ReadWriteByte(REG_SETUP | WRITE | CH_1); /* 寫通信寄存器,下一步是寫設置寄存器,通道1 */
- SPI2_ReadWriteByte(MD_CAL_SELF | GAIN_1 | UNIPOLAR |BUF_EN |FSYNC_0);/* 啟動自校準 *///寫設置寄存器,單極性、有緩沖、增益為1、濾波器工作、自校準
- //SPI2_ReadWriteByte(0x4C);
- TM7705_WaitDRDY(); /* 等待內部操作完成 --- 時間較長,約180ms */
- }
- else if (_ch == 2)
- {
- /* 自校準CH2 */
- SPI2_ReadWriteByte(REG_SETUP | WRITE | CH_2); /* 寫通信寄存器,下一步是寫設置寄存器,通道2 */
- SPI2_ReadWriteByte(MD_CAL_SELF | GAIN_1 | UNIPOLAR |BUF_EN |FSYNC_0); /* 啟動自校準 */
- //SPI2_ReadWriteByte(0x44);
- TM7705_WaitDRDY(); /* 等待內部操作完成 --- 時間較長,約180ms */
- }
- }
- /*=====================================================================
- =功能說明:讀到一個8位數據
- =參 數:返回讀到的值
- =====================================================================*/
- static uint8_t TM7705_ReadByte(void)
- {
- uint8_t read = 0;
- TM7705_CS = 0;
- read = SPI2_ReadWriteByte(0xFF);
- TM7705_CS = 1;
-
- return read;
- }
- /*=====================================================================
- =功能說明:讀到一個16位數據(半字)
- =參 數:返回讀到16位數據的值
- =====================================================================*/
- static uint16_t TM7705_Read2Byte()
- {
- uint16_t read = 0;
-
- TM7705_CS =0 ;
- read = SPI2_ReadWriteByte(0xFF);
- read <<=8;
- read += SPI2_ReadWriteByte(0xFF);
- TM7705_CS =1 ;
- return read;
-
- }
- /*=====================================================================
- =功能說明:讀到一個24位數據(3字節)
- =參 數:返回讀到24位數據的值
- =====================================================================*/
- static uint16_t TM7705_Read3Byte(void)
- {
- uint32_t read = 0;
- TM7705_CS = 0;
- read = SPI2_ReadWriteByte(0xFF);
- read <<=8;
- read += SPI2_ReadWriteByte(0xFF);
- read <<=8;
- read += SPI2_ReadWriteByte(0xFF);
- TM7705_CS =1 ;
-
- return read;
-
- }
- /*=====================================================================
- =功能說明:讀取采樣電壓值
- =參 數:返回采樣值
- =====================================================================*/
- uint16_t TM7705_ReadAdc(uint8_t _ch)
- {
- uint8_t i;
- uint16_t read = 0;
-
- /* 為了避免通道切換造成讀數失效,讀2次 */
- for (i = 0; i < 2; i++)
- {
- TM7705_WaitDRDY(); /* 等待DRDY口線為0 */
- if (_ch == 1)
- {
- TM7705_CS = 0;
- SPI2_ReadWriteByte(0x38);
- TM7705_CS = 1;
- }
- else if (_ch == 2)
- {
- TM7705_CS = 0;
- SPI2_ReadWriteByte(0x39);
- TM7705_CS = 1;
- }
- //TM7705_WaitDRDY(); /* 等待內部操作完成 --- 時間較長,約180ms */
- read = TM7705_Read2Byte();
- }
- return read;
- }
復制代碼
#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)
2023-3-30 17:20 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|