news 2026/7/14 22:59:59

基于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/7/11 11:57:57

【MySQL】SELECT 优化

文章目录WHERE 条件优化范围优化单部索引范围访问多部索引范围访问索引合并优化三个概念索引下推 (ICP) 优化辨析 IPC 和索引合并和 BTREE 索引外连接优化ORDER BY 优化使用索引进行 order byGROUP BY 优化为什么聚合函数中使用索引列更高效函数调用优化总结避免索引使用不当加…

作者头像 李华
网站建设 2026/7/11 11:57:13

A-Lin「歌迹」巡演成都站三晚顺利收官 多首金曲献唱出道二十周年

2026年2月6日至8日&#xff0c;A-Lin黄丽玲「歌迹Journey」巡演第三站——成都&#xff0c;一连三晚盛大开唱。作为纪念出道二十周年的主题巡演&#xff0c;成都站临近A-Lin出道二十周年纪念日&#xff0c;承载着特殊的纪念意义。三场演出座无虚席&#xff0c;累计近五万歌迷汇…

作者头像 李华
网站建设 2026/7/10 16:05:19

mpip 如何获取Mpi调用的总次数 awk

cat tm | awk $4 ~ /^[0-9]/ {print $1,$4} | awk {sum[$1]$2} END {for (k in sum) print k, sum[k]} Irecv 6720 Barrier 4 Wait 6720 Send 6720 Bcast 4 Reduce 4

作者头像 李华