OpenEdv-开源电子网

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

有大佬能说下pwm与机器周期之间的关系么

[复制链接]

8

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2020-7-14
在线时间
13 小时
发表于 2020-7-16 19:56:09 | 显示全部楼层 |阅读模式
5金钱
大佬能问下pwm频率与机器周期之间的关系么,如果PWM是5khz,那么pwm的机器周期该怎么去算呢

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

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4923
金钱
4923
注册时间
2015-1-10
在线时间
617 小时
发表于 2020-7-17 09:55:50 | 显示全部楼层
这是两回事,只有MCU主频是如何分频计数产生PWM的说法
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-7-17 11:13:30 | 显示全部楼层
1、机器周期是我们学51单片机引入的概念,我们把完成一个基本操作所需要的时间称为机器周期。8051单片机的一个机器周期=6个状态周期=12个时钟周期(周期等于频率的倒数)。
例如外接24M晶振的单片机,他的一个机器周期=12/24M 秒=0.5us
例如外接12M晶振的单片机,他的一个机器周期=12/12M 秒=1us
例如外接8M晶振的单片机,他的一个机器周期=12/8M 秒=1.5us
STM32对于机器周期的描述比较少,其实机器周期这个定义了解下就好了,没必要太过于深究。
2、PWM频率,用库函数的历程说一下把:
  1. TIM3_PWM_Init(899,0);         //不分频。PWM频率=72000000/900=80Khz
复制代码

这句话就是定义频率的大小,你只需要修改899和0的值,就可以得到自己想要的PWM频率,具体怎么得来的,你可以看下面的函数定义。频率计算公式如下/:频率 = 72M / ((arr+1)*(psc+1))(单位:Hz)
置于72M频率怎么得来的,就得看STM32的时钟图了,这里就不说了~
  1. //TIM3 PWM部分初始化
  2. //PWM输出初始化
  3. //arr:自动重装值
  4. //psc:时钟预分频数
  5. void TIM3_PWM_Init(u16 arr,u16 psc)
  6. {  
  7.         GPIO_InitTypeDef GPIO_InitStructure;
  8.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  9.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  10.        

  11.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
  13.        
  14.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5   

  15.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.5
  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
  17.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  18.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

  20.    //初始化TIM3
  21.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  22.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  23.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  24.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  25.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  26.        
  27.         //初始化TIM3 Channel2 PWM模式         
  28.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  29.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  30.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  31.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

  32.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

  33.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3
  34.        

  35. }
复制代码

回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4504
金钱
4504
注册时间
2018-5-14
在线时间
962 小时
发表于 2020-7-17 15:50:15 | 显示全部楼层
PWM频率是PWM频率,机器周期是机器周期,不能混为一谈,PWM是由定时器TIM产生的,TIM使用的是APB或者AHB桥(看芯片时钟树),而APB桥的时钟为72M话最终输入给定时器的时钟也是72M(我记得有个桥是36M)。定时器说白了就是个计数器,计数到设定值重新计数一次。而机器周期就是core的频率,core频率是来自于系统时钟的,STM的系统时钟一般都是72M(软件可以修改来源于PLL还是HSE或者HSI)。所以说,没关联。算法就是 定时器的时钟频率/分频系数*计数次数(CLK/PSC*ARR)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 18:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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