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

STM32F411RE Nucleo笔记-按键控制PWM占空比

[复制链接]
hjl240 发布时间:2015-2-4 10:08
本帖最后由 hjl240 于 2015-2-4 10:09 编辑 / z4 G+ @$ S6 Y7 c0 T0 F

4 J# C7 K  x- L2 D" z8 w; e5 ^
此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件。
首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。
1.png
图1 PWM配置
2.png
图2 按键IO口配置
然后生成Keil工程。
用Keil打开。
         首先修改有关PWM方面的代码。
. o: L5 m' v; E0 Z/ V& \
PWM初始化代码如下:
  1. /* TIM10 init function */
    + {- R) f- N7 [4 ?; Q0 x
  2. void MX_TIM10_Init(void)
    ( T0 o% J7 T4 s
  3. {+ t4 p- ]% R3 p3 C# c: a6 w7 T/ k
  4.   TIM_OC_InitTypeDef sConfigOC;
    9 i, k, ]7 P; S* k2 m' d6 [
  5. 7 i! l5 \6 B; ~1 K, z& v- w
  6.   htim10.Instance = TIM10;
    : M/ g/ M. h1 K1 P/ o; c
  7.   htim10.Init.Prescaler = 0;- }( Y- V6 v/ Q
  8.   htim10.Init.CounterMode = TIM_COUNTERMODE_UP;$ D6 V) i1 m$ F* r3 q7 V3 o
  9.   htim10.Init.Period = 0;
    " f) g2 H2 S- D
  10.   htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    0 `; i; X8 @' N' m5 }3 y& G
  11.   HAL_TIM_Base_Init(&htim10);
    # L% C" z8 A5 @$ d. y+ I1 s: ^9 I

  12. / G3 V& x$ H/ ?: ^; N: _
  13.   HAL_TIM_PWM_Init(&htim10);7 U0 N% `- Y% c8 e
  14. % x) i) R* y5 G; H% q' R
  15.   sConfigOC.OCMode = TIM_OCMODE_PWM1;7 W2 C. j- K0 f3 q* ?
  16.   sConfigOC.Pulse = 0;
    , o1 T6 G$ y8 o1 N8 ?- \8 y# p  L
  17.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    / L( q) k: w$ D) i# H
  18.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    4 `* [: K- L4 Z$ z7 u/ Q
  19.   HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1);9 l, Y' F  H& Q9 p3 e
  20. }
    5 _3 Y9 z. q- z
复制代码
查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下:
3.png
与
4.png
从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。
比如将改变一下两个语句:
htim10.Init.Period = 1000;
sConfigOC.Pulse = 200;
便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%。

: G3 P/ m0 u, H- u" N9 f
要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:
5.png

0 e" I7 }$ P! X
修改此函数之后,前面的函数声明也要改。改为:static void MX_TIM10_Init(int period,intpulse);
. N6 |  Y) I, k7 @3 g3 q8 ]' M
要想PWM工作,需要启动PWM。查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:
6.png

: K% U$ p! }4 Q/ t2 U& q
这是PWM启动与停止的函数。
最后看看按键,只需要把按键配置为上拉模式就好。
在按键初始化中,将
GPIO_InitStruct.Pull= GPIO_NOPULL;
改为
GPIO_InitStruct.Pull= GPIO_PULLUP;
* Y2 v, T1 s; f1 L2 j9 D7 C
接下来便可以写主函数。
  1. int main(void)
    9 _" n/ y2 e$ G
  2. {
    4 |) r: @4 m+ V/ W1 K

  3. : Q. N0 G  r) l  ?' |& y
  4.   /* USER CODE BEGIN 1 */) m- y2 |5 U" ?9 Q1 K
  5.         int i=100;
    - `/ s; q5 j: ~- t* C- G/ R& B8 C+ P
  6.   /* USER CODE END 1 */0 I) Z( x& _! ~

  7.   V" _9 f. u2 W0 k! S+ ^) \7 O
  8.   /* MCU Configuration----------------------------------------------------------*/
    ( w$ p2 M* A0 C" D& U+ f

  9. 5 P  T' N& K& O3 J  u  _0 \, a
  10.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */* ^4 k! ~$ k' E) c2 z
  11.   HAL_Init();
    & {6 K1 d* R7 y, Z1 E- d7 y

  12. ( f1 D1 n  k1 J8 Z$ u
  13.   /* Configure the system clock */
    * \, X7 I9 X/ a0 ?" Q
  14.   SystemClock_Config();, _: H9 d! O" g- d8 z# ]6 j$ A

  15. ) ?/ b) q0 ]& }# Z% I
  16.   /* System interrupt init*/
    0 x  \% c2 }3 ^6 K% z# c
  17.   /* Sets the priority grouping field */: ^9 Q- J! c4 R& Z' t  j! [
  18.   HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
    ( a0 m( g) [# c
  19.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    " X) }2 M9 _' [% N

  20. ( \/ ^3 \  |+ \
  21.   /* Initialize all configured peripherals */0 c0 ]2 P; j1 h1 M! E5 ], U
  22.   MX_GPIO_Init();
    4 e, W- `' z2 P# O2 F& g# @
  23.   MX_TIM10_Init(1000,100);//PWM初始化. ?$ s$ ?3 y$ y9 M- \8 X% W& r

  24. & \0 `9 m3 X: R8 M% B
  25.   /* USER CODE BEGIN 2 */
    $ D8 K* K: z  J/ R% y# ]
  26.         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM% B4 B5 i. T$ ?% c1 L" c3 U
  27.   /* USER CODE END 2 */" ]1 [4 n2 B' J' R
  28. ) I: O- J+ {% K  p5 B  \9 k% _
  29.   /* USER CODE BEGIN 3 */
    # Y  t3 E, G" T- a2 a
  30.   /* Infinite loop */. i) h! d- T& M$ v, v+ B6 z% A
  31.   while (1)2 d( T/ _% a/ l4 c! I& J
  32.   {
    " H4 O8 m& F0 z' N
  33.                 if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下0 a- r  W9 o$ M! k
  34.                 {
    & p4 S3 V) |% ?' K2 E
  35.                         i=i+100;4 w7 @# ]- a1 U
  36.                         if(i==1000) i=100;
    5 K( Q7 l; y( X- U1 U3 u
  37.                         HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM
      E3 j/ R. n8 x& H* R# z
  38.                         MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i
    3 B1 \2 O3 k4 B, i0 t
  39.                         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
    9 B/ _! e* v4 `5 w
  40.                         while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放: N) R5 H# b& U, U. l
  41.                 }
    - p0 I* f' h, o; u8 ~7 m
  42.   }3 b; g: o8 L' f% {9 N
  43.   /* USER CODE END 3 */
    - h; o% p0 L. f8 x+ l( W6 K
  44. + I2 z( \# t) m' K6 r. c* Z1 P
  45. }6 B9 e7 a: y+ R
复制代码
编译程序,下载程序,可以看到现象:
7.jpg
; m  o. {+ T1 ~$ Y; D9 e5 ]

. E. K9 R# `! O- {& S, `  ?
参考代码:
PWMChangeTest.zip (4.25 MB, 下载次数: 2481)
赞 收藏 1 评论20 发布时间:2015-2-4 10:08

举报

20个回答
hjl240 回答时间:2015-2-5 08:07:08
tcmax 发表于 2015-2-5 00:43
. _% }; O2 @1 P4 }, U- i/ ~4 n; ?我已经弄好了 可是固件库怎么加载啊?我百度了下说keil自带的固件库,可是找半天411的只有这些,请问你是 ...
- K0 h6 C( v4 P# C( W
我是用STM32CubeMX软件直接生产的Keil工程,简单又方便,不用自己添加其他文件,,,,你可以试试用STM32CubeMX软件
tcmax 回答时间:2015-2-5 00:43:04
hjl240 发表于 2015-2-4 19:10. ~/ F, _9 A8 w2 `4 P
有的,,可以更新一下软件包
7 s# [+ L$ G0 a( n8 D7 s
我已经弄好了 可是固件库怎么加载啊?我百度了下说keil自带的固件库,可是找半天411的只有这些,请问你是怎么添加固件库的?难道是手动复制到文件夹里?
QQ图片20150205004211.jpg
yaowei 回答时间:2015-10-12 19:38:34
楼主,请问STM32F411RET复用IO口是哪个函数,我用的HAL库 ,怎么在GPIO.h里都没找到类似与407标准库的GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)的函数
大秦正声 回答时间:2015-2-4 10:49:50
谢谢分享!
tcmax 回答时间:2015-2-4 14:29:19
请问你的keil里有那个411re的选项吗 我的是最新版的怎么没有啊- \) H# N& m! l
hjl240 回答时间:2015-2-4 19:10:11
tcmax 发表于 2015-2-4 14:29
  Y9 K  _' i6 f# f; `; w$ u请问你的keil里有那个411re的选项吗 我的是最新版的怎么没有啊
5 R+ U$ r1 N% J0 o& ^' @& A
有的,,可以更新一下软件包
0 h* g7 ?1 F2 K/ L3 g0 l0 Q; q( N$ n  R& H! g0 D' w
411.png + m4 P  a  L* g: c( t5 j( |
拼命三郎V5 回答时间:2015-2-5 08:33:50
ssss.jpg
Ljmp 回答时间:2015-2-6 16:04:49
恩,刚用CUBX 还是有点不习惯哦
hjl240 回答时间:2015-2-8 08:51:45
Ljmp 发表于 2015-2-6 16:04
5 x! R4 Q0 n% ], y8 O: d恩,刚用CUBX 还是有点不习惯哦
+ W' F) ?  C8 V/ }
多用几次就习惯了
chuanc 回答时间:2015-6-9 09:17:57
这里所说的定时器周期,这个周期时间是多少呢?这个怎么确定呢?
lslp 回答时间:2015-7-14 16:12:21
我想问一下cubmax时钟树怎么设置的,怎么和我生成的系统时钟函数有好大的区别啊
新建位图图像.jpg
二愣子 回答时间:2015-7-15 09:49:44
楼主有简单点的方法么  比如说直接用sConfigOC.Pulse = 200;这一句改脉冲宽度,。。。因为我觉得每次改脉宽,就得重新初始化 ,效率会不会有点低。。当然我是没搞出来。。
stary666 回答时间:2015-7-15 12:18:54
看看,,,,,,,,,,,,
112207301219 回答时间:2015-8-8 17:20:33
不错,讲的很详细,很有学习价值。
你好我好大家好! 回答时间:2015-8-8 21:09:06
帮顶                 
12下一页

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版