【笔记】stm32tim定时器AutoReload和pwm输出Pulse的关系

26 篇文章 6 订阅

参考文章:
我的文章
我的文章2
PWM输出(呼吸灯)

老是理不清定时器的自动重装载和PWM通道Pulse的关系

先说PSC和AutoReload的关系

PSC是预分频
ST32F103频率可以上到72M

举个例子:
72000000/72=1M
1/1M=1/1000000=0.000001秒

预分配会影响自动重装载的计数速度
比如上面计算的,他可以0.000001s计一个数
当计到AutoReload的值时,就会产生一个中断

/*中断回调函数*/

pwm的脉冲数Pulse:
在AutoReload的计数周期内,设置脉冲的多少。

比如说舵机 要20ms的周期,那么根据公式:
定时器时间=1/(时钟频率/预分频/计数周期)
20ms=1/(72000000/72/20000)
Pulse是在这个“时钟频率/预分频”速度里面计的数的脉冲速
在程序里面可以用这个程序修改它的脉冲数:
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 500);

比如说要
20ms里面500个脉冲(高低电平)
也就是每500时钟频率/预分频=50072M/72=500*0.000001=0.005s的高电平
在这里插入图片描述

定时器中断调用函数:


HAL_TIM_Base_Start_IT(&htim2);//中断使能

 HAL_TIM_IRQHandler(&htim2);//之后进入定时器中断处理函数判断产生的是哪一类定时器中断(溢出中断/PWM中断.....) 和定时器通道
 
 void HAL_TIM_PeriodElapsedCallback(&htim2);    //进入相对应中断回调函数 在中断回调函数中添加用户代码

PWM函数:

	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
	__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, 3200);
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
STM32CubeMX中使用定时器来产生PWM波的步骤如下: 1. 打开STM32CubeMX软件,创建一个新的工程。 2. 选择你的STM32微控制器型号,并配置时钟和其他必要的设置。 3. 在"Pinout & Configuration"选项卡中,选择一个可用的定时器引脚作为PWM输出引脚。 4. 在"Configuration"选项卡中,找到"Timers"部分,并选择一个可用的定时器。 5. 在"Mode"下拉菜单中选择"PWM Generation"模式。 6. 配置PWM的频率和占空比。 7. 根据需要,可以配置其他参数,如死区时间、互补输出等。 8. 点击"OK"按钮生成代码。 9. 在生成的代码中,找到定时器初始化的函数,并调用它来初始化定时器。 10. 在生成的代码中,找到定时器PWM配置函数,并调用它来配置PWM的频率和占空比。 11. 在生成的代码中,找到定时器启动函数,并调用它来启动定时器。 以下是一个示例代码,演示如何在STM32CubeMX中配置定时器产生PWM波: ```c #include "main.h" #include "tim.h" void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim2); } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *tim_pwmHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if (tim_pwmHandle->Instance == TIM2) { __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM2 GPIO Configuration PA0 ------> TIM2_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } } void HAL_TIM_MspPostInit(TIM_HandleTypeDef *timHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if (timHandle->Instance == TIM2) { __HAL_RCC_GPIOA_CLK_ENABLE(); /**TIM2 GPIO Configuration PA0 ------> TIM2_CH1 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } } ``` 请注意,以上代码是使用STM32CubeMX生成的示例代码,你需要根据你的具体需求进行修改和适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创客阿蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值