单位:中南民族大学自动化 编辑:韦冬成
STM32驱动DAC7617
这是本人第一次根据时序图写程序,完成后的确是有点成就感的。所以记录下这次驱动的经历,聊以慰藉。
DAC7617是块四路串行输入 12位电压输出的数模转换器芯片,低功耗,单电源供电,使用很方便。从TI公司那里申请了两块,本来还申请其他型号的16位的,但是被拒绝了,只这两片成功了。
芯片到手后搜索了些资料,下载了芯片手册,对照着手册焊出了电路。手册上说供电用3V的,参考电压才1.25V。但是我系统板上的电源是5V或者3.3V的,而且1.25V的参考电压不容易得到。我手头上有3.3V和2.5V的AMS1117稳压芯片,于是我就用上这两块稳压芯片,把供电电压改成3.3V,参考电压改成2.5V。硬件原理图如图1:
图1
首先看看手册,了解一下芯片,都是英文的,大概看懂了一些,主要看
1
单位:中南民族大学自动化 编辑:韦冬成
引脚的功能,和时序的描述,然后把引脚都注释上中文,方便查阅。引脚功能如图2:
图2
接着就是看懂时序图开始写程序,时序图是这样叙述的:发送数据前,
LOADREG先从低电平置为高电平,然后CS从高电平变为低电平,开始传输数据,CLK先从高电平置为低电平,然后传输一位数据,CLK置高,上升沿让这位数据进位,然后再如此传输接下来的15位数据;传送完16位数据把CS置高电平,最后LOADREG置为低电平把数据锁存到DAC寄存器。如此便完成了一次DA传输。时序图如图3:
2
单位:中南民族大学自动化 编辑:韦冬成
图3
DAC16位寄存器的说明:第十五位和第十六位A1和A0为DAC通
道选择通道,共4个通道,十三位和十四为无效,第零位到第十二位为DAC值寄存器,值为0-4096;通道说明如图4:
图4
3
单位:中南民族大学自动化 编辑:韦冬成
程序源码:
/********************************************************************************* ** 文件名: mian.c ** 库函数版本 V3.5.0
** 工作环境: RealView MDK-ARM 4.20 ** 修改: 韦冬成 ** 生成日期: 2011-07-25 ** 功能: DAC7617E驱动测试 ** 说明: 3.3V供电,2.5V参考电压,0对应0V,2048对应1.25V,4095对应最大值2.50V ** 因此计算公式应为AD_Out = (2.50/4095)*N;
*********************************************************************************/ /* 包含头文件*******************************************************************/ #include \#include \
#include \
/* 类型声明 --------------——----------------------------------------------------*/ /* 宏定义 --------------——------------------------------------------------------*/ /* 变量 --------------——--------------------------------------------------------*/ /* 函数声明 -----------------------------------------------------------------*/ /* 函数功能 ------------------------------------------------------------------*/
/******************************************************************************* ** 函数名称: main
** 函数说明: 主函数 ** 输入参数: 无 ** 输出参数: 无 ** 返回参数: 无
*******************************************************************************/ int main(void) {
#ifdef DEBUG debug(); #endif SystemInit(); /* 系统初始化 */ DAC7617E_Configuration(); DAC7617E_Set_Value(0,2048); /* 通道A输出2048对应1.25V*/ DAC7617E_Set_Value(1,2048); /* 通道B输出4095对应1.25V*/ DAC7617E_Set_Value(2,4095); /* 通道C输出4095对应2.50V*/ DAC7617E_Set_Value(3,0); /* 通道D输出0对应0.00V*/ while(1) { }//while(1)结束
4
单位:中南民族大学自动化 编辑:韦冬成
}
#ifdef USE_FULL_ASSERT
/******************************************************************************* * 函数名称: assert_failed
* 函数说明: 报告在检查参数发生错误时的源文件名和错误行数 * 输入参数: file: 源文件名 line: 错误所在行数 * 输出参数: 无 * 返回参数: 无
*****************************************************************************/ void assert_failed(uint8_t* file, uint32_t line) {
/* 用户可以增加自己的代码用于报告错误的文件名和所在行数,
例如:printf(\错误参数值: 文件名 %s 在 %d行\\r\\n\
/* 无限循环 */ while (1) { } }
#endif
/***********************************文件结束***********************************/
/******************************************************************************* **文件名: DAC7617E.c **模块功能: DAC7617E模块 **修改: 韦冬成 **日期: 2011.07.26 **说明: 把LDAC直接接低电平可节省一个IO口,若不需把所有通道同时 ** 复位则可把RESET直接接高电平,再省一个IO,如此,操作该芯 ** 片只需4个IO. ** 本程序在3.3V供电,2.5V参考电压情况下测试,输出4095时对应最 ** 大电压为2.50V,中值(2048)对应1.25V.
*******************************************************************************/ #include \
/******************************************************************************* * Function Name : DAC7617E_Configuration
5