TIM_SetCompare1(TIM14,625); 但是这个办法对TIM4行不通。TIM4使用TIM_OCInitStructure.TIM_Pulse = dutyCycle;

本文详细介绍了如何在STM32中配置PA1引脚输出PWM信号,通过TIM5的CH2通道实现。讲解了TIM_SetComparex函数的使用,以及TIM_OCInitStructure结构体中的TIM_Pulse参数设定占空比。提供了TIM14和TIM4的PWM初始化代码示例,强调了不同定时器通道配置PWM的差异,并展示了在步进电机控制中的应用。
摘要由CSDN通过智能技术生成

我们以PA1为例,从表中可以看出PA1位于定时器5的CH2。对于PA1我们怎么让他输出PWM呢?首先就是先把配置给配置好,让他能够输出PWM,在此基础上,才能随心所欲的使用他输出PWM。
好了,废话不多说,开始我们的重点,这个函数TIM_SetCompare1,这个函数有四个,分别是TIM_SetCompare1,TIM_SetCompare2,TIM_SetCompare3,TIM_SetCompare4。位于CH1那一行的GPIO口使用TIM_SetCompare1这个函数,位于CH2那一行的GPIO口使用TIM_SetCompare2这个函数。以此类推。我们再看这个函数的参数,第一个参数传入相应定时器,(定时器6,7除外)。使用的GPIO口位于哪个定时器那一列就传入哪个定时器。第二个参数是输出PWM的高电平的时间。这个值如果大于周期的值,将会与周期保持一致。用第二个参数除以周期就得占空比。比如我想要使用PA1输出PWM,则应该这样写TIM_SetCompare2(TIM5,Compare)。Compare是输出高电平的时间。你想要在哪里使用PWM就在哪里调用这个函数。GPIO口,占空比,周期都可以随意设置,是不是很方便啊。

TIM_OCInitStructure.TIM_Pulse是设置占空比

void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3)
{
  /* Check the parameters */
  assert_param(IS_TIM_LIST3_PERIPH(TIMx));
  /* Set the Capture Compare3 Register value */
  TIMx->CCR3 = Compare3;
}

uint16_t TIM_Pulse;         /*!< Specifies the pulse value to be loaded into the Capture Compare Register. 
                                   This parameter can be a number between 0x0000 and 0xFFFF */

其中在TIM_OC1Init()函数中有一句

  /* Set the Capture Compare Register value */
  TIMx->CCR1 = TIM_OCInitStruct->TIM_Pulse; 

这体现了两者在本质上可以相互赋值

还是不明白有何处不同

网络上搜到的案例:

最近做了一个使用STM32F429的TIM4和TIM14产生的PWM波来驱动两个步进电机的项目。看到有不少新入行的同学们在找TIM产生PWM方波的例程代码,就在这里放一份,供大家参考。经过亲测,唯一需要注意的是TIM4和TIM14产生占空比的方式稍有不同:TIM14使用
TIM_SetCompare1(TIM14,625); 但是这个办法对TIM4行不通。TIM4使用
TIM_OCInitStructure.TIM_Pulse = dutyCycle;废话不多说了,Talk is easy,show me the code. 直接上代码了。这段代码是我自己亲测可用的。
//TIM14 PWM初始化
//PWM输出初始化
//arr:自动重装值  psc:时钟预分频数。
void TIM14_PWM_Init(u32 arr,u32 psc)
{                                             
       GPIO_InitTypeDef GPIO_InitStructure;
       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
       TIM_OCInitTypeDef  TIM_OCInitStructure;
      
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能   
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //是能 PORTF时钟

       GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GF9复用为TIM14
      
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;             //GPIOF9
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          //复用功能
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //速度100MHz
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        //推挽复用输出
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;          //上拉
       GPIO_Init(GPIOF,&GPIO_InitStructure);                 //初始化PF9

       TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
       TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
       TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
       TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
      
       TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
      
       //初始化TIM14 Channel1 PWM模式
       TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM调制模式1
       TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出是能
       TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性低
       TIM_OC1Init(TIM14, &TIM_OCInitStructure);  //初始化外设 TIM1 4OC1
       TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能预装载寄存器
       TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
       TIM_Cmd(TIM14, ENABLE);  //关闭使能TIM14    
}   

