完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题描述:我用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正常。请大神指点帮助。谢谢 |
|
相关推荐
10个回答
|
|
当frq的值大于15的时候,2个通道都是正常,能够正确的输出正玄波和余弦波,当FRQ=15的是时候,是临界值,通道2正常,但是通道1开始有点不正常了, 不知道怎么描述,就是要按下示波器上的stop的时候,才能看清波形,波形是对的,但是有相移,相移大小不固定。自动的情况下,很多重影,看不清。不知道怎么发图片,就这么描述了,自己坐沙发吧。希望有大神来帮帮我。
|
|
|
|
DAC部件是有频率限制的,也就是说,DAC速度太快了,就没有输出了,这个我试过的,4系列的大概在2MHZ多一点,2系列的没试过。你的问题看现象基本可以判为DAC频率过高。
|
|
|
|
如果要提高频率,最方便的办法是减少正弦余弦表的点数,然后外接低通或带通滤波器
|
|
|
|
一个周期128个点是不能少的,现在是想提高频率,或者说是想看看DAC+DMA+TIMER最高能输出多少频率,发现提高频率到比较高的时候,通道貌似是不稳定,有时候可以输出,有时候又不行。会不会是芯片本身的问题?比如当ARR=15的的时候,发现还是临界,低于15就可能出问题,但也不一定。这是什么情况,有时候有波形输出,有时候又没有波形输出,只有高电平了,不知道什么问题 |
|
|
|
有大神测试过这个问题吗?
|
|
|
|
苏州名之卓 发表于 2019-3-15 19:56 也就是说,这可能是芯片本身的问题咯,不是程序的问题了?我现在也怀疑是这个问题呢 |
|
|
|
既然frq>15时是好的,说明程序没有问题, 是芯片的问题,要频率再高点那只能用别的芯片了
|
|
|
|
签到签到.
|
|
|
|
只有单一通道是可以到8,你现在是双通道,应该是16做为稳定工作的上限。你用15可以工作,作为产品就有点悬了。芯片的离散性可能有极少部分的芯片会不可靠。
|
|
|
|
我用的F3系列,最小为10~20之间,过小不输出有几个原因:1,如果输出过程中改变frq,则有可能timer的计数超过当前设定重载值,导致timer出错,无法继续触发。2,frq设定太小,小于DAC改变对应值所需时间(由DAC压摆决定),从而DAC出错,无法输出。3,忘了。。。。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1950 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1809 浏览 3 评论
4389 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1960 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2463 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 14:45 , Processed in 0.988764 second(s), Total 91, Slave 75 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号