硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6271|回复: 4
收起左侧

[客户分享] 记录V5开发板DAC调试问题(要特别的注意初始化顺序,感觉官方例子的驱动顺序输出波

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
发表于 2013-12-31 12:35:48 | 显示全部楼层 |阅读模式
昨天开始做armfly-V5开发板的DAC的教程和例子,调试中发现如下问题。
       这个问题比较的奇葩,以前在使用F1的DAC功能时就有类似这样的问题,到了F4还是有这样的问题。
问题是这样的: 使用DAC的DMA功能输出梯形波,使用定时器6进行触发,用下面的配置顺序,发现不能输
出波形,这个完全是按照官方的配置顺序。
void bsp_InitDAC(void)
{
    DAC_GPIOConfig();
    TIM6_Config();
    DAC_Ch1_EscalatorConfig();
}
优化等级设置成0,1,2,3都不行,后来把这个三个函数里面的内容放到一个函数里面实现,完全没有问题了,的确
有点奇葩,下面是官方的驱动配置顺序输出波形。
TEK00001.PNG

下面把驱动顺序改为下面两种也是没有问题的
void bsp_InitDAC(void)
{   
    TIM6_Config();
    DAC_GPIOConfig();
    DAC_Ch1_EscalatorConfig();
}
void bsp_InitDAC(void)
{
    DAC_GPIOConfig();
    DAC_Ch1_EscalatorConfig();
    TIM6_Config();
}
但是输出的波形是这个样子的,感觉这个是正确的,因为这个锯齿波使用了6个参考点
const uint8_t aEscalator8bit[6] = {0x00, 0x33, 0x66, 0x99, 0xCC, 0xFF}; 里面有最小值0
和最大值0xFF。而上面的图有比较大的直流电压偏移,上面那个截图有520mv的偏移。
TEK00000.PNG



个人认为官方提供的驱动顺序是不正确的,后来利用此功能输出正弦波,官方的驱动顺序和我在上面写的驱动顺序
输出效果基本是一样的。
下面是官方的驱动效果。
TEK00000.PNG

我上面写的驱动效果
TEK00001.PNG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107396
QQ
 楼主| 发表于 2013-12-31 21:43:25 | 显示全部楼层
以前用F1自带的DAC做信号发生器的时候就存在初始化顺序不对,无法输出波形的问题。
主要是针对利用DMA输出波形,同时定时器触发。
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2016-1-12 11:15:28 | 显示全部楼层
后来发现这个问题原因是:
1.  ST提供的DAC配置例程不严谨, DAC_InitStructure 在ST的例子中是全局变量,c库会初始化为0,因此ST的例子没问题
2. 如果DAC_InitStructure 是局部变量,那就要小心了。必须初始化全部的成员变量,否则DAC会配置失败。
   这个问题在TIM的配置中也存在,一些看上去不用的成员变量,也必须初始化。

    /* DAC channel1 Configuration */
    {
        DAC_InitTypeDef DAC_InitStructure;

        DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
        //DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
        DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
        DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;     <---- 这个必须加,否则这个成员变量的值是随机的,导致DAC配置失败。
        DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
        DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    }
回复

使用道具 举报

336

主题

2042

回帖

3055

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3055
发表于 2016-1-16 19:04:45 | 显示全部楼层
我以前也碰到过这个问题呢! 也是定时器+DMA触发DAC,偶尔编译后不能输出波形。原来是这个原因。

不过,编译器应该把这种没有初值的变量自动设零啊?即便是局部变量也应如此的。 这种陷阱太难避免了。

------继续分析----------
我查到了库函数中有专门的结构体的初始化函数。比如这种DAC的结构体顶以后,可以跟着调用初始化函数。
void DAC_VOLTAGE_Configuration(void)

{
    GPIO_InitTypeDef GPIO_InitStructure;
    DAC_InitTypeDef DAC_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;
//只要是自己定义过结构体的地方,都跟上一个初始化函数!!
    DAC_StructInit(&DAC_InitStructure);  //DAC的结构体初始化
    DMA_StructInit(&DMA_InitStructure);
    GPIO_StructInit(&GPIO_InitStructure);
xxxxxxxxxxxxxxxxx  自己的配置和执行内容
};
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-30 00:13 , Processed in 0.237247 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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