在备战电赛期间使用了很多模块,后面有时间慢慢总结总结,以免下一次踩坑。
这次总结的是数模转换器DAC7811的使用,它的具体参数性能,笔者就不赘述了。相信读者在选择使用某芯片之前都会去具体看它的数据手册的。
通信时序图
通过时序图,可以看到该芯片使用的是数据为16位,时钟下降沿触发的SPI通信协议。
其通信数据的高4位为控制位,紧跟的12位才是数据位。普通使用的话,直接取C3C2C1C0=0001。
驱动程序
本次使用的是TI的MSP432P401R LanunchPad开发板。根据时序图编写的程序如下:
#ifndef __DAC7811_H_
#define __DAC7811_H_
#include "driverlib.h"
#include "stdint.h"
#define u8 unsigned char
#define u16 unsigned short int
#define u32 unsigned int
#define SCLK_Port GPIO_PORT_P5
#define SCLK_Pin GPIO_PIN0
#define SYNC_Port GPIO_PORT_P5
#define SYNC_Pin GPIO_PIN2
#define SDIN_Port GPIO_PORT_P3
#define SDIN_Pin GPIO_PIN6
#define SPI_SCLK_L GPIO_setOutputLowOnPin(SCLK_Port,SCLK_Pin)
#define SPI_SCLK_H GPIO_setOutputHighOnPin(SCLK_Port,SCLK_Pin)
#define SPI_SYNC_L GPIO_setOutputLowOnPin(SYNC_Port,SYNC_Pin)
#define SPI_SYNC_H GPIO_setOutputHighOnPin(SYNC_Port,SYNC_Pin)
#define SPI_SDIN_L GPIO_setOutputLowOnPin(SDIN_Port,SDIN_Pin)
#define SPI_SDIN_H GPIO_setOutputHighOnPin(SDIN_Port,SDIN_Pin)
void DAC7811_Init(void);
void DAC7811_Write(u16 da);
#endif
#include "DAC7811.h"
void DAC7811_Init(void)
{
GPIO_setAsOutputPin(SCLK_Port,SCLK_Pin);
GPIO_setAsOutputPin(SYNC_Port,SYNC_Pin);
GPIO_setAsOutputPin(SDIN_Port,SDIN_Pin);
SPI_SCLK_H;
SPI_SYNC_H;
SPI_SDIN_H;
}
void DAC7811_Write(u16 da) //DAC7811 12bits
{
u8 i;
da|=0x1000;//bit12=1
da&=0x1FFF;//bit15、14、13=0
SPI_SCLK_H;
SPI_SYNC_H;
SPI_SYNC_L;
for(i=0; i<16; i++)
{
SPI_SCLK_H;
if(da & 0x8000) SPI_SDIN_H;
else SPI_SDIN_L;
SPI_SCLK_L;
da<<=1;
}
SPI_SCLK_H;
SPI_SDIN_H;
SPI_SYNC_H;
}
DAC7811正常工作时,逻辑分析仪采集的时序图如下:
程序比较简单,但是当时笔者也踩到了坑,就是空闲时钟给成了低电平,导致一直无法通信。
另外,使用如下程序可以使MSP432P401R从P5.6引脚输出2.5V的参考电压,进而作为DAC7811的参考电压输入。
REF_A_setReferenceVoltage(REF_A_VREF2_5V);
REF_A_enableReferenceVoltage();
REF_A_enableReferenceVoltageOutput();
硬件电路验证
DAC7811数据手册中提供了如下两种驱动电路,第一种是单极性输出电路,第二种是双极性输出电路。
本次硬件电路的测试采用双极性输出电路。
其中运放采用的是精密运放OPA2140, 其他元器件参数基本和电路图相同。
最后焊接出来的测试电路如下:
运行程序,向DAC7811写入正弦波数据,得到的正弦波输出波形如下图所示:
下图是使用DAC7811构成程控放大器的输出波形。
最后笔者队伍遇到的问题是,驱动DAC7811输出的正弦信号频率不是很高,后级接入滤波电路后,得到的正弦信号频率最高只有30kHz左右。这远远没有达到该芯片的最高输出频率,要想提高其输出信号频率,一是采用更高主频的微控制器,二是采用硬件SPI+DMA的方式驱动。另外本次采用的是模拟SPI方式驱动,并且一次只写入单个数据,而从它的时序图知道,是可以连续写入多个数据的,采用连续写入方式可以提高一定的速度。