打印
[STM32F1]

STM32F103 定时器1 PWM输出的时候中间有一个方波不对

[复制链接]
503|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
肥羊|  楼主 | 2024-7-9 10:47 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
中间有一个方波比起的小
//默认 33HZ
//配置成PWM输出
void TIM1_Mode_Config(void)
{
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//初始化TIM2的时间基数单位
   TIM_OCInitTypeDef  TIM_OCInitStructure;//初始化TIM2的外设
   GPIO_InitTypeDef GPIO_InitStructure;

  
  /*
   关掉JTAD调式 PA15作为普通IO口
  */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

  //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  //由于PA15是复用的所以要设置一下
  //GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  , ENABLE);
  
  //配置PA15 PWM输出的模式
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


  //打开TIM2的时钟
  //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  //TIM2的时间基数单位设置(如计数终止值:999,从0开始 ;计数方式:向上计数)         
  #if INSIDE_RCC
   TIM_TimeBaseStructure.TIM_Prescaler= (32 - 1); //时钟预分频数,时钟频率=72MHZ/(时钟预分频+1) 之后是4M   
   TIM_TimeBaseStructure.TIM_Period=60606-1; //自动重装载寄存器的值/  33 HZ
  #else
   TIM_TimeBaseStructure.TIM_Prescaler= (36 - 1); //时钟预分频数,时钟频率=72MHZ/(时钟预分频+1) 之后是4M   
   TIM_TimeBaseStructure.TIM_Period=60606-1; //自动重装载寄存器的值/        33 HZ
  #endif
  
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  
  //TIM2的外设的设置
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;        //TIM脉冲宽度调制模式1   
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//  正常的输出
  TIM_OCInitStructure.TIM_OutputNState        = TIM_OutputNState_Disable; //互补的那一路不输出
  TIM_OCInitStructure.TIM_Pulse = 60606/2;//设置了待装入捕获比较寄存器的脉冲值         
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //TIM输出比较极性高
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_Low; //TIM输出比较极性高

  //和死区有关只有TIM8 TIM1有关
  TIM_OCInitStructure.TIM_OCIdleState= TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

  TIM_OC4Init(TIM1, &TIM_OCInitStructure);
         
  TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
  TIM_ARRPreloadConfig(TIM1, ENABLE);        //使能TIM2重载寄存器ARR  
  TIM_CtrlPWMOutputs(TIM1, ENABLE);  //对于高级定时器来说,要有这句TIM_CtrlPWMOutputs(TIM1, ENABLE);使能PWM输出。

  TIM_ClearFlag(TIM1, TIM_FLAG_Update); //清除溢出中断标志

  
  TIM_Cmd(TIM1, ENABLE);//使能TIM2   
  

  
}

//其中 60606 为 33HZ   15037=155HZ   
void SetComp_Speed(u16 speed)
{
   u16 Frep;
   if((speed>=33)&&(speed<=150))
   {
       //TIM_PSCReloadMode_Update 不立即产生一个新的事件等待新的周期
       //TIM_PSCReloadMode_Immediate 立即产生一个事件并且跟新计数数据
       TIM_PrescalerConfig(TIM1,(32-1),TIM_PSCReloadMode_Update);// 修改分频系数
           Frep=2000000/speed;
           TIM_SetAutoreload(TIM1, Frep);
           TIM_SetCompare4(TIM1,Frep/2);

   }else if((speed>0)&&(speed<33))
   {
       TIM_PrescalerConfig(TIM1,(6400-1),TIM_PSCReloadMode_Update);// 修改分频系数
           Frep=10000/speed;
           TIM_SetAutoreload(TIM1, Frep);
           TIM_SetCompare4(TIM1,Frep/2);
   }else if(speed>150)
   {
       TIM_PrescalerConfig(TIM1,(32-1),TIM_PSCReloadMode_Update);// 修改分频系数
           TIM_SetAutoreload(TIM1, 13333);
           TIM_SetCompare4(TIM1,13333/2);
   }else
   {
       TIM_PrescalerConfig(TIM1,(32-1),TIM_PSCReloadMode_Update);// 修改分频系数
           TIM_SetAutoreload(TIM1, 13333);
           TIM_SetCompare4(TIM1,23333); // 占空比要大于重载值才能没有毛刺
   }
   
}

各位有人遇到过吗

使用特权

评论回复
沙发
肥羊|  楼主 | 2024-7-9 10:49 | 只看该作者
图片

7cc98713e718c98389fd249b1fc45a9.jpg (346.06 KB )

7cc98713e718c98389fd249b1fc45a9.jpg

使用特权

评论回复
板凳
肥羊|  楼主 | 2024-7-9 10:51 | 只看该作者
小的那个就是了,我没有更改频率他也会出现

7cc98713e718c98389fd249b1fc45a9.jpg (348.57 KB )

7cc98713e718c98389fd249b1fc45a9.jpg

使用特权

评论回复
地板
肥羊|  楼主 | 2024-7-9 10:56 | 只看该作者
是示波器的问题还是代码的问题啊

使用特权

评论回复
5
肥羊|  楼主 | 2024-7-9 11:13 | 只看该作者
我调了一下示波器它有不出现怪了,过一会它有出显

使用特权

评论回复
6
LcwSwust| | 2024-7-9 11:39 | 只看该作者
从程序看,最小频率33Hz?
从波形看,频率差不多11Hz?

使用特权

评论回复
7
肥羊|  楼主 | 2024-7-9 11:53 | 只看该作者
LcwSwust 发表于 2024-7-9 11:39
从程序看,最小频率33Hz?
从波形看,频率差不多11Hz?

我自己设置为11HZ的

使用特权

评论回复
8
肥羊|  楼主 | 2024-7-9 11:53 | 只看该作者
LcwSwust 发表于 2024-7-9 11:39
从程序看,最小频率33Hz?
从波形看,频率差不多11Hz?

void SetComp_Speed(u16 speed)函数可以设置为11

使用特权

评论回复
9
LcwSwust| | 2024-7-9 11:59 | 只看该作者
肥羊 发表于 2024-7-9 11:53
void SetComp_Speed(u16 speed)函数可以设置为11

哦,对,那就检查下看有没有别的地方修改了定时器。

使用特权

评论回复
10
肥羊|  楼主 | 2024-7-9 13:33 | 只看该作者
LcwSwust 发表于 2024-7-9 11:59
哦,对,那就检查下看有没有别的地方修改了定时器。

没有地方修改了

使用特权

评论回复
11
LcwSwust| | 2024-7-9 13:59 | 只看该作者
肥羊 发表于 2024-7-9 13:33
没有地方修改了

这么有自信?那么就得怀疑一下硬件是否有问题了,比如电路中有别的元件把这个脚拉低了。

使用特权

评论回复
12
mbutterfly| | 2024-7-9 16:07 | 只看该作者
是不是和自动重新装载什么值有关,把那个去掉试试

使用特权

评论回复
13
niuchaxf| | 2024-7-9 17:14 | 只看该作者
DO-160G EMC标准全文

使用特权

评论回复
14
xionghaoyun| | 2024-7-10 08:25 | 只看该作者
中断打断?

使用特权

评论回复
15
回复就哭哭| | 2024-7-31 23:49 | 只看该作者
你的代码中设置了两个不同的时钟预分频系数和计数周期,用于生成PWM信号。TIM1的配置与生成33Hz的PWM信号有关。你设置了不同的预分频系数来适应不同的频率要求。

使用特权

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

本版积分规则

35

主题

271

帖子

1

粉丝