TIM的PWM模式

定时器的工作流程:
        定时器对时钟传来的脉冲次数计数,并且在次数到达范围值时触发中断。如向下计数模式时为0,向上计数为达到自动重装载计时器的值时触发中断。


 四个输出比较单元


 更改占空比的函数


STM32里面的定时器有多个定时器。
如TIM1、TIM2、TIM3


定时器的输入捕获模式来测量输入脉冲的宽度


定时器的输出比较模式   

                其中PWM模式是最有用的一种模式(PWM是一种用数字信号来模拟模拟信号的技术)

                在该模式下,要用设置比较寄存器的值。计数器的值和比较寄存器的值会一直进行比较

                PWM模式分为PWM模式1和PWM模式2。这两种我都理解为一种输出的规则。即通过两个值的大小关系来输出对应电平。

                输出的GPIO通道在手册中有对应,根据定时器的不同而有区别。

                有效电平和无效电平在stm32中分别对应高电平和低电平。这种对应关系也可以人为修改。 

               占空比也是高电平输出时间所占周期比值。占空比越大,宏观表现(输出)的有效电压越大对于一个简单的灯泡来说,电压越大,电流越大,能量越大,亮度越大,体现的是能量定律。

               在模式1的情况下,计数器的值小于比较寄存器的值则输出有效电平,高于则输出无效。此时比较寄存器和自动重装载的比值表示着占空比。在其他模式下比较寄存器和自动重装载的比值也是能够反应占空比的情况,只不过是间接还是直接罢了。


                这里说一下不用过于考虑的几个概念。

                自动装载寄存器已经设定了一个值,为了叙述方便叫做c。

                计数模式:计数器接受到脉冲是从0到c(向上计数模式),还是从c到0(向下计数模式),还是从0到c然后到0(中央对齐模式)。

        关于以上的概念可以分为两个方面,一方面是关于定时器(计数器)是怎样处理接收到的信息的,另一方面是怎样转化已经得到的信息的。这样可以比较清楚的理解TIM在单片机应用中发挥的作用和与其他部分之间的联系。


输出模式:复用推挽输出。(外设用复用推挽输出模式)


定时器时钟线,分频,自动重装载的理解

定时器的时钟线:

      一段有各种音高的声音;

分频:

        滤波器,将需要的频率留下,不要的去掉。

重装载:

        调整系统的工作周期和频率(?)。


### 配置和使用 STM32 HAL 库中 TIM3 的 PWM 模式 #### 初始化定时器 为了使能并配置 TIM3 作为 PWM 发生器,首先需要初始化该外设。这一步骤通常在 `MX_TIM3_Init` 函数内完成,在此函数里可以设置预分频系数、计数周期以及其他参数来满足特定应用需求。 ```c // 定义全局变量用于存储定时器句柄 TIM_HandleTypeDef htim3; void MX_TIM3_Init(void) { // 设置定时器时钟源频率 (单位 Hz),具体数值取决于系统时钟配置 __HAL_RCC_TIM3_CLK_ENABLE(); // 填充默认参数结构体 TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; // 计算自动重装载值以获得期望的PWM频率 uint32_t prescalerValue = (uint32_t)((SystemCoreClock / 2) / 1000000) - 1; htim3.Instance = TIM3; htim3.Init.Prescaler = prescalerValue; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 999; // 设定最大占空比为1% htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); } } ``` #### 启动 PWM 输出通道 一旦完成了定时器的基础设定之后,则需指定哪些通道将被用来输出 PWM 波形,并调用相应 API 来启动这些通道上的 PWM 功能。 ```c if (HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, Compare_Value); ``` 这里假设选择了 TIM3_CH1 进行操作;如果还需要其他通道的话只需重复上述过程即可[^1]。 #### 调整占空比 通过改变比较寄存器中的值可动态调整所生成波形的占空比: ```c static void AdjustDutyCycle(uint8_t duty_cycle_percent) { /* 将百分制转换成对应于ARR范围内的数值 */ uint32_t compare_value = ((duty_cycle_percent * htim3.Init.Period) / 100); __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, compare_value); } ``` 以上代码片段展示了如何基于输入的比例因子计算新的比较值,并将其应用于选定的 PWM 通道上从而达到修改占空比的效果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值