解决STM32G431输出PWM扫频消失问题

这篇具有很好参考价值的文章主要介绍了解决STM32G431输出PWM扫频消失问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、PWM变频率消失问题

        最近练习蓝桥杯嵌入式的题目,需要输出一个PWM扫频的信号,遇到了PWM变频率时有几率消失的问题, 下面来研究下原因和解决方案。

         由于Keil怎么改设置都不肯给我看外设寄存器,下面用CubeIDE复现下PWM消失的情况,用ST-Link调试。

        时钟倍频到170MHz,用TIM2_CH2输出PWM,定时器设置如图

stm32g431输出pwm为什么到0.1毫秒就没了,stm32,嵌入式硬件,单片机,蓝桥杯

定时器设置

        PWM的Pulse设成500,默认输出1kHz 50%占空比的PWM。

        测试代码如下,为了方便,我一般把初始化和主循环的代码写到自己建的UserTask文件里,在main.c里include之后,把UserTask_init()和UserTask_loop()两个函数分别放到while(1)的前面和里面即可。

#include <UserTask.h>

uint32_t Freq = 1000, Period = 999, OnTime = 500;
float Duty = 50;
uint8_t Dir = 1;

void UserTask_init(void) {
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
}

void UserTask_loop(void) {
    if (Dir) {
        Freq += 100;
        if (Freq >= 10000) Dir = 0;
    }
    else {
        Freq -= 100;
        if (Freq <= 1000) Dir = 1;
    }
    Period = (uint32_t)(1E6F / (float)Freq - 0.5F);
    OnTime = (uint32_t)((float)(Period + 1) * Duty / 100 + 0.5F);
    __HAL_TIM_SET_AUTORELOAD(&htim2, Period);
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, OnTime);
    HAL_Delay(10);
}

       上面的程序希望实现PWM频率从1kHz上升至10kHz,再从10kHz下降至1kHz,占空比保持不变的循环扫频。通过__HAL_TIM_SET_AUTORELOAD宏来直接设置定时器的自动重装值,改变定时器的周期,从而实现频率的更新;通过__HAL_TIM_SET_COMPARE宏来直接设置定时器的比较值,改变PWM的高电平时间,从而实现占空比的设定。

        编译下载后,运行效果如下

stm32g431输出pwm为什么到0.1毫秒就没了,stm32,嵌入式硬件,单片机,蓝桥杯

PWM扫频消失

        可以看到,PWM在上升到某个频率后消失,之后一直没有输出。

二、原因探究

        查看STM32G4的参考手册,可以看到对于通用定时器的基础单元有这样的描述

stm32g431输出pwm为什么到0.1毫秒就没了,stm32,嵌入式硬件,单片机,蓝桥杯

        我们使用的就是向上计数模式,当定时器的计数器向上计数至自动重装值后,计数器清零,开始下一个周期。那么这里就产生了一个问题,我们在定时器运行时设置自动重装值,如果当前的计数值大于新设置的自动重装值,会不会直接触发定时器清零呢?

        下面在调试模式查看TIM2的寄存器

stm32g431输出pwm为什么到0.1毫秒就没了,stm32,嵌入式硬件,单片机,蓝桥杯

        可见在启动后,自动重装寄存器(ARR)和捕获/比较寄存器2(CCR2)的值都在正常地循环变化,但是定时器的计数值(CNT)却远远大于了ARR值。说明计数器并没有清零,计数器的清零只发生在CNT=ARR的下一周期,如果我们设置的ARR值比CNT还小,那计数器会一直计数到溢出,此处TIM2是32为定时器,计数到2^32-1才会溢出,所以看起来PWM输出直接消失了。

三、解决方案1

        继续查看手册,寻找解决方案

stm32g431输出pwm为什么到0.1毫秒就没了,stm32,嵌入式硬件,单片机,蓝桥杯

        如果使能自动重装预装(ARPE=1),那么写入的新ARR值会存入自动重装预装寄存器,它不会立即生效,而是会在定时器更新的时刻,再从自动重装预装寄存器拷贝至自动重装影子寄存器。也就是说,我们写入的新周期值会在定时器的下一个周期生效,从而避免自动重装值小于计数值的情况发生。

        在定时器的设置界面,将“auto-reload preload”设为Enable,再次进行测试,PWM输出正常

stm32g431输出pwm为什么到0.1毫秒就没了,stm32,嵌入式硬件,单片机,蓝桥杯

正常PWM扫频

        在调试界面查看TIM2的寄存器,可看到此时CNT的值也正常地周期变化,不再不受控地增大

stm32g431输出pwm为什么到0.1毫秒就没了,stm32,嵌入式硬件,单片机,蓝桥杯

四、解决方案2

        当然,使用自动重装预装的方式,PWM周期的更新会延迟一个计时周期,这一般不是大问题,如果一定想让周期立即更新,也可以采用程序判断的方式解决计数值超过重装值的问题。在定时器的设置界面,将“auto-reload preload”改回Disable,修改代码如下

#include <UserTask.h>

uint32_t Freq = 1000, Period = 999, OnTime = 500;
float Duty = 50;
uint8_t Dir = 1;

void UserTask_init(void) {
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
}

void UserTask_loop(void) {
    if (Dir) {
        Freq += 100;
        if (Freq >= 10000) Dir = 0;
    }
    else {
        Freq -= 100;
        if (Freq <= 1000) Dir = 1;
    }
    Period = (uint32_t)(1E6F / (float)Freq - 0.5F);
    OnTime = (uint32_t)((float)(Period + 1) * Duty / 100 + 0.5F);
    __HAL_TIM_SET_AUTORELOAD(&htim2, Period);
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2, OnTime);
    if (__HAL_TIM_GET_COUNTER(&htim2) > Period) {
        __HAL_TIM_SET_COUNTER(&htim2, 0);
    }
    HAL_Delay(10);
}

        上面的程序在设置自动重装值为新的周期值后,用__HAL_TIM_GET_COUNTER(&htim2)来读取当前计数值,如果它大于周期值,那么直接调用__HAL_TIM_SET_COUNTER(&htim2, 0);来清零计数器,也解决了PWM变频率消失的问题。文章来源地址https://www.toymoban.com/news/detail-846543.html

