打印

关于STM32的DAC功能请教

[复制链接]
13897|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
oywwen|  楼主 | 2010-5-28 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问STM32F103VET6有没有DAC的功能啊?如果有,为什么会没有DAC输出啊?

这事搞了我两天了,自已实在找不出下面哪里错了,怎么会没有DA输出呢?

DAC输出引脚为PA4(DAC_OUT1)和PA5(DAC_OUT2),我设定的是由软件触发DA输出,基准为电源电压3.3V,下面是DAC输出的程序,还请哪位高人能帮忙看下问题出在哪里?谢谢了!!!

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;          //
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;    //
  GPIO_Init(GPIOA, &GPIO_InitStructure);      //A端口

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;          //
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;    //
  GPIO_Init(GPIOA, &GPIO_InitStructure);      //A端口

  DAC_DeInit();

  DAC_Cmd(DAC_Channel_1,ENABLE); //
  DAC_Cmd(DAC_Channel_2, ENABLE);
  DAC_StructInit(&DAC_Struct);//将DAC_Struct的值设为默认
  DAC_Struct.DAC_Trigger=DAC_Trigger_Software;//由软件触发
  DAC_Struct.DAC_WaveGeneration=DAC_WaveGeneration_None;//关闭波形生成
  DAC_Struct.DAC_LFSRUnmask_TriangleAmplitude=DAC_TriangleAmplitude_4095;
  DAC_Struct.DAC_OutputBuffer=DAC_OutputBuffer_Enable;//使能DAC通道缓存   
  DAC_Init(DAC_Channel_1,&DAC_Struct);
  DAC_Init(DAC_Channel_2,&DAC_Struct);

    /* Enable DAC Channel1 */
  DAC_Cmd(DAC_Channel_1, ENABLE);

  /* Enable DAC Channel2 */
  DAC_Cmd(DAC_Channel_2, ENABLE);


  DAC_SetChannel1Data(DAC_Align_12b_R,0x7ff);//12位右对齐,输出一半的基准电压
  DAC_SetChannel2Data(DAC_Align_12b_R,0x7ff);//输出一半的基准电压

  DAC_DualSoftwareTriggerCmd(ENABLE);//使能软件触发,更新DAC的值
沙发
IJK| | 2010-5-28 11:15 | 只看该作者
STM32F103VET6有DAC的功能

使用特权

评论回复
板凳
IJK| | 2010-5-28 11:17 | 只看该作者
DAC_Struct.DAC_OutputBuffer=DAC_OutputBuffer_Enable;//使能DAC通道缓存

改改它试试看,把OutputBuffer禁掉

使用特权

评论回复
地板
oywwen|  楼主 | 2010-5-28 11:47 | 只看该作者
回楼上,我禁掉过,效果一样,还是没有输出

而且PA4和PA5,我设为输入浮空,模拟输入和复用开漏都试过了,还是不行

而且我还测量了 VREF+(输入正模拟参考电压),VSSA(输出负模拟参电压)都是对了.

使用特权

评论回复
5
IJK| | 2010-5-28 12:02 | 只看该作者
“没有输出”是什么概念?  电压为0吗?
另外STM32的DAC的输出带负载能力不是很强,印象里用10k ohm作为负载是没有问题的。

使用特权

评论回复
6
oywwen|  楼主 | 2010-5-28 13:32 | 只看该作者
回楼上
是电压为0,这个端口现在是悬空,没接任何器件

使用特权

评论回复
7
IJK| | 2010-5-28 15:28 | 只看该作者
可以配置成GPIO,看输出高低电平行不行,检查芯片坏了没有

使用特权

评论回复
8
hucs| | 2010-5-28 16:37 | 只看该作者
STM32F103VET6没有用过,不过我用过STM32F103RET6,把文档中的例子稍微该以下DAC就可以用了。

使用特权

评论回复
9
oywwen|  楼主 | 2010-5-28 16:58 | 只看该作者
回7楼,我配置成GPIO,输出高低电平均正常

使用特权

评论回复
10
香水城| | 2010-5-28 17:15 | 只看该作者
1)为什么PA5配置为AF_OD?
2)是否使能了DAC的时钟?

使用特权

评论回复
11
oywwen|  楼主 | 2010-5-28 17:16 | 只看该作者
结贴,让各位费心了,问题,我找到了

使用特权

评论回复
12
oywwen|  楼主 | 2010-5-28 17:19 | 只看该作者
我的设置全是对的,就是DAC部份的时钟,我晕,这种问题竟然害我头痛了几天,DAC部份的Datasheet我看了n遍了!!!!  
哎,不知哪根筋没搞对,谢谢各位了!!!:L

使用特权

评论回复
13
oywwen|  楼主 | 2010-5-28 17:22 | 只看该作者
10楼,早点发贴就好了,我刚好找到问题了,来结贴时才看到你的回复.
      不过还是非常感谢你们!!!

使用特权

评论回复
14
zhxiaohui118| | 2010-9-9 14:38 | 只看该作者
我也遇到这个问题了,请问怎么解决阿??时钟我也配置了。但是不是没有电压输出,使输出的电压不正确。比如我要输出3.3V 但是显示的是1.4V 怎么回事??