void TIM4_PWM_Init(u32 arr,u32 psc, u32 dutyCycle)
{                                             
       GPIO_InitTypeDef GPIO_InitStructure;
       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
       TIM_OCInitTypeDef  TIM_OCInitStructure;
      
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //TIM4时钟使能   
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); //是能 PORTD时钟

       GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4); //GD14复用为TIM4
      
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;             //GPIO D14
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          //复用功能
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    //速度100MHz
       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        //推挽复用输出
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;          //上拉
       GPIO_Init(GPIOD,&GPIO_InitStructure);                 //初始化PD14

       TIM_TimeBaseStructure.TIM_Prescaler=psc;  //定时器分频
       TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
       TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
       TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
      
       TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);//初始化定时器14
      
       //初始化TIM4 Channel3 PWM模式
       TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM调制模式1
       TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出是能
             TIM_OCInitStructure.TIM_Pulse = dutyCycle; //配置占空比
       TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性低
       TIM_OC3Init(TIM4, &TIM_OCInitStructure);  //初始化外设 TIM4 OC3  通道3
       TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);  //使能预装载寄存器
       TIM_ARRPreloadConfig(TIM4,ENABLE);//ARPE使能
       TIM_Cmd(TIM4, ENABLE);  //使能TIM14    
}   

//PF9 -->TIM14 Channel_1
void StepMotor_Init(void)
{
    TIM14_PWM_Init(1250-1,84-1);   //定时器时钟为84M,分频系数为84,所以计数频率为84M/84=1Mhz,重装载值1250,所以PWM频率为 1M/1250=800hz. 
    TIM_SetCompare1(TIM14,625); //占空比50%.   PWM每一个周期为1s/800hz=1.25ms=1250us.设置低电平时间为625us.
    //升降电机拨码为1600步每圈。一圈6cm。  现在每秒800步,所以速度为3cm/s

    GPIO_InitTypeDef GPIO_InitStructure;
    /*时钟使能*/
  //RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
    /* 引脚设置 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;        
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8;
    GPIO_Init(GPIOF, &GPIO_InitStructure);
    
    PFout(7)=1;  //打开使能
    PFout(8)=1;  //确定方向   0为向上   1为向下
    
    //PD14  PD15 TIM4

    /// 必须按照厂商给定的配置来设置,控制器对应的横向电机的噪音才会很小。
  /// 厂商给定配置控制器拨码为 800步每圈。PWM给定频率为每秒2000个脉冲
    /// 定时器时钟为84M,分频系数为84,所以计数频率为84M/84=1Mhz,重装载值500,所以PWM频率为 1M/5000=2000hz. 
    /// 占空比50%.   PWM每一个周期为1s/2000hz=0.5ms=500us.设置低电平时间为250us.
    //  TIM4 对应水平的滑杆:控制器的拨码,800步前进一圈,一圈为1.2cm。每秒钟中有2000步,所以速度为3cm/s 
  TIM4_PWM_Init(500-1,84-1,250);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;        
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;    

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
    
    //PDout(14)=1;
    PDout(15)=1;   //1 为朝左   0为朝右

}

以下程序为 实现PWM的主要程序。 //通用定时器1中断初始化,这里时钟若选择72M void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_Cmd(TIM3, ENABLE); } //TIM3的PWM输出初始化 void TIM3_PWM_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_Cmd(TIM3, ENABLE); } 请说明: (1) 若设置PWM频率为10K,则TIM3_PWM_Init( ) 如何设置形参? (2)若利用PA8,PA9,PA10 输出频率为10K,占空比分别为20%,35%,50%的脉冲信号(利用定时器1),请参考 函数TIM3_PWM_Init(u16 arr,u16 psc)和 调用函数TIM_SetCompare1( ),TIM_SetCompare2( ),TIM_SetCompare3( )来完成编程。
06-12
修改 #include "stm32f10x.h" void TIM4_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; /* 使能定时器4时钟 / RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); / 定时器基本配置 / TIM_TimeBaseStructure.TIM_Period = 20000; // 每个PWM周期为20ms TIM_TimeBaseStructure.TIM_Prescaler = 7200 - 1; // 定时器预分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); / PWM模式配置 / TIM_OCStructInit(&TIM_OCInitStructure); 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; / PWM输出通道1配置 / TIM_OC1Init(TIM4, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); / PWM输出通道3配置 / TIM_OC3Init(TIM4, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); / 使能定时器4 / TIM_Cmd(TIM4, ENABLE); } void Servo_Control(uint16_t angle1, uint16_t angle2) { uint16_t ccr1 = 1000 + (angle1 * 1000 / 180); // 将角度转换为对应的PWM占空比 uint16_t ccr3 = 1000 + (angle2 * 1000 / 270); / 设置PWM输出占空比 / TIM_SetCompare1(TIM4, ccr1); TIM_SetCompare3(TIM4, ccr3); } int main(void) { / 初始化定时器4和GPIOB的相应引脚 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); TIM4_Configuration(); while(1) { Servo_Control(0, 0); // 控制舵机1和舵机2的角度 delay_ms(1000); // 延迟1秒 Servo_Control(90, 135); delay_ms(1000); Servo_Control(180, 270); delay_ms(1000); Servo_Control(90, 135); delay_ms(1000); } }
05-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值