C语言-PIC18F25K22-AD7705

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.

当调试过程中遇到困难时,欢迎在评论区讨论。笔者回复速度,随缘,哈哈哈。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
pic18f25k80 是一款微控制器,它有许多内置功能,包括用于串口通信的模块。在使用串口通信时,我们需要编写程序来控制这些模块。下面是一个简单的示例程序,演示如何在 pic18f25k80 上使用串口通信。 首先,我们需要初始化串口通信模块。我们可以设置波特率、数据位和停止位,以确保通信的准确性。然后,我们可以设置串口接收和发送的中断,以便在接收到新数据或发送完数据时及时响应。 接着,在主程序中,我们可以使用串口发送和接收数据。例如,我们可以使用串口发送一个字符串给另一个设备,或者从另一个设备接收数据并进行处理。 下面是一个基本的串口通信程序示例: ```c void main() { // 初始化串口模块 // 设置波特率、数据位和停止位 // 设置接收和发送中断 while(1) { // 发送数据 send_data("Hello, world!"); // 接收数据 char received_data[20]; receive_data(received_data); // 处理接收到的数据 } } ``` 在上面的示例程序中,我们首先初始化了串口通信模块,然后在一个无限循环中发送和接收数据。这只是一个简单的演示程序,实际应用中,我们可能需要更复杂的逻辑和错误处理来确保通信的稳定性和可靠性。 总之, pic18f25k80 是一款强大的微控制器,它内置了丰富的功能,包括强大的串口通信模块。通过编写相应的程序,我们可以利用这些功能实现各种串口通信应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Charles Chow

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值