蓝桥杯嵌入式之PWM

一、频率的计算

htim17.Instance = TIM17;
  htim17.Init.Prescaler = 4000-1;    //预分频系数
  htim17.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim17.Init.Period = 99;               //ARR 自动重装载值
  htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim17.Init.RepetitionCounter = 0;
  htim17.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

首先,要明确两点:

  1.  ARR(TIM_Period) 是计数值;
  2. PSC(TIM_Prescaler) 是预分频值。
  3. 计算公式:Fpwm = 主频 / ((ARR+1)*(PSC+1))(单位:Hz)

1.例如:200Hz =主频 /( Prescaler +1 XPeriod + 1)=80 000 000 /(4000 X100)= 200Hz

 2.周期T=1/200Hz=0.005s=5ms

二、如何更改PWM频率(周期)

#define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) 

用法:__HAL_TIM_SET_AUTORELOAD(&htim17,500-1);

 这个函数可以改变自动重装载值,就可以改变PWM频率。

三、如何改变PWM的占空比

#define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) 

用法: if(pa7_duty >=100)   pa7_duty=10;
      __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);

这里就是把占空比设置为10%

四、STM32CubeMx配置级使用

 

1.初始化开启定时器PWM通道

2.在以下头文件中找到设置PWM频率的函数

通过F12可以跳转到这个宏的定义及函数的用法

四、设置占空比 (和设置周期频率也一样)

脉冲宽度调制模式可以生成一个信号,该信号频率由自动重装载寄存器(TIMx_ARR)寄存器值决定,其占空比则由捕获/比较寄存器(TIMx_CRx)寄存器决定。

-------------------------------------------------------------------------------------------

PWM频率:Freq = 定时器时钟主频  /  [(ARR+1) * (PSC+1)]

PWM占空比: Duty = Pluse / (ARR+1)

Pulse 是 捕获/比较寄存器(CCR)的值

-------------------------------------------------------------------------------------------

   

 

### 蓝桥杯嵌入式开发中PWM的实现 在嵌入式开发领域,脉宽调制(Pulse Width Modulation, PWM)是一种常见的技术,用于控制电机速度、调节LED亮度以及驱动其他电子设备。以下是基于STM32微控制器及其HAL库实现PWM的方法。 #### STM32 HAL库中的TIM_PWM_Init函数 通过STM32CubeMX工具可以快速配置定时器以生成PWM信号。具体来说,在初始化阶段会设置定时器的工作模式为PWM模式,并指定占空比和频率参数。以下是一个典型的PWM初始化代码片段: ```c // 定义 TIM_HandleTypeDef 结构体变量 TIM_HandleTypeDef htimX; void MX_TIMx_PWM_Init(void) { __HAL_RCC_TIMx_CLK_ENABLE(); // 启用定时器时钟 // 初始化结构体定义 TIM_OC_InitTypeDef sConfigOC; htimX.Instance = TIMx; // 设置使用的定时器实例 htimX.Init.Prescaler = 999; // 预分频器值 (假设系统时钟为10MHz,则计数频率为10KHz) htimX.Init.CounterMode = TIM_COUNTERMODE_UP; // 计数方向向上 htimX.Init.Period = 999; // 自动重装载寄存器周期值 (即PWM周期为1ms) htimX.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分割因子设为1 HAL_TIM_Base_Init(&htimX); // 初始化基本定时功能 sConfigOC.OCMode = TIM_OCMODE_PWM1; // 设定为PWM Mode 1 sConfigOC.Pulse = 500; // 初始占空比设定为50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 输出极性高有效 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; // 关闭快速使能 HAL_TIM_PWM_ConfigChannel(&htimX, &sConfigOC, TIM_CHANNEL_1); // 配置通道1为PWM输出 } ``` 上述代码展示了如何利用STM32 HAL库来创建一个工作于特定频率和初始占空比下的PWM波形[^3]。 #### 动态调整PWM占空比 除了静态配置外,还可以动态改变PWM信号的占空比从而达到实时调控的目的。下面给出了一段修改占空比的例子: ```c uint32_t duty_cycle = 750; // 新的目标占空比对应数值 __HAL_TIM_SET_COMPARE(&htimX,TIM_CHANNEL_1,duty_cycle); ``` 此部分代码允许程序运行期间灵活更改输出电平的时间比例[^4]。 #### 综合应用案例——直流电机转速控制 为了更好地理解实际应用场景,这里提供了一个简单的例子说明怎样运用前面介绍的技术去操控DC马达的速度变化情况: ```c #include "stm32fxxx_hal.h" #define MOTOR_SPEED_MAX 1000U volatile uint16_t motor_speed = 0U; int main() { /* 用户自定义初始化 */ SystemClock_Config(); MX_GPIO_Init(); MX_TIMx_PWM_Init(); while (true){ if(motor_speed<MOTOR_SPEED_MAX && ButtonPressed()){ motor_speed +=10; } __HAL_TIM_SET_COMPARE(&htimX,TIM_CHANNEL_1,motor_speed); delay_ms(100); } } /* 其他辅助子例程省略...*/ ``` 以上示例演示了当检测到按键事件发生后逐步提升电动机运转速率的过程[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值