📄 ad_fun.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 + -