搜索
bottom↓
回复: 8

STM32F407+AD5724求技术支持

[复制链接]

出0入0汤圆

发表于 2012-12-22 14:59:07 | 显示全部楼层 |阅读模式
     小弟现在做一个高精度波形发生器项目,采用的CPU是STM32F407ZG内核,由于集成的DAC电压范围太小外扩SPI接口的DAC芯片AD5724.现在调了几天了,时序跟数据手册上的均成对得上,可AD5724的DAC口就是没有输出电压,实在是到了山穷水尽的地步了真发想放弃了!特此立贴求各位大侠指路。。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2012-12-22 15:08:59 | 显示全部楼层
你提供的信息太少,不足以判断问题。 REFIN 的电压对嘛?这类 DAC 很好调的。

出0入0汤圆

 楼主| 发表于 2012-12-22 15:33:53 | 显示全部楼层
REFIN外接ADR431基准电压没问题,供电电压都是正确的,楼上的大侠不知能否留下邮箱或QQ等联系方式?

出0入0汤圆

 楼主| 发表于 2012-12-22 15:39:08 | 显示全部楼层
源代码如下 /* Includes ------------------------------------------------------------------*/

#include "main.h"

void Delay_W5100(unsigned int x)
{
        unsigned int i;
        for(i=0;i<x;i++)
        ;
}

void AD5724_Init(void)
{
        SPI2_Init();
        AD5724_nLDAC_Init();
        AD5724_nCLR_Init();       
        AD5724_nCLR_On();
        AD5724_nLDAC_Off();       
        SPI2_SCK_Off();
        SPI2_NSS_On();
}
void SPI2_Init(void)
{
        SPI2_NSS_Init();
        SPI2_SCK_Init();
        SPI2_MOSI_Init();
        SPI2_MISO_Init();
}
void SPI2_MISO_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

    // Enable the W5100_INT Clock        
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

          // Configure W5100_INT pin as input
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
          GPIO_Init(GPIOB, &GPIO_InitStructure);


}
void SPI2_MOSI_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
  
          /* Enable the GPIO_LED Clock */
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);


          /* Configure the GPIO_LED pin */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
          GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_15);
}
void SPI2_SCK_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
  
          /* Enable the GPIO_LED Clock */
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);


          /* Configure the GPIO_LED pin */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
          GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_SetBits(GPIOB,GPIO_Pin_13);
}

void SPI2_NSS_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
  
          /* Enable the GPIO_LED Clock */
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);


          /* Configure the GPIO_LED pin */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
          GPIO_Init(GPIOG, &GPIO_InitStructure);
        GPIO_SetBits(GPIOG,GPIO_Pin_7);
}


void AD5724_nLDAC_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
  
          /* Enable the GPIO_LED Clock */
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);


          /* Configure the GPIO_LED pin */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
        GPIO_SetBits(GPIOA,GPIO_Pin_8);
}
void AD5724_nCLR_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
  
          /* Enable the GPIO_LED Clock */
          RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);


          /* Configure the GPIO_LED pin */
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
          GPIO_Init(GPIOC, &GPIO_InitStructure);
        GPIO_SetBits(GPIOC,GPIO_Pin_7);
}

void SPI2_MOSI_On(void)
{
   GPIOB->BSRRL =  GPIO_Pin_15;  
}

void SPI2_MOSI_Off(void)
{
   GPIOB->BSRRH =  GPIO_Pin_15;  
}
void SPI2_SCK_On(void)
{
   GPIOB->BSRRL =  GPIO_Pin_13;  
}

void SPI2_SCK_Off(void)
{
   GPIOB->BSRRH =  GPIO_Pin_13;  
}
void SPI2_NSS_On(void)
{
   GPIOG->BSRRL =  GPIO_Pin_7;  
}

void SPI2_NSS_Off(void)
{
   GPIOG->BSRRH =  GPIO_Pin_7;  
}
void AD5724_nLDAC_On(void)
{
   GPIOA->BSRRL =  GPIO_Pin_8;  
}

void AD5724_nLDAC_Off(void)
{
   GPIOA->BSRRH =  GPIO_Pin_8;  
}
void AD5724_nCLR_On(void)
{
   GPIOC->BSRRL =  GPIO_Pin_7;  
}

