加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2018-01-17 18:22:02)
分类: MCU
http://www.stmcu.org/module/forum/thread-599931-1-1.html
此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件。
首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。
http://www.stmcu.org/module/forum/data/attachment/forum/201502/04/100151ndns0z1gi99s1nin.pngNucleo笔记-按键控制PWM占空比" TITLE="STM32F411RE Nucleo笔记-按键控制PWM占空比" />
图1 PWM配置
http://www.stmcu.org/module/forum/data/attachment/forum/201502/04/100221h9gofsr5sgszofua.pngNucleo笔记-按键控制PWM占空比" TITLE="STM32F411RE Nucleo笔记-按键控制PWM占空比" />
图2 按键IO口配置
然后生成Keil工程。
用Keil打开。
         首先修改有关PWM方面的代码。

PWM初始化代码如下:

  1. void MX_TIM10_Init(void)
  2. {
  3.   TIM_OC_InitTypeDef sConfigOC;

  4.   htim10.Instance = TIM10;
  5.   htim10.Init.Prescaler = 0;
  6.   htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
  7.   htim10.Init.Period = 0;
  8.   htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  9.   HAL_TIM_Base_Init(&htim10);

  10.   HAL_TIM_PWM_Init(&htim10);

  11.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  12.   sConfigOC.Pulse = 0;
  13.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  14.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  15.   HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1);
  16. }
复制代码
查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下:
http://www.stmcu.org/module/forum/data/attachment/forum/201502/04/100350tial5svykm0a0y5a.pngNucleo笔记-按键控制PWM占空比" TITLE="STM32F411RE Nucleo笔记-按键控制PWM占空比" />
http://www.stmcu.org/module/forum/data/attachment/forum/201502/04/100406unmhnc4ck4rmzkm8.pngNucleo笔记-按键控制PWM占空比" TITLE="STM32F411RE Nucleo笔记-按键控制PWM占空比" />
从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。
比如将改变一下两个语句:
htim10.Init.Period = 1000;
sConfigOC.Pulse = 200;
便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%

要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:
http://www.stmcu.org/module/forum/data/attachment/forum/201502/04/100519kzy8pzzyj4yebnfo.pngNucleo笔记-按键控制PWM占空比" TITLE="STM32F411RE Nucleo笔记-按键控制PWM占空比" />

修改此函数之后,前面的函数声明也要改。改为:static void MX_TIM10_Init(int period,intpulse);

要想PWM工作,需要启动PWM查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:
http://www.stmcu.org/module/forum/data/attachment/forum/201502/04/100546ezeje9tdtev0vnwb.pngNucleo笔记-按键控制PWM占空比" TITLE="STM32F411RE Nucleo笔记-按键控制PWM占空比" />

这是PWM启动与停止的函数。
最后看看按键,只需要把按键配置为上拉模式就好。
在按键初始化中,将
GPIO_InitStruct.Pull= GPIO_NOPULL;
改为
GPIO_InitStruct.Pull= GPIO_PULLUP;

接下来便可以写主函数。
  1. int main(void)
  2. {

  3.   
  4.         int i=100;
  5.   

  6.   

  7.   
  8.   HAL_Init();

  9.   
  10.   SystemClock_Config();

  11.   
  12.   
  13.   HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
  14.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

  15.   
  16.   MX_GPIO_Init();
  17.   MX_TIM10_Init(1000,100);//PWM初始化

  18.   
  19.         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
  20.   

  21.   
  22.   
  23.   while (1)
  24.   {
  25.                 if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下
  26.                 {
  27.                         i=i+100;
  28.                         if(i==1000) i=100;
  29.                         HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM
  30.                         MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i
  31.                         HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
  32.                         while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放
  33.                 }
  34.   }
  35.   

  36. }
复制代码
编译程序,下载程序,可以看到现象:
http://www.stmcu.org/module/forum/data/attachment/forum/201502/04/100629s5555nybznmdd58h.jpgNucleo笔记-按键控制PWM占空比" TITLE="STM32F411RE Nucleo笔记-按键控制PWM占空比" />


参考代码:
http://www.stmcu.org/module/forum/static/image/filetype/zip.gifNucleo笔记-按键控制PWM占空比" /> PWMChangeTest.zip (4.25 MB, 下载次数: 2387)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有