博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32 Cubemx 输出可调频率与占空比的PWM
阅读量:5217 次
发布时间:2019-06-14

本文共 2211 字,大约阅读时间需要 7 分钟。

  这里就不对STM32的PWM进行讲解了,想要了解的可以百度一下,这里主要说怎么实现。

  1、建立工程,我选的是STM32F103zet6芯片,选择定时器的PWM功能

  

  2、配置时钟,我这里配的是内部时钟,没有配外部时钟,而且不是最大时钟,有需要的可以自己改

  

  3、配置定时器,这里的话默认就可以,因为代码里面需要对配置的初始化代码进行修改的,而修改后才可以实现该功能

  

  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 = 48M/Prescaler/Period;影响PWM占空比跟频率的参数这主要是 Pulse、Prescaler、Period 这3个;频率跟占空比都与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)即可,逻辑分析仪采集结果如下图:

  

 

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

 

附一个我自己算出来的频率占空比表(已全部用示波器调试验证):

  

 

转载于:https://www.cnblogs.com/xingboy/p/9910771.html

你可能感兴趣的文章
20145304 刘钦令 Java程序设计第二周学习总结
查看>>
使用NiosII代替SignalTap来监测FPGA内部数据
查看>>
The Longest Path 两种解法
查看>>
Linux下修改php.ini文件
查看>>
What is LDAP
查看>>
CentOS安装MySQL的完整步骤
查看>>
正则--密码强度验证
查看>>
C#电脑自动关机代码指令
查看>>
Problem D: Flip Five
查看>>
uva 10603
查看>>
Struts2面试题
查看>>
GIT分支管理是一门艺术
查看>>
hdu 6073 Matching In Multiplication(拓扑排序+欧拉回路)
查看>>
挂载数据盘
查看>>
lintcode-28-搜索二维矩阵
查看>>
【洛谷1501】[国家集训队] Tree II(LCT维护懒惰标记)
查看>>
764. Largest Plus Sign
查看>>
驱动-helloworld(第一天)
查看>>
loj#6281. 数列分块入门 5
查看>>
hdoj5893
查看>>