0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用STM32生成多路的PWM信号

CHANBAEK 来源:编程外星人 作者:怪蛙 2023-07-26 14:42 次阅读

我们可以使用STM32来生成多路的PWM信号。首先我们来了解一下什么是PWM信号,PWM的全称为Pulse width modulation,即脉冲宽度调制,我们通常也称PWM信号为占空比信号。PWM信号包含3个主要属性:占空比、频率、振幅。

图片

信号频率与周期:PWM信号频率F与周期T的关系为 F = 1 / F,也就是说频率和周期互为倒数。例如,我们有一个频率为400Hz的PWM信号,那么每一个PWM周期的时间为2500us。

占空比:就是PWM方波信号高电平占整个信号周期的比例。例如:PWM周期为2500us,而每一个高电平的时长为1000us,那么占空比为1000 / 2500 = 40%;

振幅:振幅就是高低电平差,也就是我们所说的高电平的电压,通常我们使用STM32单片机所产生的PWM信号为3.3V的PWM波,而有一些芯片和系统可能会产生5.0V或其它电压的PWM波。

例如,我们给出两个PWM信号的例子:

图片

频率400Hz;周期2500us;占空比44%;

图片

频率400Hz;周期2500us;占空比8%

注意,上图中给出的ms表示毫秒,us表示微秒(1毫秒等于1000微秒,1ms等于1000us)。

接下来,我们使用STM32F407来生产4路PWM信号,首先开启TIM4和GPIOD的时钟总线:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);

然后,我们查看控制模块的原理图,找到需要生成PWM信号的4个引脚:

图片

配置PD12、PD13、PD14、PD15这4个引脚,将它们配置为推挽输出模式:

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOD, &GPIO_InitStructure);

由于我们使用的STM32F4xx系列,所以还需要打开这4个GPIO脚的AF的PinSource功能:

GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_TIM4);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_TIM4);

第三步,打开配置TIM4的时钟周期和PWM周期:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1;  //配置预分频数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数
TIM_TimeBaseStructure.TIM_Period = 2500 - 1;  //配置时钟周期
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

第四步,配置TIM4的各个PWM通道:

TIM_OCInitTypeDef 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;


TIM_OC1Init(TIM4, &TIM_OCInitStructure);    //通道1
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC2Init(TIM4, &TIM_OCInitStructure);    //通道2
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC3Init(TIM4, &TIM_OCInitStructure);    //通道3
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_OC4Init(TIM4, &TIM_OCInitStructure);    //通道4
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);

最后,分别配置4路PWM的占空比值,然后开启TIM4:

TIM_SetCompare1(TIM4, 400);
TIM_SetCompare2(TIM4, 800);
TIM_SetCompare3(TIM4, 1800);
TIM_SetCompare4(TIM4, 2200);


TIM_ARRPreloadConfig(TIM4, ENABLE);
TIM_Cmd(TIM4, ENABLE);
TIM_CtrlPWMOutputs(TIM4, ENABLE);

我们使用了TIM_SetCompare1/2/3/4()函数,将PD12、PD13、PD14和PD15分别设置高电平时长为400us、800us、1800us和2200us。我们将程序编译并烧录到我们的控制模块当中,然后使用示波器或逻辑分析仪来查看PWM的信号:

图片

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

    关注

    1268

    文章

    6180

    浏览量

    225699
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620841
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4900

    浏览量

    209906
  • STM32
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348745
  • 信号
    +关注

    关注

    11

    文章

    2639

    浏览量

    75388
收藏 人收藏

    评论

    相关推荐

    如何使用XMC4200生成PWM

    我正在使用 XMC4200F64F256BA 微控制器。 我是 DAVE™ IDE 软件和 XMC 固件的新手。 谁能通过任何示例项目来帮助我生成 PWM 信号。 我的目标是生成 4
    发表于 01-18 08:25

    stm32CubeMAX使用freertos V2生成的lwip与FATFS不能正常运行如何解决?

    freertosV1生成的工程,运行是没有问题的。不知道官方是否有这样的升级后的注意事项,或者是模块有没有根据版本的不同,适配不同的代码块。或者是解决方法。
    发表于 03-08 06:56

    如何用stm32生成pwm同时在其pwm低电平中心触发adc?

    如何用stm32生成pwm同时在其pwm低电平中心触发adc
    发表于 03-20 07:25

    mdk5生成的bin不能用

    芯片是stm32f103,用mdk4生成bin可以使用;用mdk5生成bin,可以生成。但是下进去没有反应。有大神知道怎么解决吗?
    发表于 04-17 21:35

    用9263生成信号,9201采集,为什么采集不到?

    `根据NI十讲视频第三讲的内容用9263生成信号,9201采集,为什么我的9201采集不了啊,是因为我的9263和9201都用的是仿真设备吗?谢谢,求解答`
    发表于 11-21 17:09

    利用AD9854生成一个迸发型的正弦波是否可行

    我准备利用AD9854生成一个迸发型的正弦波,准备利用FSK模式,并控制输出正弦信号的幅值。我准备的做法是这样的:(1)单调谐模式下控制信号的幅值;(2)设置两个频率控制字,一个高频,一个低频;(3
    发表于 12-20 09:30

    PWM信号控制的这个电路是否可以实现

    我是用STM32生成PWM信号来控制该电路,想在输出端输出0-5V的电压,请问这个电路可以实现吗?
    发表于 12-26 10:23

    STM32生成基本工程的方法(图文)

    STM32生成基本工程。包括定时器、SPI、CAN、GPIO、NVIC基本配置,完成后可以闪灯运行
    发表于 03-11 18:46

    如何获得Spartan 3E500生成4相时钟的信号

    嗨,我正在尝试使用Spartan 3E500生成一个4相数字时钟(每个占空比为25%)。 DCM提供完美的相移,但无法调整占空比。无论如何我可以获得如下的时钟信号?(只要时钟与时钟之间没有重叠,就会很好)。谢谢!
    发表于 09-11 07:16

    STM32高级定时器TIM1生成互补PWM硬件

    STM32高级定时器TIM1生成互补PWM硬件:stm32f103zet6开发工具:Keil uVision V5.26.2.0下载调试工具:J-Link最近在研究三相无刷电机FOC控
    发表于 08-10 06:56

    用TIM1生成PWM驱动舵机

    一、问题最近做了下门禁系统用到舵机,但是用TIM1生成PWM驱动舵机时,发现给出命令后,要等一会儿舵机才能响应转动。于是四处找问题,终于在网上找到一些大神的结论,在这里做下记录,也希望帮到遇到同样问题的人。...
    发表于 08-16 08:44

    STM32多路PWM信号频率如何检测?

    频率检测的原理是什么?STM32多路PWM信号频率如何检测?
    发表于 02-14 07:32

    STM32F746ZGT6生成的hex文件是否兼容STM32F756ZGT6?

    STM32F746ZGT6生成的hex文件是否兼容STM32F756ZGT6?求解
    发表于 12-12 06:29

    怎么用STM32F1生成一个11位60K的PWM

    怎么用STM32F1生成一个11位60K的PWM
    发表于 10-15 13:26

    STM32生成互补PWM波(输出前均为低电平)

    STM32生成互补PWM
    发表于 12-31 19:13 28次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>生成</b>互补<b class='flag-5'>PWM</b>波(输出前均为低电平)