OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2063|回复: 5

STM32103VET6,使用HAL库配置,500KHZ到1000KHZ频率的PWM无法产生。

[复制链接]

49

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2017-3-24
在线时间
64 小时
发表于 2020-3-19 16:43:21 | 显示全部楼层 |阅读模式
1金钱

* TIM1 init function */
void MX_TIM1_Init(void)
{
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};

  htim1.Instance = TIM1;
  //htim1.Init.Prescaler = 72-1;//72-0.001ms,720-0.01ms,7200-0.1ms //0.01ms-999ms

  htim1.Init.Prescaler =36-1;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 3;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 2;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_SET;
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  __HAL_TIM_DISABLE_OCxPRELOAD(&htim1, TIM_CHANNEL_1);
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  sBreakDeadTimeConfig.DeadTime = 0;
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_TIM_MspPostInit(&htim1);

}

void Set_TIM1_PWM(uint16_t Pwm,uint16_t Count,uint16_t fpsc)
{               
// PWM的频率 = 72MHZ / ARR*CCR
        uint16_t arr,ccr;
        arr=SystemClock / Pwm ; //脉冲周期         x100HZ
        if(arr<=2)                       
                ccr=0;
        else
           ccr=arr-2;
        TIM1->ARR=arr-1;
        TIM1->CCR1=ccr;       
// 计数个数
        TIM2->ARR=Count;        
}

HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);//开启定时器1 PWM

此部分代码配置输出PWM,0.1KHZ-500KHZ,在示波器上有输出并精准,配置大于500KHZ时,PWM开始频率不精准,并且700KHZ左右开始到1MHZ,PWM没有输出。
有谁配置成功且输出精准,求指教


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-3-19 18:43:50 | 显示全部楼层
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-3-20 00:54:00 | 显示全部楼层
ARR和CCR1,都只能是整数,你怎么能保证连续变化?
回复

使用道具 举报

49

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2017-3-24
在线时间
64 小时
 楼主| 发表于 2020-3-20 09:13:20 | 显示全部楼层
正点原子 发表于 2020-3-20 00:54
ARR和CCR1,都只能是整数,你怎么能保证连续变化?

试过强制类型转换后,可以达到在一定误差内的效果。但是同样想要配置大于600KH频率的PWM时,就不行了,PWM就没输出了
回复

使用道具 举报

49

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2017-3-24
在线时间
64 小时
 楼主| 发表于 2020-3-20 10:13:50 | 显示全部楼层
1208 发表于 2020-3-19 18:43
有没试过在F4上弄过

使用STM32CUBE 这个工具,基本上都可以直接配置,配置的很轻松准确
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2020-3-20 16:36:33 | 显示全部楼层
Black 发表于 2020-3-20 10:13
使用STM32CUBE 这个工具,基本上都可以直接配置,配置的很轻松准确

你看看用f4可以正常用不
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 07:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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