DAC8531双路输出问题记录

输出两路DAC,后面写的那路电压正常,前面那路输出只有设定值的一半。 

DAC8531双路输出问题记录_第1张图片

 

电路连接

DAC8531双路输出问题记录_第2张图片

程序代码

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);

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

你可能感兴趣的:(嵌入式学习,单片机,stm32,嵌入式硬件)