历史上的今天
返回首页

历史上的今天

今天是:2025年01月26日(星期日)

2019年01月26日 | stm32 DAC+DMA 输出100K正弦波杠杠的

2019-01-26 来源:eefocus

之前想用stm32的DAC输出正弦波,才用的方案是在死循环里面用for循环输出36点的电压值模拟成一个完整的正弦波。发现最多只能输出个20KHz的波形,在示波器下面能够看到明显的梯度。后来用DMA+ADC的模式发现可以上100K(不过频率有点飘),下面吧代码贴出来


void DAC_DMA_Configuration(void)

{

DAC_InitTypeDef            DAC_InitStructure;

DMA_InitTypeDef            DMA_InitStructure;

TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;

GPIO_InitTypeDef GPIO_InitStructure;


  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

  /* GPIOA Periph clock enable */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM4, ENABLE);


  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

 /* TIM2 Configuration */

  /* Time base configuration */

  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 

  TIM_TimeBaseStructure.TIM_Period = 50;          

  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;       

  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


  /* TIM2 TRGO selection */

  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);


  /* DAC channel1 Configuration */

  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;

  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;

  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

  DAC_Init(DAC_Channel_2, &DAC_InitStructure);



  DMA_DeInit(DMA2_Channel4);


  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  DMA_InitStructure.DMA_BufferSize = 36;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;


  DMA_Init(DMA2_Channel4, &DMA_InitStructure);

  /* Enable DMA2 Channel4 */

  DMA_Cmd(DMA2_Channel4, ENABLE);

  DAC_Cmd(DAC_Channel_2, ENABLE);

  DAC_DMACmd(DAC_Channel_2, ENABLE);



  /* TIM2 enable counter */

  TIM_Cmd(TIM2, ENABLE);



  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); 

  TIM_TimeBaseStructure.TIM_Period = 40;          

  TIM_TimeBaseStructure.TIM_Prescaler = 0x0;       

  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    

  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  

  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  /* TIM2 TRGO selection */

  TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update);

  /* DAC channel1 Configuration */

  DAC_InitStructure.DAC_Trigger = DAC_Trigger_T4_TRGO;

  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;

  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

  DAC_Init(DAC_Channel_1, &DAC_InitStructure);


  DMA_DeInit(DMA2_Channel3);

  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R2_Address;

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

  DMA_InitStructure.DMA_BufferSize =36;

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

  DMA_InitStructure.DMA_Priority = DMA_Priority_High;

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;


  DMA_Init(DMA2_Channel3, &DMA_InitStructure);

  /* Enable DMA2 Channel4 */

  DMA_Cmd(DMA2_Channel3, ENABLE);



  DAC_Cmd(DAC_Channel_1, ENABLE);

  DAC_DMACmd(DAC_Channel_1, ENABLE);

  TIM_Cmd(TIM4, ENABLE);


}


代码输出的频率是40K和50K两路。示波器下面看起来还蛮不错的。


推荐阅读

史海拾趣

Echelon_Corporation公司的发展小趣事

近年来,随着物联网技术的快速发展,Echelon也积极布局该领域。公司在嵌入式系统部门收购了Echelon Corporation后,成立了新的物联网业务部门,并推出了SmartServer物联网平台。该平台采用了开放、可扩展的体系结构,可以连接、监控商业和工业物联网部署设备,并提供智能化和自动化的决策支持。SmartServer平台的推出,使得Echelon在物联网领域取得了重要突破。

浙江东亚电子(DongYa)公司的发展小趣事

浙江东亚电子自成立以来,一直致力于技术创新和研发。公司拥有一支由50余名技术研发人员组成的专业团队,不断开发新产品和解决方案,以满足市场需求。这些创新产品不仅在国内外市场上获得了广泛认可,还为公司在新能源、通讯和军工等领域树立了良好的品牌形象。

Ceramics公司的发展小趣事

