STM32F0 TIM1 LL库生成PWM波

一.功能说明

使用STM32F030F4,通过Time1的CH2(PA9)产生周期为1s,占空比50%的PWM波,高电平在前,低电平在后。处理器时钟选用HSI(8MHz),不启用PLL,定时器外设时钟8Mhz,定时器时钟8000分频,计一个数1ms。

二.TIM1概述

Timer1作为高级定时器,比其他定时器多了两个功能,一个重复计数器,一个刹车和死区。
重复计数器:可以让定时器多个周期才产生一次更新中断,如果需要设定产生多少个PWM波周期,这个功能比较实用。
刹车和死区:主要用于电机控制。
由于这两个功能导致Timer1用于产生普通PWM波会比其它定时器多一些配置。

三.CubeMX配置

Clock配置:

在这里插入图片描述

Timer1配置:

在这里插入图片描述

LL库选择:

在这里插入图片描述

四.Cube生成的TIM1初始化代码

/* TIM1 init function */
void MX_TIM1_Init(void)
{
  LL_TIM_InitTypeDef TIM_InitStruct = {0};
  LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0};
  LL_TIM_BDTR_InitTypeDef TIM_BDTRInitStruct = {0};

  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
  /* Peripheral clock enable */
  LL_APB1_GRP2_EnableClock(LL_APB1_GRP2_PERIPH_TIM1);

  /* TIM1 interrupt Init */
  NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 0);
  NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);

  TIM_InitStruct.Prescaler = 7999;
  TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
  TIM_InitStruct.Autoreload = 1000 - 1;
  TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
  TIM_InitStruct.RepetitionCounter = 0;
  LL_TIM_Init(TIM1, &TIM_InitStruct);
  LL_TIM_EnableARRPreload(TIM1);
  LL_TIM_SetClockSource(TIM1, LL_TIM_CLOCKSOURCE_INTERNAL);
  LL_TIM_OC_EnablePreload(TIM1, LL_TIM_CHANNEL_CH2);
  TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
  TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
  TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
  TIM_OC_InitStruct.CompareValue = 500;
  TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
  TIM_OC_InitStruct.OCNPolarity = LL_TIM_OCPOLARITY_HIGH;
  TIM_OC_InitStruct.OCIdleState = LL_TIM_OCIDLESTATE_LOW;
  TIM_OC_InitStruct.OCNIdleState = LL_TIM_OCIDLESTATE_LOW;
  LL_TIM_OC_Init(TIM1, LL_TIM_CHANNEL_CH2, &TIM_OC_InitStruct);
  LL_TIM_OC_DisableFast(TIM1, LL_TIM_CHANNEL_CH2);
  LL_TIM_SetTriggerOutput(TIM1, LL_TIM_TRGO_RESET);
  LL_TIM_DisableMasterSlaveMode(TIM1);
  TIM_BDTRInitStruct.OSSRState = LL_TIM_OSSR_DISABLE;
  TIM_BDTRInitStruct.OSSIState = LL_TIM_OSSI_DISABLE;
  TIM_BDTRInitStruct.LockLevel = LL_TIM_LOCKLEVEL_OFF;
  TIM_BDTRInitStruct.DeadTime = 0;
  TIM_BDTRInitStruct.BreakState = LL_TIM_BREAK_DISABLE;
  TIM_BDTRInitStruct.BreakPolarity = LL_TIM_BREAK_POLARITY_HIGH;
  TIM_BDTRInitStruct.AutomaticOutput = LL_TIM_AUTOMATICOUTPUT_DISABLE;
  LL_TIM_BDTR_Init(TIM1, &TIM_BDTRInitStruct);
  LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
    /**TIM1 GPIO Configuration    
    PA9     ------> TIM1_CH2 
    */
  GPIO_InitStruct.Pin = LL_GPIO_PIN_9;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
  GPIO_InitStruct.Alternate = LL_GPIO_AF_2;
  LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

