登录/注册

stm32f103产生多路pwm

更多

在STM32F103上生成多路PWM信号,通常通过其内置的定时器(TIM)模块实现。以下是实现步骤和示例:


关键步骤

  1. 选择定时器
    STM32F103的通用定时器(如TIM2/TIM3/TIM4)每个可输出4路PWM,高级定时器(TIM1/TIM8)可输出7路。根据需求选择定时器。

  2. 配置GPIO为PWM输出模式
    将对应引脚设为复用推挽输出模式(AFIO),并使能GPIO时钟。

  3. 配置定时器参数

    • 预分频器(PSC):决定定时器时钟频率(TIM_CLK = SystemClock / (PSC + 1))。
    • 自动重载值(ARR):决定PWM周期(周期 = (ARR + 1) / TIM_CLK)。
    • PWM模式:选择PWM模式1或模式2(控制占空比极性)。
  4. 配置通道输出
    启用定时器通道,设置占空比(通过通道比较寄存器CCRx)。


代码示例(标准库)

TIM3通道1-4输出4路PWM为例:

#include "stm32f10x.h"

void PWM_Init(void) {
    // 1. 开启时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIO时钟

    // 2. 配置GPIO为复用推挽输出
    GPIO_InitTypeDef GPIO_InitStruct;
    // PA6(TIM3_CH1), PA7(TIM3_CH2), PB0(TIM3_CH3), PB1(TIM3_CH4)
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 3. 配置定时器
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    TIM_InitStruct.TIM_Period = 999;            // ARR值,决定PWM周期
    TIM_InitStruct.TIM_Prescaler = 71;          // 预分频,72MHz/(71+1)=1MHz
    TIM_InitStruct.TIM_ClockDivision = 0;
    TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
    TIM_TimeBaseInit(TIM3, &TIM_InitStruct);

    // 4. 配置PWM模式
    TIM_OCInitTypeDef TIM_OCInitStruct;
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;       // PWM模式1
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; // 启用输出
    TIM_OCInitStruct.TIM_Pulse = 500;                    // 初始占空比50%(ARR=999)
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效

    // 启用所有通道
    TIM_OC1Init(TIM3, &TIM_OCInitStruct); // CH1
    TIM_OC2Init(TIM3, &TIM_OCInitStruct); // CH2
    TIM_OC3Init(TIM3, &TIM_OCInitStruct); // CH3
    TIM_OC4Init(TIM3, &TIM_OCInitStruct); // CH4

    // 启动定时器
    TIM_Cmd(TIM3, ENABLE);
}

int main(void) {
    PWM_Init();
    while(1) {
        // 动态修改占空比(示例:通道1占空比设为30%)
        TIM_SetCompare1(TIM3, 300); // 300/1000 = 30%
    }
}

关键参数说明


注意事项

  1. GPIO映射
    不同定时器的通道对应不同引脚(如TIM3_CH1在PA6,TIM3_CH3在PB0),需参考芯片数据手册。

  2. 同一定时器的频率一致
    同一定时器的所有通道共享ARR和PSC,因此频率相同,但占空比可独立设置。

  3. 高级定时器
    若使用TIM1/TIM8,需额外配置刹车和死区时间(BDTR寄存器)。

  4. 使用CubeMX
    可通过STM32CubeMX图形化配置PWM,自动生成初始化代码。


通过以上步骤,您可以在STM32F103上灵活生成多路PWM信号,适用于电机控制、LED调光等场景。

STM32CubeIDE下配置STM32F103输出带死区的互补PWM

STM32F103的TIM1和TIM8是高级定时器,可以产生嵌入死区时间的互补PWM波,使用

2023-11-01 09:41:07

ARM系列STM32F103芯片的解密方法

破解STM32F103芯片的方法

2023-09-19 09:03:40

ch32v103stm32f103的区别

ch32v103与stm32f103的区别  Ch32v103与STM32f103

2023-08-22 15:49:00

基于STM32F103的SVPWM算法实现

基于STM32F103的SVPWM算法实现

资料下载 jinyi7016 2022-03-22 12:12:17

STM32F103用户使用手册

STM32F103用户使用手册

资料下载 倚東聽海 2021-12-06 09:47:21

基于STM32f103的输入捕获测频率和占空比

基于STM32f103的输入捕获测频率和占空比

资料下载 shyshyshy 2021-08-02 10:10:24

基于STM32f103的FFT频率测试程序下载

基于STM32f103的FFT频率测试程序下载

资料下载 shyshyshy 2021-08-02 10:07:20

基于STM32f103使用的DAC正弦波

基于STM32f103使用的DAC正弦波

资料下载 shyshyshy 2021-08-02 10:05:00

STM32F103 GPIO内部电路图讲解

STM32F103 GPIO内部电路图讲解

2023-02-01 16:32:14

基于STM32F103单片机的矩阵按键设计

本实验使用STM32F103单片机,主题代码通用的。

2022-12-09 17:18:46

STM32F103 PWM介绍

一、STM32F103 PWM介绍STM32F1除了基本定时器TIM6和TIM7,其他定时器都可以

2022-01-19 07:13:06

STM32F103 PWM输出配置有哪些步骤呢

PWM是什么?STM32F103 PWM输出比较模式有哪几种?STM32F103

2021-11-15 07:52:12

STM32F103输出PWM波形

STM32的PWM和DAC练习STM32F103输出一路PWM波形用

2021-08-17 09:01:27

STM32F103输出PWM波形

STM32F103输出一路PWM波形1、STM32F1 PWM介绍

2021-08-17 06:29:16

stm32f030和stm32f103功能差异

stm32f030和stm32f103功能差异主要表现在哪?

2021-07-22 09:35:47

7天热门专题 换一换
相关标签