|
有人想使用STM32芯片的PWM输出功能,基于下面原理图实现指定频率的正弦波。我这里快速演示一下实现过程,任何一个STM32芯片都可以实现下面功能。依照客户的用法,我这里也使用STM32H7芯片来实现。
下面是主要配置,选用TIMER1,使用CH1做PWM输出。定时器计数时钟为200MHz.
下面是DMA配置,DMA请求源是TIM1更新事件。从内存到外设的传输方向。令DMA工作在循环模式。
下面是测试过程中用到的测试代码: #define PAI (3.1415926) #define LengthX (128) uint32_t Dynamic_CCR[LengthX]; uint8_t i=0; / USER CODE BEGIN 2 / for (i=0;i<LengthX;i++) //Prepare data according the feature of sine function { Dynamic_CCR[i] = 25000 + 25000 sin ((2 PAI * i)/LengthX); } / Enable the TIM Update DMA request / __HAL_TIM_ENABLE_DMA(&htim1, TIM_DMA_UPDATE); / Enable the DMA stream / HAL_DMA_Start_IT (htim1.hdma[TIM_DMA_ID_UPDATE], (uint32_t)&Dynamic_CCR[0], (uint32_t)&htim1.Instance->CCR1,LengthX) ; / Enable the Capture compare channel / TIM_CCxChannelCmd (htim1.Instance, TIM_CHANNEL_1, TIM_CCx_ENABLE); / Enable the main output / __HAL_TIM_MOE_ENABLE(&htim1); //Special for advanced TIMER / Enable the TIMER Counter/ __HAL_TIM_ENABLE(&htim1); / USER CODE END 2 / 基于上面测试代码及电路可以实现下面输出。 1、在TIM1-CH1的PWM输出脚测得的某时刻波形【局部的】:
2、在外部电容正极测得的某时刻波形:
3、我们在示波器里将两路输出放在一起观察的波形效果:
TIM1工作频率200MHZ,计50000个脉冲为1个计数周期,而128个计数周期刚好对应1个正弦周期。所以,根据上面的代码实现的正弦波形的频率则为31Hz。
这里强调下,建议使用TIMER 更新事件作DMA请求源,并开启TIMER CCR的预装功能,DMA传输的实现函数可以根据STM32外设库里现成的API函数做些调整后使用。其它原理性东西就没有啥要特别强调的了。 如果使用STM32H7系列芯片的话,即使采用上面一模一样的代码,也可能出现无法实现上述功能的情形。这时请注意一个地方,即DMA访问的内存变量安排在什么地址空间。如果说它被安排在DTCM区,通用DMA是访问不到的,自然相应功能也别想实现。
此时,我们有必要通过IDE的链接配置或在代码里手动做内存地址的指定安排,不要让它落在DTCM区,而应该安排在AXI SRAM或D2 域的SRAM。下面配置中,我将存储CCR变量的内存区安排在AXI SRAM区。
OK,今天的分享就到这里,但愿能给看官些许收获或启示,下次再聊! 文章出处:茶话MCU |
STM32H563 ADC+TIM+DMA应用演示
SPI 32位宽DMA方式收发失败问题
多通道DMA传输为何有一路异常?
经验分享 | STM32N6 ADC DMA 传输失败案例分享
经验分享 | DMA发送函数只能第一次调用有效?
经验分享 | 使用EXIT0同步触发SPI的DMA发送话题
【开发经验】LAT1500 如何通过DMA配合CRC功能
实战经验 | MC SDK V6.x软件HSO功能ADC采样设计说明
我心中的ST中文论坛
经验分享 | 为什么重启ADC的DMA传输要先停掉ADC?
微信公众号
手机版