void AD5724_nCLR_Off(void)
{
   GPIOC->BSRRH =  GPIO_Pin_7;  
}
void WriteToAD5724RViaSpi(uint32_t Data)
{
        uint8_t        i;
        // SPI start
        SPI2_NSS_On();
        Delay_W5100(40);
        SPI2_NSS_Off();         //bring CS low
        Delay_W5100(20);
        for(i=0; i<24; i++)
        {
                SPI2_SCK_On();
                Delay_W5100(20);       
                if(0x800000 == (Data & 0x800000))
                {
                        SPI2_MOSI_On();
                }
                else
                {
                        SPI2_MOSI_Off();                                                                                                                                                                                  
                }
                Delay_W5100(20);
                SPI2_SCK_Off();
                Delay_W5100(20);
                Data = Data << 1;
                Delay_W5100(20);
        }
        Delay_W5100(40);
           SPI2_NSS_On();
        Delay_W5100(40);
}



void ConfigAD5724R(void)
{
        uint8_t        i;
        uint32_t ins[3];

        ins[1] = Power_Control_Register | PowerUp_ALL ;
        ins[0] = Output_Range_Select_Register | Range5_Select | DAC_Channel_ALL ;
        for(i=0; i<2; i++)
        {
                WriteToAD5724RViaSpi(ins[i]);
                  Delay_W5100(2000);
                Delay_W5100(2000);

          }

}                 

uint32_t ReadFromAD5724RViaSpi(uint32_t Data)
{
        uint8_t i;
        uint32_t R_Data = 0;
        uint32_t Noop = Nop;

        WriteToAD5724RViaSpi(Data);
        SPI2_NSS_On();
        Delay_W5100(100);
        SPI2_NSS_Off();
        Delay_W5100(20);
        for(i=0; i<24; i++)
        {
                SPI2_SCK_On();
                Delay_W5100(20);
                //////////////////////////////////////////////////
                if(0x800000 == (Noop & 0x800000))
                {
                        SPI2_MOSI_On();;          //Send one to SDI pin
                }
                else
                {
                        SPI2_MOSI_Off();;          //Send zero to SDI pin
                }
                Noop = Noop << 1;
                R_Data = R_Data << 1;
                Delay_W5100(20);
//////////////////////////////////////////////////
                SPI2_SCK_Off();
                Delay_W5100(20);
                if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6) == 0x01)
                {
                        R_Data = R_Data | 0x01;
                }
                Delay_W5100(30);
        }
        Delay_W5100(40);
        SPI2_NSS_On();         
        Delay_W5100(20);
        return R_Data;
}



出0入0汤圆

 楼主| 发表于 2012-12-22 15:40:39 | 显示全部楼层
测试代码:
        //-------------------------AD5724测试-------------------------------
        WriteToAD5724RViaSpi(DAC_Register | DAC_Channel_A | 0x00FFF0); //VoutA= v
        Delay_W5100(50);
        AD5724_nLDAC_Off();
        Delay_W5100(10);
        AD5724_nLDAC_On();
        WriteToAD5724RViaSpi(DAC_Register | DAC_Channel_B | 0x000000); //VoutB= V
        Delay_W5100(50);
        AD5724_nLDAC_Off();
        Delay_W5100(10);
        AD5724_nLDAC_On();
        WriteToAD5724RViaSpi(DAC_Register | DAC_Channel_C | 0x008000); // VoutC= V
        Delay_W5100(50);
        AD5724_nLDAC_Off();
        Delay_W5100(10);
        AD5724_nLDAC_On();
        WriteToAD5724RViaSpi(DAC_Register | DAC_Channel_D | 0x00ABC0); // VoutD= V
        Delay_W5100(50);
        AD5724_nLDAC_Off();
        Delay_W5100(10);
        AD5724_nLDAC_On();

出0入0汤圆

发表于 2012-12-22 16:03:53 | 显示全部楼层
DAC电压范围太小,可以外加放大电路。

要做精度还得DDS。。

出0入0汤圆

发表于 2012-12-22 16:45:33 | 显示全部楼层
"由于集成的DAC电压范围太小"还有因为这原因的?!

出0入0汤圆

发表于 2013-10-18 17:09:03 | 显示全部楼层
我这几天也遇到这个问题,哎~

出0入0汤圆

发表于 2017-5-10 16:24:58 来自手机 | 显示全部楼层
不知楼主解决问题了么,小弟也遇到同样问题!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 17:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表