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

STM32G431RBT6之pww

[复制链接]
STMCU小助手 发布时间:2023-3-2 13:33
一、pwm要求

e2dd116319474188b665f2c6f333b4f2.png

f18673a37dd84f5f8ad1c50b95046af1.png

73c1257118e44a4b9af35dbda27696b3.png

331a6f81ba1c46948ba6154f9b9ddf8e.png

6caa059d72594450b56c96726dca1924.png

二、相关概念

2762dfdbd8194c1480d4861527fa1889.png

pwm实际上是输出功能,输出功能还是通过引脚来实现,利用引脚的复用功能,实现引脚的配置,从而实现pwn输出功能

我们的台灯就是通过调节占空比实现暗-亮-较亮的调节


2.定时器timer有没有pwm输出功能,参考《参考手册》

a10ecf4a182b4c108466fce3f784b96a.png

如此查询可知28、29、30章的timer都支持pwm输出功能


三、CubeMX配置
1.检查某个定时器是否支持pwm输出功能?

c29fe38c95e04d66a6816eec4594f0cb.png

如果有channel的话表示支持PWM输出功能

2.对引脚PA7进行配置(题目要求)

db21cb88be004445962e74c6c69620b6.png

一个timer可能有很多通道支持pwm输出,可以根据自己平时练习选一个通道(我选的是timer3的通道2)

3.配置所选定时器的时钟和对应通道的功能

64dd76679e9841c5a7b66c42d37826f2.png

4.分频

9048c7aa049045049cc4369d0eb14097.png

a7b12f8d00e8417d8f47154b6eafcb22.png

5.配置占空比
在分频的时候counter period是一个周期计数500

e7f61c51500643d8aae78ad31ecfc426.png

6.相关参数解释
1.

753396f808914e568a2323f30386d9b0.png

2、

a45cc5de7953456ea921d0220d9ecf0f.png

3、

b64a2939f35044b08767b73d003e754d.png

pwm1和pwm2的区别:
在进行PWM信号输出时,有两种PWM模式:PWM1模式和PWM2模式。
这两种PWM模式和输出有效电平的极性共同决定了PWM信号的波形。
PWM1模式
递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为有效电平,否则为无效电平。递减计数模式则刚好相反。
PWM2模式
递增计数时,当TIMx_CNT(计数值)< TIMx_CCR(捕获/比较值)时,输出为无效电平,否则为有效电平。递减计数模式则刚好相反。

e65a51e70df049198baee4778d2a24e7.png

4、

5941ff4d81b3415eadc31cfa2d8eb2ce.png

5、占空比就相当于平均输出高电平20%,实验结果如下(平均输出专业术语就是pwm输出)

0687b01602984d89bbf504f22b3dcb7b.png


四、代码

1、CubeMX自动生成的代码

128d09e1753b4a2f90a42d4509924e6a.png

2、设置变量

bff131a3108245e7b431b8930830eb72.png

3、根据题目要求B4按键的共能,更新按键函数

e34b932f82cd4de080f00871bc1e6daf.png

  1. //Key processing function
  2. void Key_Proc(void)
  3. {
  4.         uint8_t cur_key = 0;
  5.        
  6.         cur_key = Key_Scan();
  7.        
  8.         switch(cur_key)
  9.         {
  10.                 case 1:
  11.                         Show_Flag++;
  12.                         if(Show_Flag == 3)
  13.                                 Show_Flag = 1;
  14.                         Update_Flag = 1;
  15.                         break;
  16.                 case 2:
  17.                         if(Show_Flag == 2)
  18.                         {
  19.                                 CNBR_Price += 0.5f;
  20.                                 VNBR_Price += 0.5f;
  21.                                 Update_Flag = 1;                               
  22.                         }
  23.                         break;
  24.                 case 3:
  25.                         if(Show_Flag == 2)
  26.                         {
  27.                                 CNBR_Price -= 0.5f;
  28.                                 VNBR_Price -= 0.5f;
  29.                                 if(CNBR_Price < 0)
  30.                                         CNBR_Price = 0.0f;
  31.                                 if(VNBR_Price < 0)
  32.                                         VNBR_Price = 0.0f;                       
  33.                                 Update_Flag = 1;
  34.                         }
  35.                         break;
  36.                 case 4:
  37.                         PWM_Flag ^=1;//yihuo 0/1
  38.                         break;               
  39.                 default:
  40.                         ;
  41.         }
  42. }
复制代码

4、LED函数

21aabb2fd0d848efbd16952833d9e4dc.png

  1. void Led_Proc(void)
  2. {
  3.         if(IDEL_Size > 0)
  4.                 LED_Ctrl(LED1, ON);
  5.         else
  6.                 LED_Ctrl(LED1, OFF);
  7.        
  8.         if(PWM_Flag==1)
  9.                 LED_Ctrl(LED2,ON);
  10.         else
  11.                 LED_Ctrl(LED2,OFF);
  12. }
复制代码

5.1、PWM函数

6387fa2f8b2947b5ab6ecb55b7a610f6.png

  1. void PWM_Proc(void )
  2. {
  3.         if(PWM_Flag==0)
  4.         {
  5.                 HAL_TIM_PWM_Stop(&htim3 ,TIM_CHANNEL_2 );
  6.                 HAL_Delay(5);
  7.         }
  8.         else
  9.         {
  10.                 HAL_TIM_PWM_Start(&htim3 ,TIM_CHANNEL_2 );
  11.                 HAL_Delay(5);
  12.         }
  13. }
复制代码

5.2、timer定时器通道相关函数学习
HAL_TIM_PWM_Start(&htim3 ,TIM_CHANNEL_2 );
当有按键按下的时候,开启timer3的2通道的PWM输出
HAL_TIM_PWM_Stop(&htim3 ,TIM_CHANNEL_2 );
当有按键按下的时候,关闭timer3的2通道的PWM输出
注:__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,250) 是专门用来设置占空比的函数,这样就是占空比为250/500=50%

6、主函数和函数声明

99f74a259e5e4d47b57fb0962d0217ec.png

80e2410b3c694721a6bdc2187618b432.png

五、实验结果
通过控制B4能够实现LED2的亮灭
串口部分的结果问题:

43c97cc65c594a85b90f316b0d93f8b9.png

————————————————
版权声明:想要优秀点儿


收藏 评论0 发布时间:2023-3-2 13:33

举报

0个回答

所属标签

相似分享

官网相关资源

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