此初始化代码完成了基本的参数配置,没有启动定时器,所以只调用MX_TIM1_Init()函数,无法产生PWM波。

五.增加启动代码

/**
  * @brief  None
  * @param  None
  * @retval None
  */
void Timer1Ch2Start( void )
{
	MX_TIM1_Init();
	
	LL_TIM_CC_EnableChannel( TIM1 , LL_TIM_CHANNEL_CH2 );
	LL_TIM_EnableAllOutputs( TIM1 );						//只有Timer1等高级定时器需要,必须放置在LL_TIM_BDTR_Init(TIM1, &TIM_BDTRInitStruct);之后。
	
	LL_TIM_EnableCounter( TIM1 );	
	
	LL_TIM_GenerateEvent_UPDATE( TIM1 );
}

);之后。
	
	LL_TIM_EnableCounter( TIM1 );	
	
	LL_TIM_GenerateEvent_UPDATE( TIM1 );
}

火柴棍科技工作室:www.huochaigun.top

技术交流群

STM32MP1:861926625

ESP8266:476685983

无线(NB-IOT, Cat.1, 4G)通信模组:666129332

要在STM32F401上使用LL编写PWM控制舵机的话,你需要按照以下步骤进行操作: 1. 配置GPIO引脚作为PWM输出引脚。选择一个合适的引脚,通常使用定时器的通道来生成PWM信号。例如,你可以选择使用TIM4的CH1引脚(PA6)。 2. 初始化定时器。使用LL的函数来初始化定时器,选择合适的时钟源和预分频器,以及设置计数器的自动重载值。 3. 配置PWM模式。选择PWM模式,设置PWM信号的极性(正向或反向),以及设置占空比。 4. 配置输出比较模式。使用LL的函数来配置输出比较模式,以及设置比较值。 5. 启动定时器。使用LL的函数来启动定时器,开始产生PWM信号。 下面是一个示例代码,说明如何使用LLSTM32F401上控制舵机的PWM信号: ```c #include "stm32f4xx_ll_bus.h" #include "stm32f4xx_ll_gpio.h" #include "stm32f4xx_ll_tim.h" void PWM_Init(void) { // 使能GPIOA时钟 LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); // 配置PA6引脚为复用功能 LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_6, LL_GPIO_MODE_ALTERNATE); LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_6, LL_GPIO_OUTPUT_PUSHPULL); LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_6, LL_GPIO_SPEED_FREQ_HIGH); LL_GPIO_SetAFPin_0_7(GPIOA, LL_GPIO_PIN_6, LL_GPIO_AF_2); // 使能TIM4时钟 LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM4); // 配置定时器预分频器 LL_TIM_SetPrescaler(TIM4, 83); // 84MHz / (83+1) = 1MHz // 配置自动重载值 LL_TIM_SetAutoReload(TIM4, 1999); // 1MHz / (1999+1) = 500Hz // 配置PWM模式 LL_TIM_OC_SetMode(TIM4, LL_TIM_CHANNEL_CH1, LL_TIM_OCMODE_PWM1); LL_TIM_OC_SetPolarity(TIM4, LL_TIM_CHANNEL_CH1, LL_TIM_OCPOLARITY_HIGH); // 配置输出比较模式和比较值 LL_TIM_OC_ConfigOutput(TIM4, LL_TIM_CHANNEL_CH1, LL_TIM_OCPOLARITY_HIGH | LL_TIM_OCPOLARITY_LOW); LL_TIM_OC_SetCompareCH1(TIM4, 1500); // 设置初始占空比为1500 // 启动定时器 LL_TIM_EnableCounter(TIM4); // 启动输出比较通道 LL_TIM_CC_EnableChannel(TIM4, LL_TIM_CHANNEL_CH1); } ``` 上面的代码初始化了TIM4定时器和PA6引脚用于PWM输出。然后,你可以使用LL_TIM_OC_SetCompareCH1函数来改变舵机的占空比,从而控制舵机的位置。 请根据你的具体需求进行适当的修改和调整。希望对你有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火柴棍mcu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值