到了这里,关于解决STM32G431输出PWM扫频消失问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯电子类嵌入式(STM32G431)备赛学习记录(一)——LED

    2023年2月10日,距离第十四届蓝桥杯正式比赛还有不到两个月的样子,从今天开始正式备赛。之前博主有看过野火的教程,学的是STM32F103。蓝桥杯嵌入式组现在用的是STM32G431,板子在二手平台上买的,视频参考b站up主01Studio相关教程(后面提到简写为教程)。学习的模块按照教

    2024年01月25日
    浏览(69)
  • 蓝桥杯嵌入式STM32G431RBT6竞赛指南与模板——最后的绝唱

    谨以此文和我去年前的一篇蓝桥杯单片机的教程构成电子类的 青铜双壁. 国信长天单片机竞赛训练之原理图讲解及常用外设原理(遗失的章节-零)_昊月光华的博客-CSDN博客     目录 时钟树 串口重定向:printf输出 动态点灯(点灯大师) 按键(常用状态机) 同一时刻对多个按键按

    2024年02月07日
    浏览(47)
  • 蓝桥杯嵌入式STM32G431RBT6的学习(总大纲)(HAL库学习)板子介绍

    我写蓝桥杯嵌入式大概用到的外设,都是非常常用的。我在这里汇总一下。 蓝桥杯嵌入式基础模块——GPIO的使用(新板)STM32G431(HAL库开发)_薛定谔的猫咪死了的博客-CSDN博客 蓝桥杯嵌入式基础模块——串口的使用(新板)STM32G431(HAL库开发)_薛定谔的猫咪死了的博客-C

    2024年02月02日
    浏览(46)
  • 蓝桥杯STM32 G431 hal库开发速成——按键+PWM综合案例——按键控制PWM驱动舵机

    适用于学习了TIM输出比较(PWM)跟GPIO输入(按键)的新手作为练习的综合项目! PWM(Pulse Width Modulation,脉冲宽度调制)是一种常用的技术,用于通过调节电信号的脉冲宽度(即脉冲的持续时间)来控制模拟系统的电源。在数字电子系统中,由于只能输出固定的高(通常为

    2024年01月21日
    浏览(58)
  • 蓝桥杯嵌入式基础模块——LCD显示器的基本使用(新板)STM32G431(HAL库开发)

            在蓝桥杯嵌入式官方给我们提供好了,LCD显示的底层源码,我们只需要,记住里面的API函数,会用这些函数就行。         在官方给的资料中找到这个文件名字DK117_G4 Data Packet-开发板驱动文件里面就是所有的底层文件有两种类型,一种是基于HAL库的一种是标准库

    2024年02月09日
    浏览(59)
  • [蓝桥杯嵌入式]STM32G431——第十二届第一场省赛停车计费系统真题及程序设计代码详解

    最近,我报名了今年的蓝桥杯嵌入式比赛,为此刷了一下以往的真题。以下是我对十二届蓝桥杯省赛真题的一些思路和心得,还有一些具体代码的实现。 1、相关模块 第十二届比赛主要用到的模块包括:LED、KEY、LCD、TIM、USART 2、重难点分析 这道题主要目的是做一个停车管理

    2024年01月18日
    浏览(95)
  • STM32 G431

    1.家族 STM32:32代表32位MCU,有32根地址线,可以寻找4GB的地址 STC15单片机是8位CPU,地址以16进制表示:0x_ _ ; STM32: 0x_ _ _ _ _ _ _ _ 容量为 2^32 = 4,294,967,296 ≈ 4×10^9 (其中 1GB = 10^9) 2.产品类别 G: 支持DSP和FPU指令的可适用信号应用 像正点原子的F4,F:基础型,通用型 3.特点功能 103

    2024年02月03日
    浏览(49)
  • STM32G0 定时器PWM DMA输出驱动WS2812配置 LL库

    优点:不消耗CPU资源 缺点:占用内存较大 定时器配置 定时器通道:TIM3 CH2 分频:0 重装值:79,芯片主频64Mhz,因此PWM输出频率:64Mhz/79 ≈ 800Khz,满足芯片要求。 auto-reload preload 要关闭 output compare preload 要打开 DMA配置 外设一定要选择TIM3_UP,不要选TIM_CHx 方向是内存到外设,

    2024年02月10日
    浏览(44)
  • 蓝桥杯嵌入式STM32 G431 hal库开发速成——ADC与DAC

    模数转换器(ADC):它将模拟信号转换为单片机能够处理的数字信号。在很多应用中,比如温度传感器、压力传感器等,信号最初都是模拟形式的。ADC 读取这些模拟信号,然后将它们转换为数字形式,以便单片机可以读取和处理。 数模转换器(DAC):它执行相反的操作,将

    2024年02月01日
    浏览(59)
  • 解决stm32中PWM输出失败

    根据视频教学,我们知道一般使用stm32进行PWM输出的配置如下: 通过库函数来配置该功能的步骤: (1)开启 TIM3 时钟以及复用功能时钟,配置 P C7 为复用输出。 (2)设置 TIM3_CH2 重映射到 P C7   上。 (3)初始化 TIM3, 设置 TIM3 的 ARR 和 PSC (4)设置 TIM3_CH2 的 PWM 模式,使能

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包