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

[复制链接]
 楼主| 肥羊 发表于 2024-7-9 10:47 | 显示全部楼层 |阅读模式
中间有一个方波比起的小
  1. //默认 33HZ
  2. //配置成PWM输出
  3. void TIM1_Mode_Config(void)
  4. {
  5.    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//初始化TIM2的时间基数单位
  6.    TIM_OCInitTypeDef  TIM_OCInitStructure;//初始化TIM2的外设
  7.    GPIO_InitTypeDef GPIO_InitStructure;

  8.   
  9.   /*
  10.    关掉JTAD调式 PA15作为普通IO口
  11.   */
  12.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  13.   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

  14.   //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

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

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


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

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

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

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

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

  56.   
  57.   TIM_Cmd(TIM1, ENABLE);//使能TIM2   
  58.   

  59.   
  60. }

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

  13.    }else if((speed>0)&&(speed<33))
  14.    {
  15.        TIM_PrescalerConfig(TIM1,(6400-1),TIM_PSCReloadMode_Update);// 修改分频系数
  16.            Frep=10000/speed;
  17.            TIM_SetAutoreload(TIM1, Frep);
  18.            TIM_SetCompare4(TIM1,Frep/2);
  19.    }else if(speed>150)
  20.    {
  21.        TIM_PrescalerConfig(TIM1,(32-1),TIM_PSCReloadMode_Update);// 修改分频系数
  22.            TIM_SetAutoreload(TIM1, 13333);
  23.            TIM_SetCompare4(TIM1,13333/2);
  24.    }else
  25.    {
  26.        TIM_PrescalerConfig(TIM1,(32-1),TIM_PSCReloadMode_Update);// 修改分频系数
  27.            TIM_SetAutoreload(TIM1, 13333);
  28.            TIM_SetCompare4(TIM1,23333); // 占空比要大于重载值才能没有毛刺
  29.    }
  30.    
  31. }

各位有人遇到过吗
 楼主| 肥羊 发表于 2024-7-9 10:49 | 显示全部楼层
图片
7cc98713e718c98389fd249b1fc45a9.jpg
 楼主| 肥羊 发表于 2024-7-9 10:51 | 显示全部楼层
小的那个就是了,我没有更改频率他也会出现
7cc98713e718c98389fd249b1fc45a9.jpg
 楼主| 肥羊 发表于 2024-7-9 10:56 | 显示全部楼层
是示波器的问题还是代码的问题啊
 楼主| 肥羊 发表于 2024-7-9 11:13 | 显示全部楼层
我调了一下示波器它有不出现怪了,过一会它有出显
LcwSwust 发表于 2024-7-9 11:39 | 显示全部楼层
从程序看,最小频率33Hz?
从波形看,频率差不多11Hz?
 楼主| 肥羊 发表于 2024-7-9 11:53 | 显示全部楼层
LcwSwust 发表于 2024-7-9 11:39
从程序看,最小频率33Hz?
从波形看,频率差不多11Hz?

我自己设置为11HZ的
 楼主| 肥羊 发表于 2024-7-9 11:53 | 显示全部楼层
LcwSwust 发表于 2024-7-9 11:39
从程序看,最小频率33Hz?
从波形看,频率差不多11Hz?

void SetComp_Speed(u16 speed)函数可以设置为11
LcwSwust 发表于 2024-7-9 11:59 | 显示全部楼层
肥羊 发表于 2024-7-9 11:53
void SetComp_Speed(u16 speed)函数可以设置为11

哦,对,那就检查下看有没有别的地方修改了定时器。
 楼主| 肥羊 发表于 2024-7-9 13:33 | 显示全部楼层
LcwSwust 发表于 2024-7-9 11:59
哦,对,那就检查下看有没有别的地方修改了定时器。

没有地方修改了
LcwSwust 发表于 2024-7-9 13:59 | 显示全部楼层
肥羊 发表于 2024-7-9 13:33
没有地方修改了

这么有自信?那么就得怀疑一下硬件是否有问题了,比如电路中有别的元件把这个脚拉低了。
mbutterfly 发表于 2024-7-9 16:07 | 显示全部楼层
是不是和自动重新装载什么值有关,把那个去掉试试
niuchaxf 发表于 2024-7-9 17:14 | 显示全部楼层
DO-160G EMC标准全文
xionghaoyun 发表于 2024-7-10 08:25 | 显示全部楼层
中断打断?
回复就哭哭 发表于 2024-7-31 23:49 | 显示全部楼层
你的代码中设置了两个不同的时钟预分频系数和计数周期,用于生成PWM信号。TIM1的配置与生成33Hz的PWM信号有关。你设置了不同的预分频系数来适应不同的频率要求。
为你转身 发表于 2024-8-31 13:24 | 显示全部楼层
如果你发现 PWM 波形中间有一个不正常的方波,可能是配置或程序中的某些设置有误。
为你转身 发表于 2024-8-31 13:43 | 显示全部楼层
以下是一些常见问题及其解决方案,并附上示例代码来配置 TIM1 进行 PWM 输出。
s1016918060 发表于 2024-10-8 11:45 | 显示全部楼层
我也遇到了这个问题,请问解决了吗
星辰大海不退缩 发表于 2024-10-8 22:14 | 显示全部楼层
应该是pwm设置的问题或者程序问题
Stahan 发表于 2024-10-13 23:55 | 显示全部楼层
检查下程序是不是有地方操作过了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

286

帖子

1

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