打印
[其他]

遇到TIM1和TIM3配置问题,请求帮助

[复制链接]
1010|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaonaiweng|  楼主 | 2024-2-22 15:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gaonaiweng 于 2024-2-22 15:49 编辑

大家好,

我在处理TIM1和TIM3的定时器配置问题时候遇到了问题,希望得到一些指导。这里TIM1被配置为单脉冲模式,同时TIM3负责生成PWM信号。在程序中进行了相应的GPIO和定时器的初始化,但在下载验证时遇到了一些问题。

我配置了TIM1_CH1输出一个脉宽为60%的PWM,TIM3_CH1输出一个脉宽为30%的PWM,而TIM1_CH2作为输入捕获用于接收外部触发信号。然而我并没有得到想要的结果。

有没有人遇到过类似的问题,或者对TIM1和TIM3的配置有一些经验可以分享的?谢谢!

期待大佬们的回复。

使用特权

评论回复
沙发
tomps| | 2024-2-26 09:07 | 只看该作者

可做参考一下这个代码

本帖最后由 tomps 于 2024-2-26 09:09 编辑
//TIM1
int main(void)
{
    /*
            单脉冲模式
            PA10  TIM1_CH1  单脉冲输出通道
            PA8   TIM1_CH2  输入捕获,用来捕获上升沿
    */

    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRInitStruct;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

    //PA10  TIM1_CH1  单脉冲输出通道      
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_6);
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //PA8   TIM1_CH2  输入捕获,用来捕获上升沿
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_6);     
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 9999;                                    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 1000000 - 1);      //设置用来作为TIMx时钟频率除数的预分频值  不分频
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 1 - 1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //TIM向上计数模式
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

    //输出比较结构体
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                    //配置为PWM模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //CCER: CCxE 输出使能
    TIM_OCInitStructure.TIM_Pulse = 0;                                //设置跳变时间
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            //CCxP 输出通道电平极性配置
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
    TIM_OC1Init(TIM1,&TIM_OCInitStructure);        
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  
//   
    TIM_ICStructInit(&TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0;
    TIM_ICInit(TIM1,&TIM_ICInitStructure);     

    TIM_ARRPreloadConfig(TIM1, ENABLE);                                 //CR1:ARPE = 1,使能TIMx在ARR上的预装载寄存器

    TIM_SelectOnePulseMode(TIM1, TIM_OPMode_Single);
    TIM_SelectInputTrigger(TIM1, TIM_TS_TI2FP2);
    TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Trigger);

    TIM_SetCounter(TIM1,0);
    TIM_CtrlPWMOutputs(TIM1, ENABLE);   
    TIM_Cmd(TIM1, ENABLE);  

    while(1){
            
    }
}

//TIM2
int main(void)
{
    /*
            单脉冲模式
            PB3   TIM2_CH1  单脉冲输出通道
            PB4   TIM2_CH2  输入捕获,用来捕获上升沿
    */

    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

    //PB3  TIM2_CH1  单脉冲输出通道      
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_7);
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //PB4   TIM2_CH2  输入捕获,用来捕获上升沿
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_7);     
    GPIO_InitStructure.GPIO_Pin  =  GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.TIM_Period = 9999;                                    //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / 1000000 - 1);      //设置用来作为TIMx时钟频率除数的预分频值  不分频
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

    //输出比较结构体
    TIM_OCStructInit(&TIM_OCInitStructure);
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                    //配置为PWM模式2
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //CCER: CCxE 输出使能
    TIM_OCInitStructure.TIM_Pulse = 5000;                                //设置跳变时间
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            //CCxP 输出通道电平极性配置
    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
    TIM_OC1Init(TIM2,&TIM_OCInitStructure);        
    TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);  

    TIM_ICStructInit(&TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0;
    TIM_ICInit(TIM2,&TIM_ICInitStructure);

    TIM_ARRPreloadConfig(TIM2, ENABLE);                                 //CR1:ARPE = 1,使能TIMx在ARR上的预装载寄存器

    TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);

    TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
    TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Trigger);

    TIM_SetCounter(TIM2,0);
    TIM_CtrlPWMOutputs(TIM2, ENABLE);   
    TIM_Cmd(TIM2, ENABLE);  
    while(1){
            
    }
}

tim.zip

1.39 KB

使用特权

评论回复
板凳
jcky001| | 2024-2-27 10:48 | 只看该作者
检查时钟配置

使用特权

评论回复
地板
两只袜子| | 2024-2-27 12:00 | 只看该作者
检查定时器初始化,包括设置预分频器、自动重载值、捕获/比较寄存器等。

使用特权

评论回复
5
cr315| | 2024-2-27 14:00 | 只看该作者
检查GPIO配置是否正确

使用特权

评论回复
6
duo点| | 2024-2-27 16:02 | 只看该作者
PWM配置有误?

使用特权

评论回复
7
七毛钱| | 2024-2-27 17:00 | 只看该作者
检查输入捕获配置

使用特权

评论回复
8
内政奇才| | 2024-2-27 18:26 | 只看该作者
如果你在使用中断来处理输入捕获或PWM事件,确保你已经正确配置了中断优先级和使能了相应的中断。此外,你还需要编写适当的回调函数来处理这些事件。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

697

帖子

3

粉丝