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

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

3天内不再提示

STM32CubeMX输出可调频率与占空比的PWM

撞上电子 2023-05-11 10:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1,新建工程,我选的是STM32F103ZET6芯片,选择定时器的PWM功能。

bdeb2a98-ef9b-11ed-ba01-dac502259ad0.png

2、配置时钟,我这里配的是内部时钟,有需要的可以自己改。be058e4c-ef9b-11ed-ba01-dac502259ad0.png

3、配置定时器,默认就可以,因为代码里面需要对配置的初始化代码进行修改的,而修改后才可以实现该功能。be25d5ee-ef9b-11ed-ba01-dac502259ad0.png

4、生成代码后,修改代码,找到PWM初始化函数,修改为如下,注意要把初始化函数前面的 static 关键字也去掉,而且函数声明也要跟着修改。

void MX_TIM4_Init(uint16_t pre,uint16_t pul) //修改初始化函数,改变频率与PWM{ //占空比=Pulse/Period;频率:f=48M/pre/per
TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC;
htim4.Instance = TIM4; htim4.Init.Prescaler =pre; //分频(关键) htim4.Init.Period = 100-1;//计数周期 (关键,若100的计数周期对于一些频率跟占空比误差大的话,可以自己计算更改调试计数周期大小) htim4.Init.CounterMode = TIM_COUNTERMODE_UP; htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = pul;//脉冲计数(关键) sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }
HAL_TIM_MspPostInit(&htim4);
}

5、接着在自己需要的代码里插入,PWM开始停止函数就可以啦。

HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); //PWM开启函数MX_TIM4_Init(uint16_t pre,uint16_t pul);//改变参数就可实现改变占空比跟频率的目的了HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);//停止PWM

这里我说一下核心部分: 占空比=(Pulse/Period)*100%; 频率:f = CLK/Prescaler/Period; 影响PWM占空比跟频率的参数这主要是Pulse,Prescaler,Period;频率跟占空比都与Period(计数周期)有关,只要我们把计数周期定下来,修改Prescaler、跟Pulse这两个值,就可以直接修改PWM的频率跟占空比了。具体要多少的占空比跟频率,就自己计算一下就可以了。 举个例子说明一下:这里Period设为100,如果我要设定一个频率为1500Hz、占空比5%的PWM波,只需要传入参数Pulse=5(占空比=Pulse/Period*100%=(5/100)*100%=5%),Prescaler=320(f=系统频率/分频/计数周期=48M/320/100=1500Hz),逻辑分析仪采集结果如下图:

be43cb3a-ef9b-11ed-ba01-dac502259ad0.png

补充一点:如果频率要求快,而且精度要求高的,就选用晶振大的 STM32 系列,晶振大误差就小,这里如果定好占空比的话,只调频率可以调到很准确,或者定好频率调占空比也是一样,如果要同时改变频率跟占空比,频率高了就会有误差了,所以选用大晶振可以减小点误差。

附一个根据我这里的晶振大小算出来的频率占空比表(已全部用示波器调试验证):

