你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32Cube HAL PWM输出

[复制链接]
STMCU小助手 发布时间:2022-4-7 16:27
   实验内容:使用通用定时器输出PWM,实现呼吸灯效果,呼吸周期3S。

一、原理图

[7C9Z4Q8881(D9%_MCA_I(5.png

二、 CubeMX配置

Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。

U4U7OU9GZ{%DY3NEY65]R.png

Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。

1[U([UI7ZZ(Z2LS]S4AZ7M8.png

O_TA)MA2PA}K@1F]`RR1XB8.png

Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)

KBQ3VJYT9C3N{8PZ~AB]1`W.png

Step4.配置定时器,时钟配置计数器时钟经过(719+1)分频配置为100khz,即计一个数的时间为10us,一共计数(299+1)次,即进入一次中断的时间为3ms。(注:图中计数周期应改为299)

)$_QL%TAT_@YE{{221JEN.png

Y}6VM7CH{G{PV0MN(8XE73A.png


到这里关于相关参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。

三、添加功能代码

我们此次采用的查表法进行占空比的修改,我这边是用excel生成了一个呼吸曲线。(采样点为100个)

75GRM8Q1ZP_[AQLKCPH@B.png

在main.c主函数外定义相关变量:

  1. uint16_t int_cnt;//中断的次数
  2. uint16_t duty_cnt;//不同占空比在数组的位置
  3. uint16_t duty_value[100]={1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9, 10,
  4.                                                 12, 13,15, 16, 18, 21, 23, 26, 29, 33, 37, 41, 47, 52, 59, 66, 74,                                                                                          
  5.                             83,94, 105, 118, 133, 149, 168, 188, 212, 238, 267, 300, 300, 267,
  6.                                                  238, 212, 188, 168, 149, 133, 118, 105, 94, 83, 74, 66,59, 52, 47,
  7.                                                  41, 37, 33, 29, 26, 23, 21, 18, 16, 15, 13, 12, 10, 9, 8, 7, 6, 6,
  8.                                                  5, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1};//占空比的取值(采样点)
复制代码

在main.c,主函数内(while(1)循环外)开启定时器,使能更新中断和PWM输出。
  1. __HAL_TIM_CLEAR_IT(&htim3,TIM_IT_UPDATE);//清除中断标志位,防止一使能定时器就进入中断
  2. HAL_TIM_Base_Start_IT(&htim3);//使能定时器,和更新中断
  3. HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);//使能定时器,和PWM输出
复制代码

在main.c文件中,写入回调函数:

  1. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  2. {
  3.     //每进入一次中断,int_cnt加1
  4.         int_cnt++;
  5.     //int_cnt=10,说明进入10次中断,变换占空比
  6.         if(int_cnt==10)
  7.         {
  8.         //从duty_value[0]到duty_value[99]共100个数
  9.                 __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4,duty_value[duty_cnt]);//用于变换占空比
  10.                 //通过自加,来变换占空比
  11.         duty_cnt++;
  12.         //表**100位数,使用完以后重新从第一位数开始
  13.                 if(duty_cnt==100)
  14.                 {
  15.                         duty_cnt=0;
  16.                 }
  17.         //每十次中断以后,中断重新计数
  18.                 int_cnt=0;
  19.         }
  20. }
复制代码


结合时钟配置以及回调函数我们可以知道,我们每进入一次中断的时间为3ms,而每进入十次中断就会变换一次占空比,即每变换一次占空比耗时30ms。我们一共需要变换100次占空比,即一次呼吸灯耗时3s。


收藏 评论0 发布时间:2022-4-7 16:27

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版