在嵌入式系统开发领域,STM32微控制器因其高性能、低功耗和丰富的外设资源而备受青睐,脉冲宽度调制(PWM)功能是STM32定时器外设中最强大且最常用的功能之一,广泛应用于电机控制、LED调光、电源管理及信号发生等场景,深入理解并精准配置STM32的PWM,不仅需要掌握寄存器的操作逻辑,更需要对定时器的底层架构有透彻的认知。
STM32的PWM输出本质上依赖于通用定时器(如TIM2-TIM5)或高级定时器(如TIM1, TIM8),配置PWM的核心在于对时基单元和输出比较通道的设定,时基单元决定了PWM的频率,而输出比较通道则决定了占空比。
我们需要计算并配置预分频器(PSC)和自动重装载寄存器(ARR),PWM的频率公式为:$Freq = frac{CK_PSC}{(PSC+1) times (ARR+1)}$。$CK_PSC$是定时器的时钟频率,若系统时钟为72MHz,我们需要产生1kHz的PWM波,可将PSC设为71,ARR设为999,定时器的计数频率为1MHz,计数周期为1000个计数单位,即1ms,在这个架构中,ARR的值实际上决定了PWM的分辨率。
占空比的配置是通过捕获/比较寄存器(CCR)来实现的,在PWM模式1下(通常配置),当计数值(CNT)小于CCR时,输出有效电平(如高电平);当计数值大于CCR时,输出无效电平,占空比的计算公式为:$Duty = frac{CCR}{ARR+1}$,通过动态修改CCR的值,即可实现对输出电压或功率的线性调节。
为了更直观地理解不同定时器在PWM应用中的差异,下表对比了通用定时器与高级定时器的关键特性:
| 特性维度 | 通用定时器 (如 TIM2-TIM5) | 高级定时器 (如 TIM1, TIM8) |
|---|---|---|
| 计数器位宽 | 16位 | 16位 |
| 互补输出 | 不支持 | 支持(适合H桥电机驱动) |
| 死区插入 | 不支持 | 支持(防止上下管直通) |
| 刹车功能 | 不支持 | 支持(硬件级故障保护) |
| 输出引脚数量 | 4个独立通道 | 4个独立通道 + 互补通道 |
在实际的工程项目中,单纯的本地控制往往无法满足复杂的物联网需求。 酷番云 在为客户提供工业物联网解决方案时,曾遇到过这样一个典型案例:某大型温室大棚的环境控制系统需要根据光照强度和温度实时调节遮阳网电机和通风风扇的转速。
在该项目中,我们采用了STM32F4系列微控制器作为边缘网关的核心控制器,传统的做法是STM32根据本地传感器数据运行PID算法来调节PWM占空比,但这种方式响应滞后,且难以应对突发的极端天气,结合 酷番云 的高性能计算实例与边缘计算服务,我们设计了一套“云-边-端”协同控制架构。
具体实现上,STM32通过MQTT协议连接至酷番云的物联网平台,云端部署了基于机器学习的环境预测模型,能够根据历史数据和气象预报提前计算出未来一小时内风扇和电机的目标转速,随后,云端将目标占空比参数下发至边缘端的STM32,STM32利用其高级定时器的PWM模式,结合硬件死区插入功能,安全、平滑地驱动无刷直流电机,这种架构不仅利用了酷番云强大的数据处理能力,还充分发挥了STM32实时控制的可靠性,实现了毫秒级的控制响应和系统整体的能效优化。
在配置代码层面,使用HAL库开发时,除了基本的
HAL_TIM_PWM_Init
和
HAL_TIM_PWM_ConfigChannel
外,还需要特别注意GPIO的复用功能配置,必须将GPIO引脚模式设置为复用推挽输出(GPIO_MODE_AF_PP),并根据引脚定义表选择正确的复用功能号(AF),若使用高级定时器,必须调用
HAL_TIMEx_MainOutputConfig
使能主输出(MOE位),否则PWM信号将无法物理输出。
对于高精度的应用,STM32还支持中心对齐计数模式,与边沿对齐模式不同,中心对齐模式下计数器从0向上计数到ARR,再向下计数到0,这种对称的波形在电机控制中可以减少由于开关延迟引起的谐波噪声,提升系统的电磁兼容性(EMC)性能。
相关问答FAQs:
Q1: 在STM32 PWM配置中,为什么有时候修改了ARR寄存器但频率没有立即变化? 这通常是因为预装载寄存器(Shadow Register)的影响,如果arpE(自动重装载预装载使能)位被置1,写入ARR的值会被缓冲,直到下一个更新事件(UEV)发生时才生效,要立即生效,可以在软件中触发一个更新事件(如设置UG位)。
Q2: 使用PWM驱动电机时,为什么要设置死区时间? 在H桥驱动电路中,同一桥臂的上下两个开关管不能同时导通,否则会造成电源短路,由于开关管存在关断延迟,死区时间的设置确保在一个管子完全关断后,另一个管子才开启,从而保护电路安全。
avr怎么调节pwm占空比
定时器工作在模式15时PWM只能从OC1B(PD4)管脚输出,而不是OC1A(PD5),OC1A在该模式下只能输出方波。
所以你只要在port_init() 函数中加上DDRD|=(1<
看看这个,单片机用的是ADUC848,AD转换输出正弦波,和PWM原理类似。
实验八D/A转换实验一、实验目的1.了解芯片内部D/A转换模块设置方法。
2.了解D/A转换原理。
3.了解Keil软件中逻辑分析仪的使用方法。
4.了解用单片机产生正弦信号的基本方法。
二、实验原理ADuC848中包含一个12位电压输出DAC模块,DAC模块中寄存器的设置如下:DAC控制寄存器:DACCONNC表示未定义;DACPIN为DAC输出引脚选择;1=设置DAC输出引脚为Pin13(AINCOM);0=设置DAC输出引脚为Pin14(DAC);DAC8为DAC转换位数模式选择位;1=设置DAC为8位转换;0=设置DAC为12位转换;DACRN为DAC输出范围选择位;1=设置DAC的输出范围为0V-AVDD;0=设置DAC的输出范围为0V-2.5V(VREF);DACCLR为DAC清除位;1=设置DAC为正常操作模式;0=复位DAC数据寄存器DACL/Hto0;DACEN为DAC使能位1=使能DAC转换;0=不使能DAC转换;DAC数据寄存器:DACH/LDACH为12位转换的高位数据寄存器四、程序流程图和源程序1、主程序流程图2、源程序清单DACCONEQU0xfD;定义模数转换控制器DACHEQU0xfc;定义模数转换数据寄存器高8位DACLEQU0xfb;定义模数转换数据寄存器低8位ORG0000HLJMPMAINORG0200HMAIN:MOVDACCON,#0fH;DACoperationCLRA;MOVDACH,A;模数转换高八位清零PRG3:MOVR0,#09H;正弦波MOVR4,#40HLP11:MOVA,R0MOVCA,@A+PCMOVDACL,A;2ACALLDELAY;2INCR0;1DJNZR4,LP11;2SJMPPRG3;2DATA0:DB80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H,0DAH,0E2H,0EAHDB0F0H,0F6H,0FAH,0FDH,0FFH,0FFH,0FDH,0FAH,0F6H,0F0HDB0EAH,0E2H,0DAH,0D1H,0C7H,0BCH,0B0H,0A5H,98H,8CHDB80H,7FH,73H,67H,5AH,4FH,43H,38H,2EH,25H,1DH,15HDB0FH,09H,05H,02H,00H,00H,02H,05H,09H,0FH,15HDB1DH,25H,2EH,38H,43H,4FH,5AH,67H,73H,7FHRETDELAY:MOVR6,#10HMOVR7,#0A1HDELAYLOOP:;延时程序DJNZR6,DELAYLOOPDJNZR7,DELAYLOOPRETEND四、实验板插针配置:无需插针配置,注意DAC是从CONDACOUT1端子输出,可用示波器观察DAC输出波形。
若产生失真情况,请检查开发板DA输出端LM358运算放大器的放大倍数,适当更改所查函数表的范围。
五、思考题1、改变程序,使能添加输出锯齿波;2、改变程序,使输出添加三角波;3、改变程序,使输出添加方波;4、改变程序,并制作一个简单的函数发生器
这是两路PWM输出,但是他们是互补的。
STC单片机PWM编程!
STM32中TIM1-CH1和TIM1-CH1N的区别














发表评论