使用特权

评论回复
15
selina1983| | 2011-1-10 21:57 | 只看该作者
mark

使用特权

评论回复
16
yixin1937| | 2011-8-15 11:39 | 只看该作者
还贴 顶一下~  忙了好多天了~今天搞定了~昨天就看到这个帖子了~有点晕了~没有仔细看~所以有点晕~
谢谢了

使用特权

评论回复
17
sixgett| | 2012-4-30 10:59 | 只看该作者
。。。。

使用特权

评论回复
18
申小林一号| | 2013-3-2 16:16 | 只看该作者
楼主你好。发我一份32的DAC的手册吧!我没有找到,谢谢喽!!675385918@qq.com

使用特权

评论回复
19
蓝色梦醒| | 2013-8-15 21:24 | 只看该作者
我现在遇到的问题是怎么PA4的电压时3.3v而PA5的电压时ov啊

#include "stm32f10x.h"

/* Private variables ---------------------------------------------------------*/


/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void NVIC_Configuration(void);
void GPIO_Configuration(void);
void DAC_Configuration(void);

int main(void)
{
        RCC_Configuration();
        NVIC_Configuration();
        GPIO_Configuration();
        DAC_Configuration();
       
        while (1)
        {
        }
}

void RCC_Configuration(void)
{
        ErrorStatus HSEStartUpStatus;
        //设置系统时钟到72Mhz
       
        /* RCC system reset(for debug purpose) */
        RCC_DeInit();
       
        /* Enable HSE */ // 外部高速时钟使能
        RCC_HSEConfig(RCC_HSE_ON);
       
        /* Wait till HSE is ready */ //ErrorStatus HSEStartUpStatus;
        HSEStartUpStatus = RCC_WaitForHSEStartUp();
       
        if (HSEStartUpStatus == SUCCESS)
        {
               
                /* HCLK = SYSCLK */
                RCC_HCLKConfig(RCC_SYSCLK_Div1);
               
                /* PCLK2 = HCLK */
                RCC_PCLK2Config(RCC_HCLK_Div1);
               
                /* PCLK1 = HCLK/2 */
                RCC_PCLK1Config(RCC_HCLK_Div2);
               
               
                /* Enable Prefetch Buffer */
                FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
               
                /* Flash 2 wait state */
                FLASH_SetLatency(FLASH_Latency_2);
               
                /* PLLCLK = 8MHz * 9 = 72 MHz */
                RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
               
                /* Enable PLL */
                RCC_PLLCmd(ENABLE);
               
                /* Wait till PLL is ready */
                while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){
                }
               
                /* Select PLL as system clock source */
                RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
               
                /* Wait till PLL is used as system clock source */
                while(RCC_GetSYSCLKSource() != 0x08)
                {}
        }
        else
        {
                /* If HSE fails to start-up, the application will have wrong clock configuration.
                User can add here some code to deal with this error */   
                /* Go to infinite loop */
                while (1)
                {}
        }
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
        /* DAC Periph clock enable */
         
}
void NVIC_Configuration(void)
{
  
#ifdef  VECT_TAB_RAM  
        /* Set the Vector Table base location at 0x20000000 */
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else  /* VECT_TAB_FLASH  */
        /* Set the Vector Table base location at 0x08000000 */
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  //确定中断向量放在RAM或者FLASH  
#endif

   
}
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOF, ENABLE);
        /*set the GPIO of DAC*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //

GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //

GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
}

void DAC_Configuration(void)
{
        DAC_InitTypeDef DAC_Struct;       
        RCC_APB1PeriphClockCmd( RCC_APB1Periph_DAC, ENABLE);
        /* DAC channel1 Configuration */
        DAC_DeInit();

        DAC_StructInit(&DAC_Struct);//将DAC_Struct的值设为默认
       
        DAC_Struct.DAC_Trigger=DAC_Trigger_Software;//由软件触发
       
        DAC_Struct.DAC_WaveGeneration=DAC_WaveGeneration_None;//关闭波形生成
       
        DAC_Struct.DAC_LFSRUnmask_TriangleAmplitude=DAC_TriangleAmplitude_4095;
       
        DAC_Struct.DAC_OutputBuffer=DAC_OutputBuffer_Enable;//使能DAC通道缓存
       
        DAC_Init(DAC_Channel_1,&DAC_Struct);
       
        DAC_Init(DAC_Channel_2,&DAC_Struct);
       
        /* Enable DAC Channel1 */
        DAC_Cmd(DAC_Channel_1,ENABLE); //
       
        DAC_Cmd(DAC_Channel_2, ENABLE);
        DAC_Cmd(DAC_Channel_1, ENABLE);

/* Enable DAC Channel2 */

DAC_Cmd(DAC_Channel_2, ENABLE);

DAC_SetChannel1Data(DAC_Align_12b_R,0x7ff);//12位右对齐,输出一半的基准电压

DAC_SetChannel2Data(DAC_Align_12b_R,0x7ff);//输出一半的基准电压

DAC_DualSoftwareTriggerCmd(ENABLE);//使能软件触发,更新DAC的值
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

96

帖子

0

粉丝