你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

奇怪的问题,DAC+DMA+TIMER输出正玄波的问题。

[复制链接]
风905067 提问时间:2017-5-28 15:18 /
问题描述:我用stm32f207的PA4(DAC通道1)、PA5(DAC通道2)输出正玄波和余弦波,利用了DMA和TIM2和TIM6分别做触发,TIM2触发DMA1_Stream5,TIM6触发DMA1_Stream6,PA4输出了正弦波,PA5输出了余弦波,     TIM2->ARR = 20;    TIM6->ARR = 20;输出频率相同,看不出问题,可是问题出在哪里呢?问题在于,当ARR的值小于15的时候,比如 TIM2->ARR = 14;   
TIM6->ARR = 14;
问题来了,通道1一直是高电平,通道输出余弦波正常。
于是改变用TIM2触发DMA1_Stream6,TIM6触发DMA1_Stream5,ARR都为14(低于15都一样);  同样还是通道一有同样的问题,二通道2却正常输出了波形。于是我想跟TIM没有关系,后来也尝试改变波形数据,发现也不是波形数据的问题。不知道是否有大神帮我分析一下这个问题是怎么回事。我用的是keil工具。数据是用EXCEl计算出来的,应该是没有问题的。代码如下:


#include "stm32f2xx_dac.h"
#include "stm32f2xx_dma.h"
#include "stm32f2xx.h"


#define                DAC1_DMA_ADDR                                                        0x40007408            //   DAC通道1地址
#define                DAC2_DMA_ADDR                                                        0x40007414        //   DAC通道2地址



uc32  DAC_sinTAB[]={
2000        ,2098        ,2196        ,2293        ,2390        ,2486        ,2581        ,2674        ,
2765        ,2855        ,2943        ,3028        ,3111        ,3191        ,3269        ,3343        ,
3414        ,3482        ,3546        ,3606        ,3663        ,3715        ,3764        ,3808        ,
3848        ,3883        ,3914        ,3940        ,3962        ,3978        ,3990        ,3998        ,
4000        ,3998        ,3990        ,3978        ,3962        ,3940        ,3914        ,3883        ,
3848        ,3808        ,3764        ,3715        ,3663        ,3606        ,3546        ,3482        ,
3414        ,3343        ,3269        ,3191        ,3111        ,3028        ,2943        ,2855        ,
2765        ,2674        ,2581        ,2486        ,2390        ,2293        ,2196        ,2098        ,
2000        ,1902        ,1804        ,1707        ,1610        ,1514        ,1419        ,1326        ,
1235        ,1145        ,1057        ,972                ,889                ,809         ,731         ,657         ,
586                ,518         ,454                ,394                ,337                ,285         ,236                ,192                ,
152          ,117         , 86          , 60          , 38          , 22          , 10          ,  2                ,
   0                ,  2                ,  10          ,  22          , 38               , 60                , 86                ,117          ,
152                ,192          ,236         ,285         ,337         ,394         ,454         ,518                ,
586                ,657         ,731                ,809                ,889         ,972               ,1057        ,1145        ,
1235        ,1326        ,1419        ,1514        ,1610        ,1707        ,1804        ,1902                       
};



uc32 DAC_cosTAB[] = {
        4000        ,3998        ,3990        ,3978        ,3962        ,3940        ,3914        ,3883        ,
        3848        ,3808        ,3764        ,3715        ,3663        ,3606        ,3546        ,3482        ,
        3414        ,3343        ,3269        ,3191        ,3111        ,3028        ,2943        ,2855        ,
        2765        ,2674        ,2581        ,2486        ,2390        ,2293        ,2196        ,2098        ,
        2000        ,1902        ,1804        ,1707        ,1610        ,1514        ,1419        ,1326        ,
        1235        ,1145        ,1057        ,972         ,889         , 809        ,731          ,657                ,
         586          ,518             ,454          ,394         ,337         ,285          , 236        ,192             ,
         152          ,117                , 86           ,  60                , 38                , 22          , 10           ,2                 ,
           0                ,  2                , 10          , 22           , 38           , 60           , 86           ,117          ,
         152                 ,192        ,236          ,285                ,337           ,394                ,454          ,518         ,
        586                ,657         ,731                ,809         ,889                ,972               ,1057        ,1145        ,
        1235        ,1326        ,1419        ,1514        ,1610        ,1707        ,1804        ,1902        ,
        2000        ,2098        ,2196        ,2293        ,2390        ,2486        ,2581        ,2674        ,
        2765        ,2855        ,2943        ,3028        ,3111        ,3191        ,3269        ,3343        ,
        3414        ,3482        ,3546        ,3606        ,3663        ,3715        ,3764        ,3808        ,
        3848        ,3883        ,3914        ,3940        ,3962        ,3978        ,3990        ,3998
};  



void TIM_Int_Init(u16 arr,u16 psc)
{
    RCC->APB1ENR|=1<<0;    //TIM2时钟使能
    TIM2->ARR=arr;   
    TIM2->PSC=psc;  
    TIM2->CR1|=1<<7;        
    TIM2->CR2 |=0x2<<4;    //TIMER更新作为TRGO源
    TIM2->CR1 |=TIM_CR1_CEN;   

    TIM6->ARR=arr;  //TIM6的时钟在前面系统初始化的时候已经开启了,这里不在重复开启,不影响问题的本质
    TIM6->PSC=psc;
    TIM6->CR1|=1<<7;      
    TIM6->CR2 |=0x2<<4;   
    TIM6->CR1 |=TIM_CR1_CEN;     

}


