打印

AD7705两个通道采集互相干扰?这个问题应该怎么解决?有没有大神能帮下我呀?

[复制链接]
1603|3
手机看帖
扫描二维码
随时随地手机跟帖
沙发
qq416507195|  楼主 | 2020-8-11 11:51 | 只看该作者
file:///C:/Users/Administrator/Desktop/AD7705.jpg两个通道互相影响

AD7705.jpg (171.45 KB )

AD7705.jpg

使用特权

评论回复
板凳
qq416507195|  楼主 | 2020-8-11 11:52 | 只看该作者

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "bsp_tm7705.h"
#include "usart.h"

int main(void)
{
        uint16_t adc1, adc2;
        int volt1, volt2;


        USART1_Init(115200);
        bsp_InitTM7705();                        /* 初始化配置TM7705 */

        TM7705_CalibSelf(1);                /* 自校准。执行时间较长,约180ms */               
        adc1 = TM7705_ReadAdc(1);                               
       
        TM7705_CalibSelf(2);                /* 自校准。执行时间较长,约180ms */
        adc2 = TM7705_ReadAdc(2);       
        printf("tm7705测试\r");
        while (1)
        {       
               

                        /* 双通道切换采样,执行一轮实际那约 160ms */                       
                        adc1 = TM7705_ReadAdc(1);        /* 执行时间 80ms */       
                        adc2 = TM7705_ReadAdc(2);        /* 执行时间 80ms */
       
                       
                /* 打印采集数据 */
               
                       
                       
                        /* 计算实际电压值(近似估算的),如需准确,请进行校准 */
                        volt1 = (adc1 * 5000) / 65535;
                        volt2 = (adc2 * 5000) / 65535;
                       
                        /* 打印ADC采样结果 */       
                        printf("CH1=%5d (%5dmV)\r\n  CH2=%5d (%5dmV)\r", adc1, volt1, adc2, volt2);
               
        }
}               
                       

使用特权

评论回复
地板
qq416507195|  楼主 | 2020-8-11 11:53 | 只看该作者

#include "bsp_tm7705.h"
#include "delay.h"
#include "usart.h"


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

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

/*
        TM7705模块可以直接插到STM32-V5开发板nRF24L01模块的排母接口上。

    TM7705模块   STM32F407开发板
      SCK   ------  PB3/SPI3_SCK
      DOUT  ------  PB4/SPI3_MISO
      DIN   ------  PB5/SPI3_MOSI
      CS    ------  PF7/NRF24L01_CSN
      DRDY  ------  PH7/NRF24L01_IRQ
      RST   ------  PA4/NRF905_TX_EN/NRF24L01_CE/DAC1_OUT        (复位 RESET)
*/

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

#ifdef SOFT_SPI                /* 软件SPI */
        /* 定义GPIO端口 */
        #define RCC_SCK         RCC_APB2Periph_GPIOA
        #define PORT_SCK        GPIOA
        #define PIN_SCK                GPIO_Pin_0

        #define RCC_DIN         RCC_APB2Periph_GPIOA
        #define PORT_DIN        GPIOA
        #define PIN_DIN                GPIO_Pin_1

        #define RCC_DOUT         RCC_APB2Periph_GPIOA
        #define PORT_DOUT        GPIOA
        #define PIN_DOUT        GPIO_Pin_2

        #define RCC_CS                 RCC_APB2Periph_GPIOA
        #define PORT_CS                GPIOA
        #define PIN_CS                GPIO_Pin_3

        #define RCC_DRDY         RCC_APB2Periph_GPIOA
        #define PORT_DRDY        GPIOA
        #define PIN_DRDY        GPIO_Pin_4

        #define RCC_RESET         RCC_APB2Periph_GPIOA
        #define PORT_RESET        GPIOA
        #define PIN_RESET        GPIO_Pin_5

        /* 定义口线置0和置1的宏 */
        #define RESET_0()        GPIO_ResetBits(PORT_RESET, PIN_RESET)
        #define RESET_1()        GPIO_SetBits(PORT_RESET, PIN_RESET)

        #define CS_0()                GPIO_ResetBits(PORT_CS, PIN_CS)
        #define CS_1()                GPIO_SetBits(PORT_CS, PIN_CS)

        #define SCK_0()                GPIO_ResetBits(PORT_SCK, PIN_SCK)
        #define SCK_1()                GPIO_SetBits(PORT_SCK, PIN_SCK)

        #define DI_0()                GPIO_ResetBits(PORT_DIN, PIN_DIN)
        #define DI_1()                GPIO_SetBits(PORT_DIN, PIN_DIN)

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

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

