news 2026/4/15 16:54:16

基于STM32F103实现两路PWM输出

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32F103实现两路PWM输出

一、硬件连接方案

1. 引脚分配(以TIM3为例)
通道默认引脚重映射引脚适用场景
CH1PA6PB4电机控制/LED调光
CH2PA7PB5伺服电机/呼吸灯
2. 电路设计要点
  • 电机驱动:需外接H桥电路(如TB6612)保护GPIO

  • LED限流:串联220Ω电阻防止烧毁

  • 滤波电路:在电源端添加0.1μF陶瓷电容


二、软件实现代码

1. 定时器初始化(TIM3双通道PWM)
#include"stm32f10x.h"voidTIM3_PWM_Init(u16 arr,u16 psc){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;// 使能时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);// 引脚重映射配置GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);// PA6→PB4, PA7→PB5// GPIO初始化GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;// 复用推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);// 定时器基础配置TIM_TimeBaseStructure.TIM_Period=arr;// 自动重装载值TIM_TimeBaseStructure.TIM_Prescaler=psc;// 预分频系数TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);// PWM模式配置TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;// PWM模式1TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;// 通道1配置TIM_OCInitStructure.TIM_Pulse=0;// 初始占空比0%TIM_OC1Init(TIM3,&TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);// 通道2配置TIM_OCInitStructure.TIM_Pulse=0;TIM_OC2Init(TIM3,&TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);// 使能定时器TIM_Cmd(TIM3,ENABLE);}
2. 占空比动态调整
// 设置通道1占空比(0-100%)voidSet_PWM1_DutyCycle(u8 percent){u16 compare_val=(arr+1)*percent/100;TIM_SetCompare1(TIM3,compare_val);}// 设置通道2占空比(0-100%)voidSet_PWM2_DutyCycle(u8 percent){u16 compare_val=(arr+1)*percent/100;TIM_SetCompare2(TIM3,compare_val);}
3. 主函数示例
intmain(void){// 初始化PWM(周期20ms,频率50Hz)TIM3_PWM_Init(19999,71);// 72MHz/(72)=1MHz → 1MHz/(19999+1)=50Hzwhile(1){// 通道1从0%到100%渐变for(u8 i=0;i<=100;i++){Set_PWM1_DutyCycle(i);Delay_ms(10);}// 通道2从100%到0%渐变for(u8 i=100;i>=0;i--){Set_PWM2_DutyCycle(i);Delay_ms(10);}}}

三、关键参数计算

1. PWM频率公式
频率=72MHz/(预分频系数+1)/(自动重装载值+1)
  • 示例:psc=71, arr=19999 → 72/(72)/(20000)=50Hz
2. 占空比计算
占空比(%)=(CCR值/(ARR+1))×100

四、调试技巧

1. 示波器观察要点
  • 上升沿对齐:确保两路PWM上升沿同步

  • 占空比精度:检查实际值与设定值偏差(应<1%)

  • 死区时间:电机控制需添加死区(建议0.1-0.5μs)

2. 常见问题解决
现象原因解决方案
无输出GPIO未正确映射检查AFIO时钟和重映射配置
占空比失真中断干扰关闭相关中断或提高优先级
频率漂移系统时钟异常验证PLL配置和外部晶振

五、扩展功能实现

1. 输入捕获同步
// 配置TIM3_CH1为输入捕获(用于编码器)TIM_ICInitTypeDef TIM_ICInitStructure;TIM_ICInitStructure.TIM_Channel=TIM_Channel_1;TIM_ICInitStructure.TIM_ICPolarity=TIM_ICPolarity_Rising;TIM_ICInitStructure.TIM_ICFilter=10;TIM_ICInit(TIM3,&TIM_ICInitStructure);
2. 硬件PWM刹车
// 紧急停止时强制输出低电平voidPWM_Brake(){GPIO_ResetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_5);}

参考代码 STM32F103控制的两路PWM输出www.youwenfan.com/contentcnr/103639.html

六、完整工程配置

  1. CubeMX配置流程

    • 选择STM32F103C8T6

    • 启用TIM3定时器

    • 配置通道1和2为PWM模式

    • 设置时钟树(HSE=8MHz, PLL=9倍频)

  2. Keil工程结构

    Project/ ├── Core/ │ ├── Inc/(头文件)│ └── Src/(源文件)├── Drivers/ │ ├── CMSIS/ │ └── STM32F1xx_HAL_Driver/ └── Middlewares/ └── USB_Device/
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 15:36:05

RoPE笔记

笔记链接

作者头像 李华
网站建设 2026/4/15 15:36:11

论文回顾 — 用于软件开发的交互式代理

原文&#xff1a;towardsdatascience.com/paper-review-communicative-agents-for-software-development-103d4d816fae?sourcecollection_archive---------9-----------------------#2024-06-08 对“ChatDev”AI 代理论文的详细回顾 https://medium.com/Ed_Forson?sourcepos…

作者头像 李华
网站建设 2026/4/5 18:37:24

1.1 《Life 3.0》没白看 AI 正在从工具变成员工

1.1 《Life 3.0》没白看:AI 正在从「工具」变成「员工」 本节学习目标 借助《Life 3.0》的视角,建立「AI 从工具到智能体」的认知框架。 理解为什么 Agent 代表的是「会干活儿的 AI」,而不仅是「会答题的 AI」。 为后续「什么是 Agent、怎么造 Agent」打好观念基础。 一、为…

作者头像 李华
网站建设 2026/4/11 13:03:10

朱敬一挥毫开运马年 解锁国潮文化共振

在马年新春到来之际&#xff0c;得物 App 于上海虹口文化地标今潮 8 弄举办“马上开运”线下潮流活动。活动现场&#xff0c;国潮书法场景开创者朱敬一受邀亮相&#xff0c;以一场极具张力的现场书法创作&#xff0c;将传统书法与青年潮流文化紧密连接&#xff0c;成为本次活动…

作者头像 李华