⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_fun.c

📁 基于keil for arm环境下对AD7705控制的源代码。
💻 C
字号:
/*
  针对 设置AD7705的工作方式设置
*/

#include "config.h"
#include "fundef.h"
#include <stdlib.h >

#define SPI_MODE 1
#define IO_MODE  2
#define CONNECT_MODE IO_MODE

extern uint8 Keynum;    // 数据键号0-9
extern uint8 Cnt;       // 用于定时器计数 
extern uint8 Percent;
extern uint8 Uart0_RevBuf[8];
extern uint8 Have_new_rev_uart0;
extern uint8 Rev_Cnt;   // 串口接收中断中,数据接收计数
extern uint8 Rev_end;
extern const float TMP_TABLE[];
extern const float TMP_STEP[];
extern const float TMP_STEP_DOT[];

static uint16 filter_tmp[5] ;   // 软件滤波用中间存储变量
static uint8 filter_cnt=0;

float T_Voltage; // 全局变量,电压、温度值。

/**
 * delay: 用于
 */
void delay(void){
  uint16 i;
	i=60;
	while(--i);
}

/**
 * AD7705_Write_Reg:  写AD寄存器程序
 * @Data_byte: 入口参数,需要传入到AD的数据 
 */
void AD7705_Write_Reg(uint8 Data_byte)
{ 
 #if CONNECT_MODE == IO_MODE 
  uint8 i;	
  CLR_AD7705_CS;
  SET_AD7705_CLK;
  delay();
  for(i = 0; i < 8; i++) 
  {  
	  CLR_AD7705_CLK;  
	  if(Data_byte & 0x80)
	    SET_AD7705_DIN;
    else
	    CLR_AD7705_DIN;     
		delay();		
    SET_AD7705_CLK; 
		delay();  
    Data_byte <<= 1;
  }
  SET_AD7705_CS;
	SET_AD7705_DIN;
 	delay();
 #else
  CLR_AD7705_CS;   
  S0SPDR = Data_byte;	            // 启动发送
  while( 0 == (S0SPDR & 0x80));		// 等待数据发送完毕   

	SET_AD7705_CS;
	
 #endif  
  
}

/**
 * AD7705_Read_Reg:读AD内部数据寄存器
 * @return: 函数返回 uint8型,一个读取到的AD数据
 */
uint8 AD7705_Read_Reg(void)
{ 
  uint8 Data_read;
 #if CONNECT_MODE==IO_MODE 
  uint8 i;	
	Data_read = 0;
	delay();
  SET_AD7705_DIN;			  
  SET_AD7705_CLK;
	delay();		  
  for(i = 0; i < 8; i++) 
  {
    CLR_AD7705_CLK;
		delay();    			
		Data_read <<= 1;
		if(AD7705_DOUT){           // 读取引脚	
			 Data_read |= 0x01;
		} 
		SET_AD7705_CLK;
		delay();
  }

 #else
   

	#endif
	return(Data_read); 
}

/**
 * AD7705_Read_Reg:读AD内部数据寄存器
 * @return: 函数返回 uint16型,一个读取到的AD数据
 */
uint16 AD7705_Read_Word(void)
{ 
 #if CONNECT_MODE == IO_MODE 
  uint8 i;
	uint16 addata;
	addata = 0;
  SET_AD7705_DIN;			  
  SET_AD7705_CLK;
  CLR_AD7705_CS;			  
  for(i = 0; i < 16; i++) 
  {
	  delay();
    CLR_AD7705_CLK;
		delay();     	
		addata <<= 1;
	  if(AD7705_DOUT){
			 addata |= 1;
		}
		SET_AD7705_CLK;		
  }
	delay();
  SET_AD7705_CS; 
  delay();
 #endif
//	addata=Data_read;
  return 	addata;
}	 
/**
 * AD7705_wrcfg: AD 转换初始化,设置AD7705工作方式
 * @note: 设置值需参考具体电路
 */
void AD7705_wrcfg(void){
	
 #if CONNECT_MODE == IO_MODE 
	// 32bit的高电平写入复位AD
  uint8 i;
	SET_AD7705_DIN;
	for(i=0;i<50;i++){
	  CLR_AD7705_CLK;
		delay();
		SET_AD7705_CLK;	
		delay();
	}
 #endif
  DelayNS(5);
  IRQDisable();
  AD7705_Write_Reg(0x20);   // 设置时钟寄存器,通道0
  AD7705_Write_Reg(0x04);   // 器件外接一个2.4576 MHZ的晶振	 ,50HZ输出更新
  AD7705_Write_Reg(0x10);   // 设置寄存器
  AD7705_Write_Reg(0x66);	  // 自校准,增益为16 ,单极性操作 , 串接buff
  IRQEnable();
}

/**
 * 	AD7705_Read: 读取AD内部转换数据。
 */
void AD7705_Read(void) {
  uint16 tmp0;

  IRQDisable();
  AD7705_Write_Reg(0x38);       // 命令,读数据寄存器
	filter_tmp[filter_cnt ++ ] = AD7705_Read_Word();
	IRQEnable(); 
	if( filter_cnt >= 5){	        // 5次采样结束
	   insert_sort(filter_tmp,5);     // 插入排序 
		 tmp0 = (filter_tmp[1] + filter_tmp[2] + filter_tmp[3] ) / 3;	//取平均值 
		 T_Voltage= ((float)tmp0 * AD_VREF	)	/ 0xFFFF;
	   T_Voltage =( T_Voltage / 16 ) * 1000;             // 增益为16,算得实际电压值  

     Volt_to_Temp();   // 查表转换成温度数据,发送上位机显示
		 filter_cnt = 0;
	}	
}																											


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -