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

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

此次用到STM32F411RENucleo开发板,用到Keil MDK5.12和STM32CubeMx软件。

首先用STM32CubeMx软件配置定时器PWM模式与按键输入IO口。

STM32F411RE Nucleo笔记-按键控制PWM占空比_第1张图片

图1 PWM配置


图2 按键IO口配置

然后生成Keil工程。

用Keil打开。

         首先修改有关PWM方面的代码。

PWM初始化代码如下:

/* TIM10 init function */
void MX_TIM10_Init(void)
{
  TIM_OC_InitTypeDef sConfigOC;

  htim10.Instance = TIM10;
  htim10.Init.Prescaler = 0;
  htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim10.Init.Period = 0;
  htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim10);

  HAL_TIM_PWM_Init(&htim10);

  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 0;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  HAL_TIM_PWM_ConfigChannel(&htim10, &sConfigOC, TIM_CHANNEL_1);
}

查看头文件stm32f4xx_hal_tim.h,可以知道定时器初始化参数的含义如下:


STM32F411RE Nucleo笔记-按键控制PWM占空比_第2张图片


从头文件中可以看出,要想简单配置PWM很简单,只要改变PWM周期的值与脉冲值就好。

比如将改变一下两个语句:

htim10.Init.Period = 1000;

sConfigOC.Pulse = 200;

便将PWM配置为周期为1000个定时器周期,高电平持续时间为200个定时器时钟周期,占空比为200/1000=20%。

 

要想用按键控制PWM占空比,我们只需要修改一下PWM初始化函数,修改如下:

STM32F411RE Nucleo笔记-按键控制PWM占空比_第3张图片


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

要想PWM工作,需要启动PWM。查看头文件stm32f4xx_hal_tim.h,可以看到如下函数:


这是PWM启动与停止的函数。

 

最后看看按键,只需要把按键配置为上拉模式就好。

在按键初始化中,将

GPIO_InitStruct.Pull = GPIO_NOPULL;

改为

GPIO_InitStruct.Pull = GPIO_PULLUP;

接下来便可以写主函数。

int main(void)
{

  /* USER CODE BEGIN 1 */
	int i=100;
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* System interrupt init*/
  /* Sets the priority grouping field */
  HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM10_Init(1000,100);//PWM初始化

  /* USER CODE BEGIN 2 */
	HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
  /* USER CODE END 2 */

  /* USER CODE BEGIN 3 */
  /* Infinite loop */
  while (1)
  {
		if(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13))//如果按键按下
		{
			i=i+100;
			if(i==1000) i=100;
			HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);//停止PWM
			MX_TIM10_Init(1000,i);//PWM重新配置,周期为1000,高电平持续时间为i
			HAL_TIM_PWM_Start(&htim10,TIM_CHANNEL_1);//启动PWM
			while(!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13));//等待按键释放
		}
  }
  /* USER CODE END 3 */

}

 

编译程序,下载程序,可以看到现象:


每次按下按键,占空比会增加10%。

                                                                                                                                                      HJL

                                                                                                                                                      2015.1.26










你可能感兴趣的:(单片机,stm32,PWM,nucleo)