#ifdef HARD_SPI                /* 硬件SPI */
        ;
#endif

/* 通信寄存器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_50HZ                = 0x00,
        FS_60HZ                = 0x01,
        FS_250HZ        = 0x02,
        FS_500HZ        = 0x04,

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

static void TM7705_SyncSPI(void);
static void TM7705_Send8Bit(uint8_t _data);
static uint8_t TM7705_Recive8Bit(void);
static void TM7705_WriteByte(uint8_t _data);
static void TM7705_Write3Byte(uint32_t _data);
static uint8_t TM7705_ReadByte(void);
static uint16_t TM7705_Read2Byte(void);
static uint32_t TM7705_Read3Byte(void);
static void TM7705_WaitDRDY(void);
static void TM7705_ResetHard(void);
static void TM7705_Delay(void);

/*
*********************************************************************************************************
*        函 数 名: bsp_InitTM7705
*        功能说明: 配置STM32的GPIO和SPI接口,用于连接 TM7705
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
void bsp_InitTM7705(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

#ifdef SOFT_SPI                /* 软件SPI */
        CS_1();
        SCK_1();
        DI_1();       
       
        /* 打开GPIO时钟 */
       
        RCC_APB2PeriphClockCmd(RCC_SCK | RCC_DIN | RCC_DOUT | RCC_CS | RCC_DRDY | RCC_RESET, ENABLE);       
        /* 配置几个推完输出IO */
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
        GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP;                /* 设为输出口 */
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        /* IO口最大速度 */
        GPIO_InitStructure.GPIO_Pin = PIN_SCK;
        GPIO_Init(PORT_SCK, &GPIO_InitStructure);

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

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

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

        /* 配置GPIO为浮动输入模式(实际上CPU复位后就是输入状态) */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                /* 设为输入口 */
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        /* IO口最大速度 */
        GPIO_InitStructure.GPIO_Pin = PIN_DOUT;
        GPIO_Init(PORT_DOUT, &GPIO_InitStructure);

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