void DAC_DMA_init(void)
{
  DMA_InitTypeDef         DMA_InitStructure;

  DMA_DeInit(DMA1_Stream5);
  DMA_InitStructure.DMA_Channel = DMA_Channel_7;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC1_DMA_ADDR;
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)DAC_cosTAB;//
       
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_BufferSize =128;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//  
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;//   
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;       
       
  DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_1QuarterFull;
  DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
       
  DMA_Init(DMA1_Stream5, &DMA_InitStructure);
  DMA_Cmd(DMA1_Stream5, ENABLE);

///////////////////////////////////////////////////////////////////////////////////////////////////////   

  DMA_DeInit(DMA1_Stream6);
  DMA_InitStructure.DMA_Channel = DMA_Channel_7;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC2_DMA_ADDR;
  DMA_InitStructure.DMA_Memory0BaseAddr = (u32)DAC_sinTAB;//  
       
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize =128;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//  
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;//   
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;       
       
  DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_1QuarterFull;
  DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
       
  DMA_Init(DMA1_Stream6, &DMA_InitStructure);
  DMA_Cmd(DMA1_Stream6, ENABLE);

       
       
}


void Dac1_Init(void)
{   
        DAC_InitTypeDef DAC_InitStructure;
        RCC->APB1ENR|=1<<29;       // DAC时钟开启       
        DAC_DeInit();
       
        DAC_StructInit(&DAC_InitStructure);
        DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//
        DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //
        DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;//

        DAC_Init(DAC_Channel_1, &DAC_InitStructure);      //
        DAC_Cmd(DAC_Channel_1, ENABLE);                   //
        DAC_DMACmd(DAC_Channel_1, ENABLE);                //
       
        DAC_StructInit(&DAC_InitStructure);
        DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//
        DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //
        DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;//DAC
       
        DAC_Init(DAC_Channel_2, &DAC_InitStructure);      //
        DAC_Cmd(DAC_Channel_2, ENABLE);                   //
        DAC_DMACmd(DAC_Channel_2, ENABLE);                //
       
        DAC_DMA_init();
       
       TIM_Int_Init(100,0);


}

void DDS_Output_Wave( u16 frq )
{
    TIM2->ARR = frq;
    TIM6->ARR = frq;
}




说明:在初始化的时候,只要调用Dac1_Init()就OK了,想要改变波形频率,只要调用 DDS_Output_Wave( u16 frq )函数,改变frq的值就OK 了。


问题再重申一下,就是当frq的值低于15的时候,就出问题了,通道一只有高电平,没有波形输出,但是通道2正常。请大神指点帮助。谢谢




收藏 1 评论10 发布时间:2017-5-28 15:18

举报

10个回答
风905067 回答时间:2017-5-28 15:25:06
当frq的值大于15的时候,2个通道都是正常,能够正确的输出正玄波和余弦波,当FRQ=15的是时候,是临界值,通道2正常,但是通道1开始有点不正常了, 不知道怎么描述,就是要按下示波器上的stop的时候,才能看清波形,波形是对的,但是有相移,相移大小不固定。自动的情况下,很多重影,看不清。不知道怎么发图片,就这么描述了,自己坐沙发吧。希望有大神来帮帮我。
zhao.zhao 回答时间:2017-5-28 15:49:35
DAC部件是有频率限制的,也就是说,DAC速度太快了,就没有输出了,这个我试过的,4系列的大概在2MHZ多一点,2系列的没试过。你的问题看现象基本可以判为DAC频率过高。
zhao.zhao 回答时间:2017-5-28 15:53:06
如果要提高频率,最方便的办法是减少正弦余弦表的点数,然后外接低通或带通滤波器
风905067 回答时间:2017-5-28 17:02:22
zhao.zhao 发表于 2017-5-28 15:53
如果要提高频率,最方便的办法是减少正弦余弦表的点数,然后外接低通或带通滤波器 ...

一个周期128个点是不能少的,现在是想提高频率,或者说是想看看DAC+DMA+TIMER最高能输出多少频率,发现提高频率到比较高的时候,通道貌似是不稳定,有时候可以输出,有时候又不行。会不会是芯片本身的问题?比如当ARR=15的的时候,发现还是临界,低于15就可能出问题,但也不一定。这是什么情况,有时候有波形输出,有时候又没有波形输出,只有高电平了,不知道什么问题
风905067 回答时间:2017-5-28 17:04:10
有大神测试过这个问题吗?
风905067 回答时间:2017-5-28 17:07:16
zhao.zhao 发表于 2017-5-28 15:49
DAC部件是有频率限制的,也就是说,DAC速度太快了,就没有输出了,这个我试过的,4系列的大概在2MHZ多一点 ...

也就是说,这可能是芯片本身的问题咯,不是程序的问题了?我现在也怀疑是这个问题呢
zhao.zhao 回答时间:2017-5-28 18:21:40
既然frq>15时是好的,说明程序没有问题, 是芯片的问题,要频率再高点那只能用别的芯片了
samhong 回答时间:2017-5-29 06:24:01
签到签到.
熊二在深圳 回答时间:2017-5-29 09:02:58
只有单一通道是可以到8,你现在是双通道,应该是16做为稳定工作的上限。你用15可以工作,作为产品就有点悬了。芯片的离散性可能有极少部分的芯片会不可靠。

评分

参与人数 1ST金币 +6 收起 理由
MrJiu + 6 赞一个!

查看全部评分

ssht428 回答时间:2018-3-17 22:35:48
我用的F3系列,最小为10~20之间,过小不输出有几个原因:1,如果输出过程中改变frq,则有可能timer的计数超过当前设定重载值,导致timer出错,无法继续触发。2,frq设定太小,小于DAC改变对应值所需时间(由DAC压摆决定),从而DAC出错,无法输出。3,忘了。。。。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版