[其他] 遇到TIM1和TIM3配置问题,请求帮助

[复制链接]
1535|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 编辑
  1. //TIM1
  2. int main(void)
  3. {
  4.     /*
  5.             单脉冲模式
  6.             PA10  TIM1_CH1  单脉冲输出通道
  7.             PA8   TIM1_CH2  输入捕获,用来捕获上升沿
  8.     */

  9.     GPIO_InitTypeDef GPIO_InitStructure;
  10.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  11.     TIM_OCInitTypeDef  TIM_OCInitStructure;
  12.     TIM_ICInitTypeDef  TIM_ICInitStructure;
  13.     TIM_BDTRInitTypeDef TIM_BDTRInitStruct;

  14.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  15.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

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

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

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

  35.     //输出比较结构体
  36.     TIM_OCStructInit(&TIM_OCInitStructure);
  37.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                    //配置为PWM模式2
  38.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //CCER: CCxE 输出使能
  39.     TIM_OCInitStructure.TIM_Pulse = 0;                                //设置跳变时间
  40.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            //CCxP 输出通道电平极性配置
  41.     TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  42.     TIM_OC1Init(TIM1,&TIM_OCInitStructure);        
  43.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  
  44. //   
  45.     TIM_ICStructInit(&TIM_ICInitStructure);
  46.     TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  47.     TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  48.     TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  49.     TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  50.     TIM_ICInitStructure.TIM_ICFilter = 0;
  51.     TIM_ICInit(TIM1,&TIM_ICInitStructure);     

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

  53.     TIM_SelectOnePulseMode(TIM1, TIM_OPMode_Single);
  54.     TIM_SelectInputTrigger(TIM1, TIM_TS_TI2FP2);
  55.     TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Trigger);

  56.     TIM_SetCounter(TIM1,0);
  57.     TIM_CtrlPWMOutputs(TIM1, ENABLE);   
  58.     TIM_Cmd(TIM1, ENABLE);  

  59.     while(1){
  60.             
  61.     }
  62. }

  63. //TIM2
  64. int main(void)
  65. {
  66.     /*
  67.             单脉冲模式
  68.             PB3   TIM2_CH1  单脉冲输出通道
  69.             PB4   TIM2_CH2  输入捕获,用来捕获上升沿
  70.     */

  71.     GPIO_InitTypeDef GPIO_InitStructure;
  72.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  73.     TIM_OCInitTypeDef  TIM_OCInitStructure;
  74.     TIM_ICInitTypeDef  TIM_ICInitStructure;

  75.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
  76.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

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

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

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

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

  105.     TIM_ICStructInit(&TIM_ICInitStructure);
  106.     TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  107.     TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  108.     TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  109.     TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  110.     TIM_ICInitStructure.TIM_ICFilter = 0;
  111.     TIM_ICInit(TIM2,&TIM_ICInitStructure);

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

  113.     TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);

  114.     TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
  115.     TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Trigger);

  116.     TIM_SetCounter(TIM2,0);
  117.     TIM_CtrlPWMOutputs(TIM2, ENABLE);   
  118.     TIM_Cmd(TIM2, ENABLE);  
  119.     while(1){
  120.             
  121.     }
  122. }

tim.zip

1.39 KB, 下载次数: 0

jcky001 发表于 2024-2-27 10:48 | 显示全部楼层
检查时钟配置
两只袜子 发表于 2024-2-27 12:00 | 显示全部楼层
检查定时器初始化,包括设置预分频器、自动重载值、捕获/比较寄存器等。
cr315 发表于 2024-2-27 14:00 | 显示全部楼层
检查GPIO配置是否正确
duo点 发表于 2024-2-27 16:02 | 显示全部楼层
PWM配置有误?
七毛钱 发表于 2024-2-27 17:00 | 显示全部楼层
检查输入捕获配置
内政奇才 发表于 2024-2-27 18:26 | 显示全部楼层
如果你在使用中断来处理输入捕获或PWM事件,确保你已经正确配置了中断优先级和使能了相应的中断。此外,你还需要编写适当的回调函数来处理这些事件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

875

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部