打印
[其他ST产品]

STM32产生固定频率和占空比可变的PWM

[复制链接]
505|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本篇博客将重点讲述如何设置PWM波的频率和初始占空比,以及如何实现占空比可调的PWM。本文中笔者使用的STM32型号仍然是F103C8T6,如果你的STM32型号与之不同也没关系,具体的操作方法是一样的,只是使用的具体引脚需要改变。

1.设置频率和占空比
首先按照《STM32F103C8T6编写简单的程序并烧录到板卡上》将PA8引脚设置为PWM输出引脚。

在Pinout & Configuration -> Timers -> TIMX 的Parameter Settings一栏中:


Prescaler代表分频数,首先参照《STM32F103C8T6编写简单的程序并烧录到板卡上》将时钟频率设置为8MHz,然后将Prescaler的值设置为128,代表PWM所用时钟频率为8MHz的128分频,即8M÷128=62500Hz。

Counter Mode代表计数模式,设置为up表示向上计数。Counter Period代表一个PWM脉冲所占的时钟周期,将Counter Period的值设置为12500,代表一个PWM脉冲的频率为62500÷12500=5Hz。


在Parameter Settings一栏中向下翻页找到Pulse,它代表PWM中高电平所占的时钟周期,将Pulse的值设置为6250,代表PWM的占空比为6250÷12500=50%。

参照上述过程修改参数之后,PA8口就配置好了频率为5Hz,占空比为50%的PWM波。



使用特权

评论回复
沙发
wang6623|  楼主 | 2024-1-29 16:26 | 只看该作者
2.实现占空比可调的PWM
首先参照1中过程配置好PWM初始化参数,随后在main.c函数中通过以下代码调节占空比:

HAL_TIM_PWM_Start(&htimX, TIM_CHANNEL_Y);
TIMX -> CCRY = 6250;

使用特权

评论回复
板凳
wang6623|  楼主 | 2024-1-29 16:26 | 只看该作者
上述代码中,HAL_TIM_PWM_Start()函数用于启动PWM波的产生,其传入参数中的X代表选用的时钟源编号,Y代表选用的通道编号,如我们选择的PA8则是Timer1中的Channel1,即将上述代码改为:

使用特权

评论回复
地板
wang6623|  楼主 | 2024-1-29 16:27 | 只看该作者
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
TIM1 -> CCR1 = 6250;

使用特权

评论回复
5
wang6623|  楼主 | 2024-1-29 16:27 | 只看该作者
其中“TIM1 -> CCR1 = 6250;”一句代表将PWM中高电平所占的时钟周期设置为6250,这一句等同于在PWM初始化过程中设置Pulse参数为6250。在main.c函数中,将TIM1 -> CCR1值进行改变,即可实现占空比可调的PWM。

使用特权

评论回复
6
wang6623|  楼主 | 2024-1-29 16:27 | 只看该作者
3.实战演习-按键控制PWM波的占空比
本次实战演习中,会运用按键控制PWM波的占空比,即初始状态下,PA8引脚输出频率为5Hz,占空比为50%的PWM,每当用户按下一次按键,PWM波的占空比会按照0% -> 25% -> 50% -> 75% -> 100% -> 0% -> …的顺序进行一次改变。

首先按照1中过程在PA8引脚处配置5Hz,初始占空比为50%的PWM波形。参照《STM32F103C8T6编写简单的程序并烧录到板卡上》将按键引脚设置为输入状态。

使用特权

评论回复
7
wang6623|  楼主 | 2024-1-29 16:27 | 只看该作者
找到如下代码段:
/* USER CODE BEGIN WHILE */
while(1)
{
        /* USER CODE END WHILE */
}

使用特权

评论回复
8
wang6623|  楼主 | 2024-1-29 16:28 | 只看该作者
将其改为:
/* USER CODE BEGIN WHILE */
int state = 0;
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

while (1)
{
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == 0)
        {
                HAL_Delay(100);// 消抖
                if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == 0)
                {
                        state = (state + 1) % 5;
                        switch(state)
                        {
                        case 0:
                                TIM1 -> CCR1 = 0;
                                break;
                        case 1:
                                TIM1 -> CCR1 = 3125;
                                break;
                        case 2:
                                TIM1 -> CCR1 = 6250;
                                break;
                        case 3:
                                TIM1 -> CCR1 = 9375;
                                break;
                        default:
                                TIM1 -> CCR1 = 12500;
                                break;
                        }
                }
        }
        /* USER CODE END WHILE */
}

使用特权

评论回复
9
wang6623|  楼主 | 2024-1-29 16:28 | 只看该作者
修改完成后,将程序下载到板子上,即可通过点击按键来控制PWM波的占空比了。读者可以通过示波器观察到PWM波占空比的变化。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

390

帖子

0

粉丝