stm32驱动AD7708

2018-11-30 19:23

//ad7708.h

#ifndef __AD7708_H #define __AD7708_H

void AD7708Init(char chop); long AD7708ReadResultData();

void AD7708WriteRegister(char addr,long dat); long AD7708ReadRegister(char addr); void AD7708Start(char channel);

#endif /* __AD7708_H */

//ad7708.c

/*---------------------------------------------------------------- * Copyright (C) 2011 江苏大学 电气学院416 刘中原 * 版权所有。 *

* 文件名: AD7708.c *

* 文件功能描述:

* MSP430F16x,MSP430F14X系列单片机外部AD操作函数

* 说明: 这个程序库完成通过之前实现的SPI程序完成与AD7708的通 * 信,控制AD7708进行校正、AD转换等。 *

* 功能用方法:把AD7708.c加入到项目,同时在要调用此 * 程序库的程序文件中加入包含AD7708.h的语句;这样即可正 * 常使用头文件中声明的程序了;详细可参考 本工程 和 * main.c *

* AD7708 寄存器选择

* A3 A2 A1 A0 所选寄存器

* 0 0 0 0 写操作,通信寄存器 * 0 0 0 0 读操作,状态寄存器 * 0 0 0 1 模式寄存器

* 0 0 1 0 ADC控制寄存器 * 0 0 1 1 滤波寄存器

* 0 1 0 0 ADC数据寄存器 * 0 1 0 1 ADC偏移寄存器 * 0 1 1 0 ADC增益寄存器 * 0 1 1 1 I/O控制寄存器 * 1 0 0 0 未定义 * 1 0 0 1 未定义 * 1 0 1 0 未定义

* 1 0 1 1 未定义 * 1 1 0 0 测试寄存器 * 1 1 0 1 测试寄存器 * 1 1 1 0 未定义 * 1 1 1 1 ID寄存器 *

* 若要用于AD7718,电路可以完全不变,程序把16位读取改为 * 24位的即可。 *

* 创建标识: 刘中原20110814 *

* 修改标识: * 修改描述:

**----------------------------------------------------------------*/ #include \寄存器头文件

#include \ //ad7708操作头文件,即声明本文件的有用函数 #include \ //SPI通讯程序库头文件

char IsLong[16] = {0,0,0,0,1,1,1,0,0,0,0,0,1,1,0,0}; char mode,adccon;

/**************************************************************************** * 名 称:AD7708WriteRegister * 功 能:向AD7708寄存器写入 * 入口参数:

* addr: 内部寄存器地址 * dat: 要写入的数据 * 出口参数:无

****************************************************************************/ void AD7708WriteRegister(char addr,long dat) {

SpiWriteData(addr); //写通信寄存器,通知下个操作:写addr寄存器

if(IsLong[addr]) //如果是16位寄存器, 7718则24位若移植要改if内语句 {

SpiWriteData(dat>>8); }

SpiWriteData(0xFF&dat); //写入低位数据 }

/**************************************************************************** * 名 称:AD7708ReadRegister

* 功 能:从某内部寄存器读出数据 * 入口参数:addr:内部寄存器地址 * 出口参数:long,读出的数据

****************************************************************************/ long AD7708ReadRegister(char addr) {

char h = 0,l = 0; //高低字节数据

SpiWriteData(0x40|addr); //写通信寄存器,通知下个操作:读addr寄存器 if(IsLong[addr]) {

h = SpiWriteData(0xFF); }

l = SpiWriteData(0xFF); return ((unsigned int)h<<8)|l; }

/**************************************************************************** * 名 称:AD7708ReadResultData * 功 能:读取转换结果 * 入口参数:无

* 出口参数:AD采样结果

* 说 明: AD7708:16位数据;若移植到7718,则是24位数据,需更改多读取一个字节 ****************************************************************************/ long AD7708ReadResultData() {

while((AD7708ReadRegister(0x00)&0x80)==0); //等待转换完成 return AD7708ReadRegister(0x04); }

/**************************************************************************** * 名 称:AD7708Cal * 功 能:校准AD7708

* 入口参数:channel:要校准的通道; * 出口参数:无

* 说 明: 完成AD7708的校正工作,此为内部校准,不需接入对应电平;此处不能完 * 成系统校准,如需要,可以自行添加。

****************************************************************************/ void AD7708Cal(char channel) {

adccon = (adccon&0x0f)|(channel<<4);

mode = (mode&0xf8)|0x04; //内部0校准

AD7708WriteRegister(0x02,adccon); //ADC控制寄存器,channel通道 AD7708WriteRegister(0x01,mode); //模式寄存器

while((AD7708ReadRegister(0x01)&0x07)!=0x01); //等待校准完成

mode = (mode&0xf8)|0x05; //内部 满标度校准 AD7708WriteRegister(0x01,mode); //模式寄存器

while((AD7708ReadRegister(0x01)&0x07)!=0x01); //等待校准完成 }

/**************************************************************************** * 名 称:AD7708Init * 功 能:初始化AD7708

* 入口参数:chop:斩波允许标志 为1,斩波允许,0则不允许 * 出口参数:无

* 说 明: 完成AD7708的初始化工作

****************************************************************************/ void AD7708Init(char chop) {

P3DIR|=BIT0;

P3OUT&=~BIT0; //CS选中

//主机模式,115200,8位数据位,三线模式,时钟模式1(具体见spi.c)

SpiMasterInit(115200,8,3,1); //时钟不是准确的115200(具体见spi.c) _EINT(); //开中断,spi读写程序要需要中断

char filter; adccon = 0x0f; if(chop == 0) {

filter = 0x03; //滤波寄存器设为最小值,可以更改

mode = 0x91; //斩波禁止,10通道,无缓冲,空闲模式 } else {

filter = 0x0D; //滤波寄存器设为最小值,可以更改

mode = 0x11; //斩波启用,10通道,无缓冲,空闲模式 }

AD7708WriteRegister(0x07,0x00); //IO寄存器,不用== AD7708WriteRegister(0x03,filter); //滤波寄存器

AD7708WriteRegister(0x02,0x0F); //ADC控制寄存器,0通道,单极性 AD7708WriteRegister(0x01,mode); //模式寄存器 if(chop == 0)

for(int i = 0; i<5;i++) {

//校准,因只有5个失调寄存器,多的就会覆盖之前的,只校准5个即可 AD7708Cal(5); }

_DINT(); }

/**************************************************************************** * 名 称:AD7708Start

* 功 能:AD7708单次转换开始 * 入口参数:channel:通道 * 出口参数:无

* 说 明: 单次转换

****************************************************************************/ void AD7708Start(char channel) {

adccon = (adccon&0x0f)|(channel<<4); mode = (mode&0xf8)|0x02;

AD7708WriteRegister(0x02,adccon); AD7708WriteRegister(0x01,mode); }


stm32驱动AD7708.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《康复评定技术》课程标准

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: