stm32f103c8t6 PWM输出

前言

首先我们来了解一下 PWM 的概念,PWM(Pulse Width Modulation)即为脉冲宽度调制。放到我们这里,简单点说,就是利用单片机产生指定占空比和指定频率的方波。例如,单片机输出了一个高电平 0.5s,低电平 0.5s 的方波。那么,这个方波的占空比为 0.5/(0.5+0.5)=50%,高低电平各占一半,频率为周期(0.5s+0.5s)的倒数,即为 1Hz。如果高电平为 0.2s,低电平为 0.8s 则占空比为 0.2/(0.2+0.8)=20%,其他情况依次类推。
以单片机 STM32F103C8T6 为例讲解 PWM 的产生,通过单片机的内部定时器,可以在 IO 口输出相应的 PWM 信号。该单片机有 8 个定时器,即 TIM1-TIM8。其中,TIM1、TIM8 为高级定时器,每个都可以产生多达 7 路 PWM 信号,从 7 个 IO 口同时输出。TIM2-TIM5 为通用定时器,每个同时产生 4 路 PWM 信号。TIM6、TIM7 为基本定时器无法产生 PWM 信号。
实现功能:
配置 TIM4 的 4 路 PWM 同时输出频率为 1Hz 的信号,其中:

  • 第一路(TIM4_CH1)占空比 10%
  • 第二路(TIM4_CH2)占空比 20%
  • 第三路(TIM4_CH3)占空比 50%
  • 第四路(TIM4_CH4)占空比 80%

第一步:确定 TIM4 的 4 路 PWM 输出对应的 IO 口

查看官方数据手册《STM32F103x8_B 增强型系列中容量产品数据手册》,P20 页,截图如下:

1574260713121.png

TIM4 的 PWM 通道 TIM4_CH1-TIM4_CH4 对应 GPIO 依次为:PB6~PB9。

int main(void)
{
      TIM4_PWM_Init(7999,8999);//方波频率1Hz

      TIM_SetCompare1(TIM4, 800);//占空比10%
      TIM_SetCompare2(TIM4,1600);//占空比20%  
      TIM_SetCompare3(TIM4,4000);//占空比50%
      TIM_SetCompare4(TIM4,6400);//占空比80%
    
      while(1);//主循环     
}

第二步:方波频率计算--void TIM4_PWM_Init(u16 arr,u16 psc)

  • 1.定时器 TIM4 的输入时钟 CLK 为 72MHz,决定了输出 PWM 的频率最高低于 72MHz;
  • 2.CLK 经过预分频计数器,进行了 psc+1 分频,输入时钟降为 72MHz/(psc+1);
  • 3.分频之后,再计数(arr+1)次后才算完成一个周期的 PWM 输出,因此频率又降低了(arr+1)倍;
  • 4.PWM 频率 =72MHz/(psc+1)/(arr+1)
  • 5.根据参数 72MHz/(7999+1)/(8999+1) = 1Hz.

第三步:占空比设置--void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);

  • 1.定时器 TIM4 的计数寄存器从 0 累加到 arr 循环,通过将计数寄存器的值 N 和 Compare1 进行比较;
  • 2.在一个周期内,N 小于 Compare1 时输出高,N 大于 Compare1 输出低;(或者设置为相反)
  • 3.因此占空比:Compare1/(arr+1);
  • 4.依据参数,10% 占空比 Compare1=800,即 10%=800/(7999+1),其他依次类推。
void TIM4_PWM_Init(u16 arr,u16 psc)
{ 
      GPIO_InitTypeDef GPIO_InitStructure;
      TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
      TIM_OCInitTypeDef TIM_OCInitStructure;

      //使能定时器TIM4时钟,注意TIM4时钟为APB1,而非APB2
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
      //使能PWM输出GPIO口时钟
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); 
                                                                          
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//定时器TIM4的PWM输出通道1,TIM4_CH1
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;//定时器TIM4的PWM输出通道1,TIM4_CH2
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//定时器TIM4的PWM输出通道3,TIM4_CH3
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//定时器TIM4的PWM输出通道2,TIM4_CH4
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

      TIM_TimeBaseStructure.TIM_Period = arr;//自动重装值
      TIM_TimeBaseStructure.TIM_Prescaler =psc; //时钟预分频数
      TIM_TimeBaseStructure.TIM_ClockDivision = 0;
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
      TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //初始化TIM4
     
      //初始化TIM4_CH1的PWM模式
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//设置PWM模式1
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
      TIM_OCInitStructure.TIM_Pulse = 0; //
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性为高
      TIM_OC1Init(TIM4, &TIM_OCInitStructure);//初始化TIM4_CH1

      //初始化TIM4_CH2的PWM模式
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = 0;
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
       //TIM4_CH2初始化,注意为OC2,而不是OC1,下面两个通道依次类推。
      TIM_OC2Init(TIM4, &TIM_OCInitStructure);

       //初始化TIM4_CH3的PWM模式
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = 0;
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
      TIM_OC3Init(TIM4, &TIM_OCInitStructure);

      //初始化TIM4_CH4的PWM模式
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = 0;
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
      TIM_OC4Init(TIM4, &TIM_OCInitStructure);

      //使能4个通道的预装载寄存器
      TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC1
      TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC2
      TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC3
      TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);//OC4
      TIM_ARRPreloadConfig(TIM4, ENABLE); //使能重装寄存器

      TIM_Cmd(TIM4, ENABLE);//使能定时器TIM4,准备工作 
}

 

  • 26
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,它具有多种功能,其中包括PWM输出PWM(脉冲宽度调制)是一种用于控制电机、LED等设备的技术,它通过改变脉冲的宽度来控制设备的电流和电压。 在STM32F103C8T6中,可以使用定时器来实现PWM输出。具体步骤如下: 1. 初始化定时器:选择一个定时器(如TIM1、TIM2等),设置定时器的时钟源、预分频器、计数器周期等参数。 2. 配置PWM输出通道:选择一个PWM输出通道(如通道1、通道2等),设置通道的输出模式、极性、占空比等参数。 3. 启动定时器:使能定时器和PWM输出通道,开始输出PWM信号。 需要注意的是,具体的代码实现会因为使用的开发板、编程语言等不同而有所差异,需要根据具体情况进行调整。 ### 回答2: STM32F103C8T6STM32F1系列单片机的一种型号,它是一款具备强大性能和丰富的外设接口的微控制器。PWM(脉冲宽度调制)是实现数字控制模拟输出的一种通信协议,它通过改变输出信号的占空比来控制模拟电路输出电压或电流。在STM32F103C8T6中,通过配置定时器可以实现PWM输出。 首先,需要在寄存器中对定时器进行配置,确定输出的频率和占空比。当前定时器时钟周期(TIMx_PSC)除以自动重装载寄存器(TIMx_ARR)的值,就是PWM输出的频率。占空比的计公式为: Duty_Cycle = Capture_Compare_Register_Value / (Auto_Reload_Value + 1) 其中,占空比由捕获比较寄存器的值和自动重载寄存器的值共同决定。 接下来,需要在GPIO模块中配置相关的GPIO管脚,确定PWM输出引脚。通过将GPIO引脚模式配置为“复用推挽输出”模式,可以将GPIO口连接到定时器的PWM输出通道上。此外,对于复用功能,还需要配置对应的GPIO端口复用映射,在AFIO模块中进行配置。 最后,开始输出PWM信号。在程序中配置定时器,GPIO引脚和复用映射后,可以使用定时器的PWM输出通道来控制GPIO口的输出电平。具体来说,通过改变捕获比较寄存器的值,可以改变输出信号的占空比,从而实现PWM输出。 总结来说,实现STM32F103C8T6PWM输出需要对定时器、GPIO模块和AFIO模块进行配置,并通过定时器的PWM输出通道控制GPIO口输出电平,从而实现占空比可控的PWM信号输出。 ### 回答3: STM32F103C8T6作为一款高性能、低功耗的单片机,其内置了很多强大的功能模块和外部接口,其中包括支持PWM输出的定时器模块。通过使用定时器模块,我们可以非常方便地实现PWM输出功能。 首先,我们需要选择一个定时器模块作为PWM输出的源,通常可以选择TIM1-TIM4四个定时器模块中的任意一个。然后,我们需要对定时器的时钟源进行配置,通常情况下可选择内部时钟(72MHz),也可以选择外部时钟。 接下来,我们需要对定时器的工作模式进行选择,可以选择计数器模式或者定时器模式,这取决于实际应用场景。对于PWM输出来说,通常情况下我们可以选择定时器模式。 接着,我们需要对定时器的频率进行设置,这个频率决定了PWM波形的周期,频率越高,波形周期越短。一般情况下,我们可以选择定时器的预分频系数和自动重载寄存器(ARR)值来实现。 最后,我们需要对定时器的占空比进行设置,这个占空比决定了PWM波形的高电平时间占总周期的比例,占空比越大,高电平时间越长。一般情况下,我们可以通过修改定时器的占空比寄存器(CCR)值来实现。 值得注意的是,对于STM32F103C8T6PWM输出,我们还需要配置GPIO口对应的复用功能,使其可以输出PWM波形。 在以上步骤完成后,我们就可以成功实现STM32F103C8T6PWM输出功能了。通过合理地选择定时器源、工作模式、频率和占空比,我们能够在不同应用场景下实现灵活高效的PWM输出,为实际应用带来更多可能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值