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

一、PWM变频率消失问题

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

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

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

定时器设置

        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的高电平时间,从而实现占空比的设定。

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

PWM扫频消失

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

二、原因探究

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

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

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

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

三、解决方案1

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

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

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

正常PWM扫频

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

四、解决方案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变频率消失的问题。

### 回答1: STM32雾化片自动扫频原理是通过使用STM32微控制器来控制雾化片的工作方式。雾化片是一种用于产生雾化液体的装置,它可以将液体快速转化为细小的颗粒,从而形成雾气。自动扫频是一种控制方法,可以使雾化片在不同频率上工作,从而产生不同粒度和浓度的雾化。 STM32微控制器通过控制电路和软件实现自动扫频功能。它可以根据不同的要求和设定参数,将控制信号发送到雾化片的驱动电路。这些控制信号可以包括频率和占空比等参数。 在雾化片工作时,STM32微控制器会根据预先设定的扫频范围和步进值来改变驱动信号的频率。这种扫频的方式可以使雾化片在不同的频率上工作,从而产生不同粒度的雾化。通过改变驱动信号的占空比,可以调节雾化片产生的雾化液体的浓度。 在实现自动扫频的过程中,STM32微控制器还可以配备传感器来监测雾化片产生的雾化效果。这些传感器可以测量雾化液体的粒度和浓度,并将信息反馈给控制器。根据传感器的反馈信息,控制器可以调整驱动信号的频率和占空比,以实现雾化效果的优化和稳定。 综上所述,STM32微控制器通过控制电路和软件实现雾化片的自动扫频功能。它可以根据预设的参数改变驱动信号的频率和占空比,从而实现不同粒度和浓度的雾化效果。传感器的反馈信息可以帮助控制器优化和稳定雾化效果。 ### 回答2: STM32 雾化片自动扫频原理是指通过STM32微控制器控制雾化片的工作频率,在一定范围内自动扫描频率,实现雾化片的自动调节和优化。 在工作过程中,STM32微控制器通过PWM(脉宽调制)控制电路来控制雾化片的工作频率。通过改变PWM信号的占空比,即高电平时间与总周期时间的比例,来控制雾化片的工作频率。当PWM信号的占空比增大时,雾化片的工作频率也随之增大;当PWM信号的占空比减小时,雾化片的工作频率也随之减小。 而自动扫频原理是通过程序控制STM32微控制器的PWM信号,使其在一定范围内进行自动调节。具体操作是通过设定一个初始频率和一个结束频率,并设定一个步进值,然后不断地增加或减小PWM信号的占空比,使得雾化片的工作频率在设定的范围内逐渐改变。当雾化片工作频率达到设定的结束频率时,会重新回到初始频率,并继续进行下一轮的自动扫频。 通过这种自动扫频的原理,可以使雾化片在一定范围内自动调节频率,以优化雾化效果和雾化速度。例如,在雾化纳米颗粒的过程中,对不同颗粒大小需要不同的雾化频率,通过自动扫频可以精确地调节雾化片的工作频率,以获得更好的雾化效果。 总结来说,STM32雾化片的自动扫频原理是通过控制PWM信号的占空比,在设定的范围内不断调节雾化片的工作频率,以实现雾化效果的优化。 ### 回答3: STM32是一种嵌入式微控制器,通过其带有的特定功能和算法,可以实现雾化片的自动扫频原理。 雾化片是一种常用于雾化器中的装置,用于将液体转化为细小的液滴。雾化器通常用于医疗、农业和工业领域,如喷雾器和雾化疗法等。 雾化片的自动扫频原理基于STM32微控制器的能力来控制电机的运动。首先,STM32通过脉宽调制(PWM输出信号来控制电机的速度和方向。这可以让电机以可控的方式旋转。 其次,STM32还通过内置的定时器来生成一个固定频率和变化占空比的信号。这个信号被用作PWM信号的参考。通过改变定时器的参数和配置,我们可以实现自动扫频功能。 在自动扫频的过程中,STM32会逐步改变PWM信号的频率和占空比,从而改变电机的转速和转向。这样可以实现雾化片的自动扫频,即雾化片的振动频率会随着时间的推移不断变化。 通过这种自动扫频的方式,雾化片可以获得更好的雾化效果。因为雾化液滴的大小和分布对不同应用具有重要影响,通过自动扫频可以改变液滴的尺寸和分布,以适应不同的需求。 总的来说,STM32通过PWM调整电机的运动,利用内部定时器生成参考信号,实现雾化片的自动扫频原理,以达到更好的雾化效果。这是一种高效、灵活且可靠的解决方案。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值