STM32F407单片机16bit_DAC_AD5689模拟量(-10V~10V)电压输出实验KEIL工程源码:
int main(void)
{
uint16_t data=0xFFFF/2;
double temp,opa;
/* 复位所有外设,初始化Flash接口和系统滴答定时器 */
HAL_Init();
/* 配置系统时钟 */
SystemClock_Config();
/* 初始化串口并配置串口中断优先级 */
MX_DEBUG_USART_Init();
KEY_GPIO_Init();
printf("硬石DAC(AD5689)模块模拟量电压输出测试\n");
AD5689_Init();
AD5689_WriteUpdate_DACREG(DAC_A,data);
AD5689_WriteUpdate_DACREG(DAC_B,0xFFFF-data);
printf("data:%d\n",data);
opa=OPA_RES_R2/OPA_RES_R1;
while(1)
{
if(KEY1_StateRead()==KEY_DOWN)
{
if(data>(0xFFFF-1000))
data=(0xFFFF-1000);
data +=1000;
AD5689_WriteUpdate_DACREG(DAC_A,data);
AD5689_WriteUpdate_DACREG(DAC_B,0xFFFF-data);
temp=(double)(data*2-0xFFFF)*2500*opa/0xFFFF;
//temp为目标电源值,这里先放大1000倍(方便计算而已),等后面显示再还原
//data是数字量DA值,当data取值为:0~0xFFFF对应AD5689输出为0~5V
//本例程是输出-10V~10V,这个功能主要是靠运放实现,特殊的电路使得:
//AD5689输出0V时对应运放输出-10V,AD5689输出2.5V对应运放输出0V,AD5689输出5V对应运放输出10V
//(上面虽说是10V,实际上应该是 2.5V*opa(运放放大倍数),这里opa=40.2K/10K=4.02)
//所以使得程序:data值为0时运放输出-10V, data为0xFFFF/2时输出运放输出0V,data为0xFFFF时输出运放输出10V
//temp=(data-0xFFFF/2)/(0xFFFF/2)*2.5*1000*opa
printf("data:%d->%0.3fV\n",data,temp/1000);
}
if(KEY2_StateRead()==KEY_DOWN)
{
if(data<1000)
data=1000;
data -=1000;