硬汉嵌入式论坛

 找回密码
 立即注册
查看: 976|回复: 1
收起左侧

[TIMER] TIM1 多通道PWM问题

[复制链接]

32

主题

64

回帖

160

积分

初级会员

积分
160
发表于 2021-12-30 11:31:55 | 显示全部楼层 |阅读模式
想用TIM1产生两路PWM,其它程序确定没问题,不开启通道1,通道2就会正常输出,无法双通道同时输出,直接运行只有通道1输出,且程序一直卡在HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_2); ,程序根据固件包里的程序写的,基本一样,大哥们,想知道是哪的问题。

程序如下:

TIM_HandleTypeDef TIM1_Handler;                                                                                                           //定时器句柄
TIM_OC_InitTypeDef sConfig;                                                

//TIM1 PWM初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{
    TIM1_Handler.Instance=TIM1;                                                                                                    //定时器1
       
          HAL_TIM_Base_DeInit(&TIM1_Handler);
       
    TIM1_Handler.Init.Prescaler=psc;                                                                                        //定时器分频
    TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;                                                                //向上计数模式
    TIM1_Handler.Init.Period=arr;                                                                                                   //自动重装载值
    TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    TIM1_Handler.Init.RepetitionCounter = 0;

    HAL_TIM_PWM_Init(&TIM1_Handler);                                                                                               //初始化PWM
       
    sConfig.OCMode=TIM_OCMODE_PWM1;                                                                                                       //模式选择PWM1                                                                                                                 //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%                                                                                                                   
    sConfig.OCPolarity=TIM_OCPOLARITY_HIGH;                                                                                  
          sConfig.OCNPolarity = TIM_OCPOLARITY_HIGH;
          sConfig.OCFastMode = TIM_OCFAST_DISABLE;
    sConfig.OCIdleState = TIM_OCIDLESTATE_RESET;
          sConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;

          sConfig.Pulse=arr/2;
    HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&sConfig,TIM_CHANNEL_1);                     //配置TIM1通道1       
    sConfig.Pulse=arr/2;               
          HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&sConfig,TIM_CHANNEL_2);               //配置TIM1通道2
               
                HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1);                                                                  //开启PWM通道1
    HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_2);                                                                  //开启PWM通道2
}

//定时器底层驱动 时钟使能、引脚配置
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_Initure;
       
          __HAL_RCC_TIM1_CLK_ENABLE();                                                                                 //使能定时器1时钟
    __HAL_RCC_GPIOE_CLK_ENABLE();                                                                                 //开启GPIOE时钟
       
    GPIO_Initure.Pin=GPIO_PIN_9 | GPIO_PIN_11;       //PE9、PE11
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;                     //复用推完输出
    GPIO_Initure.Pull=GPIO_PULLUP;                   //上拉
    GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;    //高速       
          GPIO_Initure.Alternate=GPIO_AF1_TIM1;                   //复用为TIM1
       
    HAL_GPIO_Init(GPIOE,&GPIO_Initure);
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106734
QQ
发表于 2021-12-31 09:08:12 | 显示全部楼层
没看出什么问题来,可以考虑单步调试进去看看。

这里有个现成的,可以对比参考。

STM32H7实现单个定时器中不同通道配置不同频率PWM的方法
https://www.armbbs.cn/forum.php? ... 9008&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 00:50 , Processed in 0.213633 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表