DAC8531双路输出问题记录

文章描述了在使用DAC8531芯片时遇到的问题,即一路输出电压仅为设定值的一半。问题出现在DAC8531的初始化和数据写入过程中。通过调整代码,特别是对通道的选通和数据写入的时序进行了两次写入操作,暂时解决了该问题。作者计划后续深入分析时序以找到根本解决方案。
摘要由CSDN通过智能技术生成

输出两路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);

这样就能设置成功,暂时先这样吧,后面再分析时序,哪里少了一个位

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向阳花开0926

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值