[其他ST产品] stm32f407单一定时器输出四路PWM波

[复制链接]
914|8
 楼主| 原来是wjc 发表于 2023-3-29 15:28 | 显示全部楼层 |阅读模式
最近在玩遥控器多路pwm捕获,顺带着写了一下pwm波输出的代码,下面我来说一下407板子输出pwm波的具体配置及函数说明。
输出效果如下。PS:因为我的分析仪只能接一个,就只看一路的输出
928686423e8a8f2265.png

 楼主| 原来是wjc 发表于 2023-3-29 15:29 | 显示全部楼层
1、开启时钟及定时器引脚复用
在输出PWM波时要开启定时器时钟及GPIO时钟,本例以TIM3和TIM4为例输出8路PWM波形
  1.         //开启相关GPIO外设时钟
  2.         RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
  3.         RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOB, ENABLE);
  4.         // 开启TIMx时钟
  5.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
  7.         // 定时器3引脚复用 注:引脚复用函数参数只能有一个引脚不能同一个方法填写多个
  8.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3);
  9.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_TIM3);
  10.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_TIM3);
  11.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM3);
  12.         //复用定时器4引脚
  13.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_TIM4);
  14.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_TIM4);
  15.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_TIM4);
  16.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource9,GPIO_AF_TIM4);
 楼主| 原来是wjc 发表于 2023-3-29 15:29 | 显示全部楼层
PS:F407ZGT6板子需要复用引脚才能输出PWM波,F103C8T6不需要,F407引脚定义图如下
852336423e8e164b43.png
 楼主| 原来是wjc 发表于 2023-3-29 15:33 | 显示全部楼层
2、定义结构体并预初始化参数
若要使能定时器需要开启需要的GPIO口并初始化定时器参数

  1.     //定义结构体用于初始化GPIO
  2.         GPIO_InitTypeDef GPIO_InitStructure;
  3.         //定义时基单元初始化结构体
  4.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  5.         //定义PWM输出参数结构体
  6.     TIM_OCInitTypeDef  TIM_OCInitStructure;
  7.     //PWM结构体预初始化,防止数据未初始化对数据产生影响
  8.         TIM_OCStructInit(&TIM_OCInitStructure);
 楼主| 原来是wjc 发表于 2023-3-29 15:33 | 显示全部楼层
PS:若代码未开启C99设置,请将定义的结构体放置到代码顶部,否则会报错,开启C99位置如下图

422856423e9dc303e5.png
 楼主| 原来是wjc 发表于 2023-3-29 15:34 | 显示全部楼层
4、初始化结构体参数并使能
  1.         //初始化GPIOA                                                                                                                  
  2.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;       
  3.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
  4.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  5.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  6.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  7.         //初始化结构体A
  8.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  9.         //初始化GPIOB
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;       
  11.         //初始化结构体B,相同参数可复用
  12.         GPIO_Init(GPIOB, &GPIO_InitStructure);       
  13.     //当定时器从0计数到16800,即为16800次,为一个定时周期,定时周期到了之后会产生一个更新或中断,可通过更新中断TIM_IT_Update来捕获
  14.     TIM_TimeBaseStructure.TIM_Period = 16800-1;      
  15.         // 通用控制定时器时钟源TIMxCLK = HCLK/2=84MHz
  16.         // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
  17.     TIM_TimeBaseStructure.TIM_Prescaler = 84-1;       
  18.     // 采样时钟分频,分频含义为几个周期采集一次数据,此处不分频
  19.     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  20.     // 计数方式,向上计数
  21.     TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  22.        
  23.         // 初始化定时器TIM3
  24.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  25.         // 初始化定时器TIM4
  26.         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  27.        
  28.         //PWM模式配置
  29.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//配置为PWM模式1
  30.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  31.         TIM_OCInitStructure.TIM_Pulse = 1277-1;//因遥控器输出占空比为5.5-9.7,此处以输出7.6占空比为例
  32.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于1277时为高电平
  33.         //使能定时器3通道,相同参数可复用,若要输出不同占空比或频率的PWM波可以调节参数后再初始化
  34.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);         //使能通道1
  35.         TIM_OC2Init(TIM3, &TIM_OCInitStructure);         //使能通道2
  36.         TIM_OC3Init(TIM3, &TIM_OCInitStructure);         //使能通道3
  37.         TIM_OC4Init(TIM3, &TIM_OCInitStructure);         //使能通道4
  38.         //使能定时器4通道
  39.         TIM_OC1Init(TIM4, &TIM_OCInitStructure);         //使能通道1
  40.         TIM_OC2Init(TIM4, &TIM_OCInitStructure);         //使能通道2
  41.         TIM_OC3Init(TIM4, &TIM_OCInitStructure);         //使能通道3
  42.         TIM_OC4Init(TIM4, &TIM_OCInitStructure);         //使能通道4
  43.          
  44.         //重载的目的是在定时器的预加载寄存器中存入要修改的TIM_SetCompareX值,防止修改值立即对当前周期生效影响电平,使得参数可以在上一个周期执行完之后使能
  45.         //重载定时器3所有通道
  46.         //通道1重载
  47.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
  48.         //通道2重载
  49.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  50.         //通道3重载
  51.         TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
  52.         //通道4重载
  53.         TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
  54.         //重载定时器4所有通道
  55.         //通道1重载
  56.         TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
  57.         //通道2重载
  58.         TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
  59.         //通道3重载
  60.         TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
  61.         //通道4重载
  62.         TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
 楼主| 原来是wjc 发表于 2023-3-29 15:39 | 显示全部楼层
5、定时器使能
  1.         // 使能定时器3
  2.         TIM_Cmd(TIM3, ENABLE);       
  3.         // 使能定时器4
  4.         TIM_Cmd(TIM4, ENABLE);
 楼主| 原来是wjc 发表于 2023-3-29 15:39 | 显示全部楼层
6、主函数调用配置方法
  1. int main(void)
  2. {       
  3.   //开启定时器波形输出
  4.   StartConfig();
  5.   while(1)
  6.   {      
  7.                
  8.   }
  9. }
 楼主| 原来是wjc 发表于 2023-3-29 15:39 | 显示全部楼层
小结:两个定时器输出8路PWM的代码到这里就结束了,运行有问题的小伙伴欢迎反馈,博主日常在线,下一篇内容为:单一定时器捕获4路PWM波并计算占空比
Clyde011 发表于 2024-1-27 11:24 | 显示全部楼层

驱动脉冲变压器原边时,
万图 发表于 2024-1-27 13:20 | 显示全部楼层

通孔(THT)和表面贴装(SMT)
Uriah 发表于 2024-1-27 14:23 | 显示全部楼层

如果碰到异型或圆型板才有可能用到邮票孔
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1250

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部