输出两路DAC,后面写的那路电压正常,前面那路输出只有设定值的一半。
电路连接
程序代码
c
#include "DAC8531.h"
#include "delay.h"
/*************************************************************
** 函数名称:
** 功能描述:初始化
** 返回参数:无
*************************************************************/
void DAC8531_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; //PA2 PA3 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化
GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3);
}
/***************************************************************************
函数名称:WriteOneByte(unsigned char 命令)
用途:写入一个字节到8531
*************************************************************************/
void DAC8531_WriteOneByte(unsigned char command)
{
unsigned char i;
for(i = 0; i < 8;i++)
{
if(command&0x80)
DAC8531_DIN_H;
else
DAC8531_DIN_L;
command <<= 1;
delay_us(4);
DAC8531_SCK_H;
delay_us(4);
DAC8531_SCK_L;
delay_us(4);
}
}
/*************************************************************
** 函数名称: DAC8531_CH1_WriteReg
** 功能描述:
** 入口参数: 无
** 返回参数: 错误码
*************************************************************/
int DAC8531_CH1_WriteReg(unsigned short DACData)
{
int rtnval = 1;
unsigned char reg[3]; //移位寄存器 24位宽
reg[0] = 0;
reg[1] = (DACData>>8)&0x00ff;
reg[2] = (DACData)&0x00ff;
GPIO_SetBits(GPIOA,GPIO_Pin_1) ;
delay_us(10);
GPIO_ResetBits(GPIOA,GPIO_Pin_0) ;
delay_us(10);
DAC8531_WriteOneByte(reg[0]);
DAC8531_WriteOneByte(reg[1]);
DAC8531_WriteOneByte(reg[2]);
delay_us(10);
GPIO_SetBits(GPIOA,GPIO_Pin_0) ;
return rtnval;
}
/*************************************************************
** 函数名称: DAC8531_CH2_WriteReg
** 功能描述:
** 入口参数: 无
** 返回参数: 错误码
*************************************************************/
int DAC8531_CH2_WriteReg(unsigned short DACData)
{
int rtnval = 1;
unsigned char reg[3]; //移位寄存器 24位宽
reg[0] = 0;
reg[1] = (DACData>>8)&0x00ff;
reg[2] = (DACData)&0x00ff;
GPIO_SetBits(GPIOA,GPIO_Pin_0) ;
delay_us(10);
GPIO_ResetBits(GPIOA,GPIO_Pin_1) ;
delay_us(10);
DAC8531_WriteOneByte(reg[0]);
DAC8531_WriteOneByte(reg[1]);
DAC8531_WriteOneByte(reg[2]);
delay_us(10);
GPIO_SetBits(GPIOA,GPIO_Pin_1) ;
return rtnval;
}
/*************************************************************
** 函数名称: DAC8531_CH1_OutVolt
** 功能描述: DAC8531 输出电压
** 入口参数: 无
** 返回参数: 错误码
*************************************************************/
int DAC8531_CH1_OutVolt(float out_volt)
{
int rtnval = 1;
u16 dac_value;
/*
VOUT=VREF*D/65536 D= Vout/Vref *65535
*/
dac_value = out_volt/DAC8531_VREF * 65535;
DAC8531_CH1_WriteReg(dac_value);
delay_ms(1);
return rtnval;
}
/*************************************************************
** 函数名称: DAC8531_CH2_OutVolt
** 功能描述: DAC8531 输出电压
** 入口参数: 无
** 返回参数: 错误码
*************************************************************/
int DAC8531_CH2_OutVolt(float out_volt)
{
int rtnval = 1;
u16 dac_value;
/*
VOUT=VREF*D/65536 D= Vout/Vref *65535
*/
dac_value = out_volt/DAC8531_VREF * 65535;
DAC8531_CH2_WriteReg(dac_value);
delay_ms(1) ;
return rtnval;
;
}
H
#ifndef _DAC8531_H
#define _DAC8531_H
#include "sys.h"
#define DAC8531_VREF 5.000f
/***************************************************************************
接线顺序
*************************************************************************/
//PA0 CS1
//PA1 CS2
//PA2 MOSI
//PA3 SCK
#define DAC8531_DIN_H GPIO_SetBits(GPIOA,GPIO_Pin_2) //PA2 MOSI
#define DAC8531_DIN_L GPIO_ResetBits(GPIOA,GPIO_Pin_2) //PA2 MOSI
#define DAC8531_SCK_H GPIO_SetBits(GPIOA,GPIO_Pin_3) //PA3 SCK
#define DAC8531_SCK_L GPIO_ResetBits(GPIOA,GPIO_Pin_3) //PA3 SCK
void DAC8531_Init(void);
int DAC8531_CH1_OutVolt(float out_volt) ;
int DAC8531_CH2_OutVolt(float out_volt) ;
#endif
暂时的解决办法:写两遍
DAC8531_CH1_WriteReg(dac_value);
delay_ms(1);
DAC8531_CH1_WriteReg(dac_value);
delay_ms(1);
这样就能设置成功,暂时先这样吧,后面再分析时序,哪里少了一个位