AD7705中文手册部分翻译
本文章所述操作仅为笔者自身调试过程的记录,可确保可操作性,但并非最优化操作。
关于AD7705模块的最优化操作,欢迎广大网友分享,若本文章可作为优化文章的基础,笔者将感到不甚荣幸。
硬件连接图
AD7705
引脚7"AIN1(+)"和引脚8“AIN1(-)”为通道1的两个输入引脚,即带测量电压信号输入引脚。
引脚5为模块复位引脚,不可缺省。
引脚4为SPI通信协议片选引脚,低电平有效。若无需片选功能,则可将该引脚直接接地。
TL431为稳压二极管,在此处提供2.5V参考电压。
PIC18F25K22
本项目采用PIC18F25K22的MSSP2通信模块。
根据PIC18F25K22数据手册连接相应的通信引脚。
AD7705复位引脚RST和片选引脚CS由GPIO(普通IO引脚)控制即可。
软件
SPI工作模式
在MCC模块化编程插件中配置SPI模块工作模式:模式3,末尾采样。
选择该工作模式的理由如下:
AD7705通信时序图:
为了能够与之通信,MCU的SPI通讯模块也应采用相同的通讯时序。查阅手册可得如下通讯模式时序图:
例程
注意:每次使用AD7705读取数据前,应将其先复位。
笔者在使用过程中所遇到的情况与下列文章中所描述的情况相同:
关于AD7705使用时需要复位的文章,参考:链接: https://wenku.baidu.com/view/38261bf33069a45177232f60ddccda38366be100.html.
下列代码读者应按需选取,舍去例程中冗余的代码。
main.c
void main(void)
{
SPI2_Initialize();
SPI2_Open(0);
CS_ADC_LOW(); //片选器件
Init_AD7705();
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
// Disable the Global Interrupts
//INTERRUPT_GlobalInterruptDisable();
// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();
while (1)
{
// Add your application code
if(EUSART1_DataReady)
{
if(EUSART1_Read()==0x03)
{
CW_AD7705();
}
}
}
}
AD7705.h
/*
* File: AD7705.h
* Author: Administrator
*
* Created on December 9, 2021, 1:28 PM
*/
#ifndef AD7705_H
#define AD7705_H
#include "bsp_zx.h"
#define CS_ADC_LOW() LATB0=0
#define CS_ADC_HIGH() LATB0=1
#define RST_ADC() LATA2=0
#define SET_ADC() LATA2=1
#ifdef __cplusplus
extern "C" {
#endif
void Test_SPI_AD7705(void);
void AD7705_WriteByte(u8 Dst_Addr);
void Init_AD7705(void);
u16 GetData7705_CH1(void);
//u16 GetData7705_CH2(void);
//void ADC_7705(void);
//void ADC_7705_double(void);
#ifdef __cplusplus
}
#endif
#endif /* AD7705_H */
AD7705.c
/*
* File: AD7705.c
* Author: Administrator
*
* Created on December 9, 2021, 1:37 PM
*/
#include <xc.h>
#include "AD7705.h"
#include "math.h"
#include "bsp_zx.h"
#include "spi2.h"
//写数据
//void AD7705_WriteByte(u8 Dst_Addr)
//{
// CS_ADC_LOW();//使能器件
// delay_us(20);
// SPIx_ReadWriteByte(Dst_Addr);
// delay_us(100);
// CS_ADC_HIGH();//使能器件
//}
//void Test_SPI_AD7705(void)
//{
// u8 i=0;
// CS_ADC_LOW(); //片选器件
// SPI2_Write(0x18); //读设置寄存器
//
// //待数据准备好AdDrdy=0
while( PORTAbits.RA1==1)
{
CLRWDT();
// EUSART1_Write(0x03);
}
// delay_us(20);
// i = SPI2_Read();
// EUSART1_Write(i);
// CS_ADC_HIGH(); //取消片选
//}
/********AD7705初始化函数***********/
void Init_AD7705(void)
{
u8 i;
RST_ADC();
Delay_ms(10);
SET_ADC();
for(i=0;i<10;i++)/* 多于连续32个 DIN=1 使串口复位 */
{
CLRWDT();
SPI2_Write(0xFF);//持续DIN高电平写操作,恢复AD7705接口
}
SPI2_Write(0x20); /* 通信寄存器:写时钟寄存器选中ch1*/
SPI2_Write(0x08); /* 4.9152MHz时钟,50Hz数据更新速率 */
SPI2_Write(0x10); /*通信寄存器:选择设置寄存器,使用chnanel 1*/
SPI2_Write(0x42); //写设置寄存器 ,设置成双极性、有缓冲、增益为1、滤波器工作、自校准
}
/* 读AD7705转换数据 输入通道channel */
u16 GetData7705_CH1(void)
{
u16 temp1 = 0;
u16 DataL = 0;
u16 DataH = 0;
CS_ADC_LOW(); //片选器件
Init_AD7705();
SPI2_Write(0x38); //选中CH1数据寄存器读
//待数据准备好AdDrdy=0
while( PORTAbits.RA1==1)
{
CLRWDT();
// EUSART1_Write(0x03);
}
delay_us(20);
DataH = (u16)SPI2_Read();
DataL = (u16)SPI2_Read();
delay_us(100);
// CS_ADC_HIGH(); //取消片选
DataH = DataH << 8;
temp1 = DataH | DataL;
return temp1;
}
bsp_zx.h
/*
* File: config.h
* Author: Administrator
*
* Created on 2021年12月2日, 上午11:06
*/
#ifndef BSP_ZX_H
#define BSP_ZX_H
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#ifdef __cplusplus
extern "C" {
#endif
#define PIN_SCAN LATA0
#define ON 1
#define OFF 0
#define u8 unsigned char
#define u16 unsigned int
extern unsigned char count_t1_flow; //TMR1溢出次数
extern unsigned char T1L; //TMR1L装载值
extern unsigned char T1H; //TMR1H装载值
extern unsigned char count_tmr0;
extern __bit flag_ccp;
extern unsigned char Nx;; //信号计数值
extern unsigned char NyL0; //TMR1起始值低位
extern unsigned char NyH0; //TMR1起始值高位
extern unsigned char NyL1; //TMR1结束值低位
extern unsigned char NyH1; //TMR1结束值高位
extern __bit flag_tmr0; //闸门状态
extern unsigned char count_t1; //激励信号高低电平变化次数
extern __bit over_time; //振弦响应超时标志位
#ifdef __cplusplus
}
#endif
void SPI2_Write(u8 data);
u8 SPI2_Read( void );
void GB_CCP2(void);
void Delay_ms(unsigned int ms);
void delay_us(unsigned int us);
#endif /* BSP_ZX_H */
bsp_zx.c
/*
* File: bsp_zx.c
* Author: Administrator
*
* Created on December 3, 2021, 1:37 PM
*/
#include <xc.h>
#include "spi2.h"
//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
void SPI2_Write(uint8_t data)
{
SSP2CON1bits.WCOL = 0;
PIR3bits.SSP2IF = 0;
SSP2BUF = data;
while(!PIR3bits.SSP2IF );
PIR3bits.SSP2IF = 0;
}
uint8_t SPI2_Read( void )
{
SSP2CON1bits.WCOL = 0;
PIR3bits.SSP2IF = 0;
SSP2BUF = 0xFF; // 初始化SPI总线读写周期
while ( !PIR3bits.SSP2IF ); // 等待接收完成
PIR3bits.SSP2IF = 0;
return ( SSP2BUF );
}
//void GB_CCP2(void)
//{
// CLRWDT(); //清除WDT
// TMR1ON = 0; //停止TMR1计数
// TMR1IF = 0;
// TMR1IE = 0;
// CCP2IE = 0; //关闭CCP2捕获中断
// CCP2IF = 0;
// TMR0_StopTimer();
//}
/******************************** 延时函数 ********************************
函 数 名: Delay_ms //@PIC18F25k22/16MHz*4PLL
函数功能: 延时函数
备 注 : 未校准
******************************************************************************/
void Delay_ms(unsigned int ms)
{
unsigned int i;
do
{
i = 1140;
while(--i)
{
CLRWDT(); //清除WDT
}
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
}
while(--ms);
}
/******************************** 延时函数 ********************************
函 数 名: Delay_us //@PIC18F25k22/16MHz*4PLL
函数功能: 延时函数
备 注 : 未校准
******************************************************************************/
void delay_us(unsigned int us)
{
do
{
CLRWDT(); //清除WDT
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
}
while(--us);
}
关于AD7705使用时应选择缓冲模式的文章,参考:链接: https://blog.csdn.net/tianxuechao/article/details/53893995?fps=1&locationNum=3.
STM32-AD7705的使用,参考:链接: https://blog.csdn.net/tianxuechao/article/details/53893995?fps=1&locationNum=3.
当调试过程中遇到困难时,欢迎在评论区讨论。笔者回复速度,随缘,哈哈哈。