“绿色陶瓷”公司以其环保理念为核心,致力于研发和生产环保型陶瓷电子材料。该公司采用可再生资源和低能耗生产工艺,成功降低了产品对环境的影响。同时,绿色陶瓷还积极推广循环经济模式,通过回收再利用废旧陶瓷材料,实现了资源的最大化利用。这一环保理念不仅赢得了消费者的青睐,也为公司在电子行业的可持续发展奠定了坚实基础。

BOPLA公司的发展小趣事

随着电子行业的快速发展,BOPLA意识到传统的电子元件已经无法满足市场的需求。于是,公司投入大量资源进行技术研发,成功推出了一系列具有创新性的电子元件产品。这些产品不仅性能优异,而且具有更高的可靠性和稳定性,赢得了市场的广泛好评。

Electronic Concepts Inc公司的发展小趣事

随着市场的竞争加剧,ECI意识到只有不断创新才能在行业中立足。在总经理张女士的领导下,公司投入大量资源进行研发,成功推出了一系列具有竞争力的新产品。其中,一款集成了先进算法的智能传感器,因其高精度和低功耗特性,在市场上大受欢迎。这一创新不仅提升了ECI的品牌形象,也为公司带来了丰厚的利润。

Autonics公司的发展小趣事

Autonics自成立以来,一直致力于传感器和控制器的研究与开发。公司拥有一支高素质、专业化的研发团队,不断推出具有创新性和竞争力的产品。经过多年的努力,Autonics的产品种类逐渐丰富,性能不断提升,赢得了市场的广泛认可。同时,公司还注重与国内外高校、科研机构的合作,引进先进技术,提升自身的研发能力。

问答坊 | AI 解惑

戏法人人会变,各有巧妙不同--用有限状态机对键盘模块的另类实现

最近阿姨家里的几个表哥都在热烈的讨论着状态机,表弟我心痒,也想来凑凑热闹。要想加入他们的讨论,首先得明白什么是状态机,这是今天的主题之一,不过我会首先给出定义,然后谈谈我的浅薄的理解。另外,前些日子正在学习GOF的《设计模式》,其中 ...…

查看全部问答>

LED节能灯1年节约电费相当于建6座三峡电站

节能灯寿命为2500~5000小时,而半导体LED照明灯正常情况下的寿命是5万-8万小时,但LED灯的耗电量只有普通白炽灯、霓虹灯的1/10。因此,如果我国的照明全部采用LED灯,则一年节约的电费相当于建造了6座三峡电站。有关部门应该采取强制措施推广节能产 ...…

查看全部问答>

wince开发 用c#好 还是vc啊?

wince开发 用c#好 还是vc啊?…

查看全部问答>

常用标志寄存器含义的理解

常用标志寄存器含义的理解,这是微型计算机的题目,可我不知道如何回答,我是学软件的,初次接触这些硬件的知识,老是很模糊,弄不清楚实际是怎么回事,请各位给点意见,回答一下~谢谢~…

查看全部问答>

谁有MSC51单片机视频教程及课件,最好是北航的!谢谢!

谁有MSC51单片机视频教程及课件,最好是北航的!谢谢! 我的QQ号:250193148 它发到我邮箱里或者在线传给我 谢谢了!…

查看全部问答>

上本无线通讯好书

射频和无线入门(第二版) …

查看全部问答>

STM32摄像头设计原理图.和芯片手册

摄像头设计原理图.和芯片手册…

查看全部问答>

秀下我做的调试工具:UsbHub+xlink+USB转串口/485/Nrf24L01/红外

秀下我的调试工具UsbHub+xlink+USB转串口/485/Nrf24L01/红外 看了小马哥的多功能调试工具真是羡慕啊,于是也做了个高速USBhub托了个xlink, 用stm32实现 USB转串口TTL/串口232/串口485(通过跳线来实现)/NRF24L01/红外,同时支持输出一路PWM输出。 ...…

查看全部问答>

HELPER2416开发板(二):安装fedora开发环境

我下了光盘,按照HELPER2416_V2 开发板LINUX 用户手册 的说明按装上了。fedora开发环境。 没有什么可注意的地方,有一个地方就是安装fedora那个选项,直接选中解压后的F12目录就行。我不知怎么搞出两个fedora文件,反正也好用: 我现在的 ...…

查看全部问答>