stm32h743 定时器实现PWM功能踩坑记录

先用一张高级定时器框图镇楼

定时器输出PWM,先要搞懂两个概念:定时器工作频率与定时器频率

定时器工作频率   =   外设总线频率/(PSC+1)

假设外设总线频率是1MHZ,PSC是9,那么定时器工作频率是100KHZ,也就是启动后1秒计数10万次;

定时器频率          =  定时器工作频率/(CNT+1)

假设CNT是99,则定时器频率是1KHZ,也就是1秒计数1000次,每1ms(计数每数到100)产生一次溢出中断。

PSC:预分频系数

CNT:自动重装载值

关于为什么捕获初始化里,捕获上升沿用TIM_CHANNEL_1,捕获下降沿用TIM_CHANNEL_2这个问题,这个帖子讲的比较详细:

关于STM32定时器中TI1FP1 与TI1FP2及相关话题 - 程序员大本营 (pianshen.com)

显然,这里的PWM输入模式正是利用2个捕捉通道针对同一信号进行的捕捉,只是分别针对上升沿和下降沿进行捕捉。要注意的是,利用上述PWM输入模式方法对外部输入信号的频率和占空比进行测量,只限于TI1或TI2通道。因为只有TI1FP1和TI2FP2接到了从模式控制器

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Stm32h743是一款高性能的微控制器,支持多种外设和通信接口,其中包括pwm输出。FreeRTOS是一种流行的实时操作系统,可以帮助你更好地管理任务和资源。 要在Stm32h743实现PWM,你需要配置定时器和GPIO口。具体步骤如下: 1. 配置定时器作为PWM生成器,选择适当的预分频系数和计数器自动重载值以产生所需的PWM频率和分辨率。 2. 配置GPIO口为定时器输出通道,选择适当的GPIO口和复用功能实现PWM输出。 3. 在FreeRTOS中编写任务来控制PWM输出,可以使用定时器中断或者定时器DMA方式。 以下是一个简单的示例代码: ```c #include "stm32h7xx_hal.h" #include "FreeRTOS.h" #include "task.h" #define PWM_FREQ 10000 // PWM频率 #define PWM_RES 256 // PWM分辨率 TIM_HandleTypeDef htim; uint16_t pwm_duty = 0; void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) { GPIO_InitTypeDef GPIO_InitStruct; if(htim->Instance==TIM1) { __HAL_RCC_TIM1_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); } } void pwm_init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim.Instance = TIM1; htim.Init.Prescaler = (HAL_RCC_GetHCLKFreq() / PWM_FREQ / PWM_RES) - 1; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = PWM_RES - 1; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim); sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = pwm_duty; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_MspInit(&htim); HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); } void pwm_task(void *pvParameters) { while(1) { for(uint16_t i=0; i<PWM_RES; i++) { pwm_duty = i; __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, pwm_duty); vTaskDelay(pdMS_TO_TICKS(10)); } } } int main(void) { HAL_Init(); pwm_init(); xTaskCreate(pwm_task, "PWM Task", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); vTaskStartScheduler(); while(1); } ``` 以上代码使用TIM1作为PWM生成器,PE9口作为PWM输出口,通过一个任务不断改变占空比实现PWM输出。你可以根据具体需求调整代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值