be5c1f32-ef9b-11ed-ba01-dac502259ad0.png

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

    关注

    116

    文章

    5847

    浏览量

    223829
  • STM32
    +关注

    关注

    2305

    文章

    11121

    浏览量

    371183
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问RT-Thread与stm32cubemx联合开发的原理是什么?

    在使用RT-Thread与stm32cubemx联合开发的原理是什么,cubemx在其中主要起到了哪些功能呢?
    发表于 10-11 15:49

    意法半导体:STM32CubeMX将不再集成到STM32CubeIDE中

    从2025年11月发布的版本开始,我们将仅以 独立 版本的形式提供 STM32CubeIDE 和 STM32CubeMXSTM32CubeMX将不再集成到STM32CubeIDE
    的头像 发表于 09-01 17:18 2649次阅读

    使用STM32CubeMX的时候创建的工程已经使用的板载资源如何去掉?

    在使用STM32CubeMX的时候创建的工程已经使用的板载资源如何去掉?在基于开发板进行工程创建的时候会把板载资源直接初始化,后面想要用不同的功能配置,如何把初始配置去掉?
    发表于 07-22 07:13

    STM32CubeMX配置STM32G070RBT6TR时为什么无法使能PVD中断?

    STM32CubeMX 配置STM32G070RBT6TR时无法使能PVD中断
    发表于 06-18 07:59

    STM32开发入门进阶必备!《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》新书发布!

    近日,由华清远见教育科技集团精心编撰的教育部高等学校电子信息类专业教学指导委员会规划教材、普通高等教育电子信息类专业系列教材——《STM32嵌入式系统开发—基于STM32CubeMX和HAL库》重磅
    的头像 发表于 04-03 14:54 1367次阅读
    <b class='flag-5'>STM32</b>开发入门进阶必备!《<b class='flag-5'>STM32</b>嵌入式系统开发—基于<b class='flag-5'>STM32CubeMX</b>和HAL库》新书发布!

    请问STM32cubeMX中文版怎么设置?

    STM32cubeMX中文版怎么设置?
    发表于 03-13 06:12

    STM32CubeMX生成代码就会覆盖CMakeLists.txt文件,怎么解决?

    请教一下用STM32CubeMX生成代码后,我自己加了一个头文件和源文件,这些自己加的文件不是要配置到CMakeLists.txt编译么,但下载在用STM32CubeMX生成成代码,就会覆盖CMakeLists.txt文件,这种一般怎么解决
    发表于 03-12 08:03

    STM32CubeMX无法打开.ioc文件怎么解决?

    我的STM32CubeMX不能打开别人的工程文件,双击打开.ioc文件后会全白,只剩左上角有个home,什么也点不了,但是我自己可以创建工程,也可以打开我自己创建的工程。请问我该如何解决
    发表于 03-12 07:39

    myST账号无法注册导致stm32cubemx无法下载hal库的固件包,为什么?

    myST账号无法注册导致stm32cubemx无法下载hal库的固件包,myST账号注册卡在最后的邮箱验证环节,一直卡着无法注册通过 很急很急!以前stm32cubemx都不需要登录myST账号就能下载固件包了,为什么现在搞个这种抽象东西出来?还不能注册账号
    发表于 03-11 06:17

    STM32CubeMX生成的FreeRTOS源码格式如何优化?

    如图,STM32CubeMX生成的FreeRTOS源码格式有待优化,空格都是以箭头的方式呈现,观感很差。FreeRTOS官方下载的源码则不存在这个问题,说明是STM32CubeMX生成源码的过程出现的格式问题,希望ST官方能对此做下优化!
    发表于 03-10 08:04

    使用STM32CubeMX生成CMake工程中的FLASH.ld被更改怎么解决?

    使用STM32CubeMX生成CMake工程之后,对STM32xxxx_FLASH.ld进行了修改。然后再次使用STM32CubeMX对工程进行修改的时候,STM32xxxx_FLAS
    发表于 03-10 06:52

    STM32CubeMX用于STM32配置和初始化C代码生成

    电子发烧友网站提供《STM32CubeMX用于STM32配置和初始化C代码生成.pdf》资料免费下载
    发表于 02-26 17:32 678次下载

    工程师开发利器:STM32CubeMX 与 eDesignSuite 的协同开发

    HAL 库实现高效控制。示例:通过 CubeMX 配置 PWM 输出和 ADC 采样,配合 eDesignSuite 的电机驱动算法,快速实现电机调速功能。系统级验证与优化利用 STM32C
    的头像 发表于 02-26 14:07 1120次阅读
    工程师开发利器:<b class='flag-5'>STM32CubeMX</b> 与 eDesignSuite 的协同开发

    使用stm32cubeMX无法生成mdk工程文件?

    几年前使用过cubemx,可以生成keil的工程文件。最近有个工程使用cubemx创建,结果只能生成stm32cubemx类型的文件,无法生成mdk的工程文件。 请教如何解决。 (我之前使用过多次
    发表于 01-04 20:03

    STM32CubeMX的菜单介绍

    相信初学者打开STM32CubeMX一定是一脸懵逼,里面都是全英文的,不知道从何入手。这里先给大家简单讲解一下。在新建工程这一栏里,我们最常用的是第一个,它会弹出一个芯片列表供你选择,然后就会创建一
    的头像 发表于 12-25 21:03 694次阅读
    <b class='flag-5'>STM32CubeMX</b>的菜单介绍