STM32中的PWM的频率和占空比的设置

电子常识

2585人已加入

描述

  在STM32F105和STM32F107互连型系列微控制器之前,意法半导体已经推出STM32基本型系列、增强型系列、USB基本型系列、互补型系列;新系列产品沿用增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列采用LQFP64、LQFP100和LFBGA100三种封装,不同的封装保持引脚排列一致性,结合STM32平台的设计理念,开发人员通过选择产品可重新优化功能、存储器、性能和引脚数量,以最小的硬件变化来满足个性化的应用需求。

  市面流通的型号有:

  基本型:STM32F101R6、STM32F101C8、STM32F101R8、STM32F101V8、STM32F101RB、STM32F101VB

  增强型:STM32F103C8、STM32F103R8、STM32F103V8、STM32F103RB、STM32F103VB、 STM32F103VE、STM32F103ZE

  STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下:

  1STM32STM32代表ARM Cortex-M内核的32位微控制器。

  2FF代表芯片子系列。

  3103103代表增强型系列。

  4RR这一项代表引脚数,其中T代表36脚,C代表48脚,R代表64脚,V代表100脚,Z代表144脚,I代表176脚。

  5BB这一项代表内嵌Flash容量,其中6代表32K字节Flash,8代表64K字节Flash,B代表128K字节Flash,C代表256K字节Flash,D代表384K字节Flash,E代表512K字节Flash,G代表1M字节Flash。

  6TT这一项代表封装,其中H代表BGA封装,T代表LQFP封装,U代表VFQFPN封装。

  766这一项代表工作温度范围,其中6代表-40——85℃,7代表-40——105℃。

  

  TIM3的ARR寄存器和PSC寄存器,

  确定PWM频率

  这里配置的这两个定时器确定了PWM的频率,我的理解是:PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例如要设置PWM的频率参考上次通用定时器中设置溢出时间的算法,例如输出100HZ频率的PWM,首先,确定TIMx的时钟,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的2倍,这时的TIMx时钟为72MHz,用这个TIMx时钟72MHz除以(PSC+1),得到定时器每隔多少秒涨一次,这里给PSC赋7199,计算得定时器每隔0.0001秒涨一次,即此时频率为10KHz,再把这个值乘以(ARR+1)得出PWM频率,假如ARR值为0,即0.0001*(0+1),则输出PWM频率为10KHz,再假如输出频率为100Hz的PWM,则将ARR寄存器设置为99即可。如果想调整PWM占空比精度,则只需降低PSC寄存器的值即可。

  

  TIMx_CCRx寄存器,

  确定PWM的占空比。

  TIMx_CCR1—TIMx_CCR4确定定时器的CH1—CH4四路PWM的占空比。直接给该寄存器赋0—65535值即可确定占空比。占空比计算方法:TIMx_CCRx的值除以ARR寄存器的值即为占空比,因为占空比在0—100%之间,所以一般TIMx_CCRx寄存器值不能超过ARR寄存器的值,否则可能会引起PWM的频率或占空比的准确性。

  //

  void TIM4_GPIOB_Init(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  /* Configure the LED_pin as output push-pull for LD3 & LD4 usage*/

  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB,ENABLE);

  //

  GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4); //GPIO口引脚复用到TIM4的1通道 .PB6

  GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7|GPIO_Pin_6;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  }

  void TIM4_PwmConfig(void)

  {

  TIM_TimeBaseInitTypeDef TIM_BaseInitStructure;

  TIM_OCInitTypeDef TIM_OCInitStruct;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

  TIM_DeInit(TIM4);

  //

  TIM_BaseInitStructure.TIM_Period = 10000; //自动重装载寄存器周期的值(计数值) 单位US ,那这里就是10000uS =10mS中断一次

  TIM_BaseInitStructure.TIM_Prescaler = 3599; // 原来83预分频数,定时器主频位84M,预分频设置为83,分频84倍,84/84=1m, 一个时钟脉冲位1uS

  TIM_BaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割 采样分频

  TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器向上计数

  TIM_TimeBaseInit(TIM4, &TIM_BaseInitStructure); //执行初始化函数

  //

  TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //PWM1 为正常占空比模式,PWM2 为反极性模式

  TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //使能输出

  // TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Disable; //互补输出禁止

  // TIM_OCInitStruct.TIM_Pulse = PWM_Value; //改变占空比

  TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High ; //High 为占空比高极性,此时占空比为20%;Low 则为反极性,占空比为80%

  // TIM_OutputState_Disable

  TIM_OC1Init(TIM4,&TIM_OCInitStruct); //使能timer4的通道1

  TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); //CCR 自动装载默认也是打开的

  TIM_ARRPreloadConfig(TIM4, ENABLE); //ARR 自动装载默认是打开的,可以不设置 启用ARR的影子寄存器(直到产生更新事件才更改设置)

  //

  TIM_Cmd(TIM4, ENABLE); //使能定时器2

  //

  }

  //

  void TIM4_PWM_Init(void)

  {

  TIM4_PwmConfig();

  TIM4_GPIOB_Init();

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分