#endif

        delay_ms(10);
       
        TM7705_ResetHard();                /* 硬件复位 */
       
        /*
                在接口序列丢失的情况下,如果在DIN 高电平的写操作持续了足够长的时间(至少 32个串行时钟周期),
                TM7705 将会回到默认状态。
        */       
        delay_ms(5);

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

        delay_ms(5);

        /* 配置时钟寄存器 */
        TM7705_WriteByte(REG_CLOCK | WRITE | CH_1);                        /* 先写通信寄存器,下一步是写时钟寄存器 */
       
        TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_50HZ);        /* 刷新速率50Hz */
        //TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_500HZ);        /* 刷新速率500Hz */
       
        /* 每次上电进行一次自校准 */
        TM7705_CalibSelf(1);        /* 内部自校准 CH1 */
        delay_ms(5);
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Delay
*        功能说明: CLK之间的延迟,时序延迟. 用于STM32F407  168M主频
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_Delay(void)
{
        uint16_t i;

        for (i = 0; i < 5; i++);
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_ResetHard
*        功能说明: 硬件复位 TM7705芯片
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_ResetHard(void)
{
        RESET_1();
        delay_ms(1);       
        RESET_0();
        delay_ms(2);
        RESET_1();
        delay_ms(1);
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_SyncSPI
*        功能说明: 同步TM7705芯片SPI接口时序
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_SyncSPI(void)
{
        /* AD7705串行接口失步后将其复位。复位后要延时500us再访问 */
        CS_0();
        TM7705_Send8Bit(0xFF);
        TM7705_Send8Bit(0xFF);
        TM7705_Send8Bit(0xFF);
        TM7705_Send8Bit(0xFF);       
        CS_1();
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Send8Bit
*        功能说明: 向SPI总线发送8个bit数据。 不带CS控制。
*        形    参: _data : 数据
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_Send8Bit(uint8_t _data)
{
        uint8_t i;

        for(i = 0; i < 8; i++)
        {
                if (_data & 0x80)
                {
                        DI_1();
                }
                else
                {
                        DI_0();
                }
                SCK_0();
                _data <<= 1;
                TM7705_Delay();
                SCK_1();       
                TM7705_Delay();               
        }
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Recive8Bit
*        功能说明: 从SPI总线接收8个bit数据。 不带CS控制。
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static uint8_t TM7705_Recive8Bit(void)
{
        uint8_t i;
        uint8_t read = 0;

        for (i = 0; i < 8; i++)
        {
                SCK_0();
                TM7705_Delay();               
                read = read<<1;
                if (DO_IS_HIGH())
                {
                        read++;
                }
                SCK_1();               
                TM7705_Delay();
        }
        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_WriteByte
*        功能说明: 写入1个字节。带CS控制
*        形    参: _data :将要写入的数据
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_WriteByte(uint8_t _data)
{
        CS_0();
        TM7705_Send8Bit(_data);
        CS_1();
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Write3Byte
*        功能说明: 写入3个字节。带CS控制
*        形    参: _data :将要写入的数据
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_Write3Byte(uint32_t _data)
{
        CS_0();
        TM7705_Send8Bit((_data >> 16) & 0xFF);
        TM7705_Send8Bit((_data >> 8) & 0xFF);
        TM7705_Send8Bit(_data);
        CS_1();
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_ReadByte
*        功能说明: 从AD芯片读取一个字(16位)
*        形    参: 无
*        返 回 值: 读取的字(16位)
*********************************************************************************************************
*/
static uint8_t TM7705_ReadByte(void)
{
        uint8_t read;

        CS_0();
        read = TM7705_Recive8Bit();
        CS_1();
       
        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Read2Byte
*        功能说明: 读2字节数据
*        形    参: 无
*        返 回 值: 读取的数据(16位)
*********************************************************************************************************
*/
static uint16_t TM7705_Read2Byte(void)
{
        uint16_t read;

        CS_0();
        read = TM7705_Recive8Bit();
        read <<= 8;
        read += TM7705_Recive8Bit();
        CS_1();

        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_Read3Byte
*        功能说明: 读3字节数据
*        形    参: 无
*        返 回 值: 读取到的数据(24bit) 高8位固定为0.
*********************************************************************************************************
*/
static uint32_t TM7705_Read3Byte(void)
{
        uint32_t read;

        CS_0();
        read = TM7705_Recive8Bit();
        read <<= 8;
        read += TM7705_Recive8Bit();
        read <<= 8;
        read += TM7705_Recive8Bit();
        CS_1();
        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_WaitDRDY
*        功能说明: 等待内部操作完成。 自校准时间较长,需要等待。
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
static void TM7705_WaitDRDY(void)
{
        uint32_t i;

        for (i = 0; i < 4000000; i++)
        {
                if (DRDY_IS_LOW())
                {
                        break;
                }
        }
        if (i >= 4000000)
        {
//                printf("TM7705_WaitDRDY() Time Out ...\r\n");                /* 调试语句. 用语排错 */
        }
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_WriteReg
*        功能说明: 写指定的寄存器
*        形    参:  _RegID : 寄存器ID
*                          _RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit
*        返 回 值: 无
*********************************************************************************************************
*/
void TM7705_WriteReg(uint8_t _RegID, uint32_t _RegValue)
{
        uint8_t bits;

        switch (_RegID)
        {
                case REG_COMM:                /* 通信寄存器 */               
                case REG_SETUP:                /* 设置寄存器 8bit */
                case REG_CLOCK:                /* 时钟寄存器 8bit */
                        bits = 8;
                        break;

                case REG_ZERO_CH1:        /* CH1 偏移寄存器 24bit */
                case REG_FULL_CH1:        /* CH1 满量程寄存器 24bit */
                case REG_ZERO_CH2:        /* CH2 偏移寄存器 24bit */
                case REG_FULL_CH2:        /* CH2 满量程寄存器 24bit*/
                        bits = 24;
                        break;

                case REG_DATA:                /* 数据寄存器 16bit */
                default:
                        return;
        }

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

        if (bits == 8)
        {
                TM7705_WriteByte((uint8_t)_RegValue);
        }
        else        /* 24bit */
        {
                TM7705_Write3Byte(_RegValue);
        }
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_ReadReg
*        功能说明: 写指定的寄存器
*        形    参:  _RegID : 寄存器ID
*                          _RegValue : 寄存器值。 对于8位的寄存器,取32位形参的低8bit
*        返 回 值: 读到的寄存器值。 对于8位的寄存器,取32位形参的低8bit
*********************************************************************************************************
*/
uint32_t TM7705_ReadReg(uint8_t _RegID)
{
        uint8_t bits;
        uint32_t read;

        switch (_RegID)
        {
                case REG_COMM:                /* 通信寄存器 */
                case REG_SETUP:                /* 设置寄存器 8bit */
                case REG_CLOCK:                /* 时钟寄存器 8bit */
                        bits = 8;
                        break;

                case REG_ZERO_CH1:        /* CH1 偏移寄存器 24bit */
                case REG_FULL_CH1:        /* CH1 满量程寄存器 24bit */
                case REG_ZERO_CH2:        /* CH2 偏移寄存器 24bit */
                case REG_FULL_CH2:        /* CH2 满量程寄存器 24bit*/
                        bits = 24;
                        break;

                case REG_DATA:                /* 数据寄存器 16bit */
                default:
                        return 0xFFFFFFFF;
        }

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

        if (bits == 16)
        {
                read = TM7705_Read2Byte();
        }
        else if (bits == 8)
        {
                read = TM7705_ReadByte();
        }
        else        /* 24bit */
        {
                read = TM7705_Read3Byte();
        }
        return read;
}

/*
*********************************************************************************************************
*        函 数 名: TM7705_CalibSelf
*        功能说明: 启动自校准. 内部自动短接AIN+ AIN-校准0位,内部短接到Vref 校准满位。此函数执行过程较长,
*                          实测约 180ms
*        形    参:  _ch : ADC通道,1或2
*        返 回 值: 无
*********************************************************************************************************
*/
void TM7705_CalibSelf(uint8_t _ch)
{
        if (_ch == 1)
        {
                /* 自校准CH1 */
                TM7705_WriteByte(REG_SETUP | WRITE | CH_1);        /* 写通信寄存器,下一步是写设置寄存器,通道1 */               
                TM7705_WriteByte(MD_CAL_SELF | __CH1_GAIN_BIPOLAR_BUF | FSYNC_0);/* 启动自校准 */
                TM7705_WaitDRDY();        /* 等待内部操作完成 --- 时间较长,约180ms */
        }
        else if (_ch == 2)
        {
                /* 自校准CH2 */
                TM7705_WriteByte(REG_SETUP | WRITE | CH_2);        /* 写通信寄存器,下一步是写设置寄存器,通道2 */
                TM7705_WriteByte(MD_CAL_SELF | __CH2_GAIN_BIPOLAR_BUF | FSYNC_0);        /* 启动自校准 */
                TM7705_WaitDRDY();        /* 等待内部操作完成  --- 时间较长,约180ms */
        }
}

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

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

/*
*********************************************************************************************************
*        函 数 名: TM7705_ReadAdc1
*        功能说明: 读通道1或2的ADC数据
*        形    参: 无
*        返 回 值: 无
*********************************************************************************************************
*/
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_WriteByte(0x38);
                }
                else if (_ch == 2)
                {
                        TM7705_WriteByte(0x39);
                }

                read = TM7705_Read2Byte();
        }
        return read;       
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