stm32单片机Pwm输出对频率,定时器的理解

原理介绍

首先我们要了解系统时钟的概念
32单片机外接了一个8M的晶振,经过9倍的倍频后,PLL锁相环输出72Mhz的频率。这即系统的主频。

定时器中 TIM3_Init(u16 arr,u16 psc)这个初试函数中,arr是自动重装载值,psc是可编程预分频器。(他们共同设置什么时候该溢出)
比如arr = 899, psc = 0;
就表示没有分频,此时定时器的时钟频率仍为72MHz,表示每个周期定时器经过900个脉冲,周期 = 1/72 us *900
PWM 的频率就是 72000 000/900 = 8M

在这里插入图片描述
当我们设置pwm模式2,极性为高时
在这里插入图片描述
pwm输出为这样的模式,由于我们想制作,呼吸灯,可以通过不断改变ccr的值,来改变占空比。从而调整LED灯的亮度。

流程展示

在这里插入图片描述
ps:小细节

  1. TIM_ClockDivision的作用就是在未分频之前根据要求建立新的分频器,确定定时器,确定一定的延时时间,在此时间内完成一定预期的功能,一般不太用,所以无论是定义图二中的哪个值对原本定时器的频率都毫无影响

TIM_TimeBaseStructure.TIM_ClockDivision=0;这个语句的意思是不分频,换句话说频率不变。

  1. 在这里插入图片描述有关pwm模式2
    在这里插入图片描述
    这两种pwm模式就是输出电平的极性相反

如同上图画的那样,占空比的有效部分是由
极性和pwm模式共同决定的。
3. 配置后,紧接着初始化函数
结构体一定要放在函数的最前面

代码问题

  1. 首先注意每一行代码之间的联系和逻辑
    在这里插入图片描述
    比如 if这里dir =0;
    那么后面的pwmled (crr(21Q
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32单片机中,可以使用定时器模块来生成PWM信号。下面是一个基本的步骤: 1. 配置GPIO引脚:选择一个支持PWM输出的GPIO引脚,并将其配置为复用功能。可以使用`HAL_GPIO_Init()`函数来完成配置。 2. 配置定时器:选择一个合适的定时器,并进行配置。可以使用CubeMX工具进行可视化配置,或者使用相关的HAL库函数进行手动配置。重点是设置定时器的工作模式、时钟源、预分频器和计数模式。 3. 配置PWM模式:根据需求选择合适的PWM模式(单边或双边对称),并设置相关的参数,如占空比和周期。可以使用`HAL_TIM_PWM_Init()`函数初始化PWM模式。 4. 配置PWM通道:选择一个PWM通道,并设置相关参数,如GPIO引脚映射、通道极性和预分频系数。可以使用`HAL_TIM_PWM_ConfigChannel()`函数进行配置。 5. 启动定时器:使用`HAL_TIM_PWM_Start()`函数启动定时器PWM输出。 下面是一个简单的示例代码,演示了如何在PA8引脚上输出一个占空比为50%、周期为1ms的PWM信号: ```c #include "stm32f4xx_hal.h" TIM_HandleTypeDef htim; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_TIM_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM_Init(); HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); while (1) { } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 25; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } } void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } void MX_TIM_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; __HAL_RCC_TIM1_CLK_ENABLE(); htim.Instance = TIM1; htim.Init.Prescaler = 83; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = 8399; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim.Init.RepetitionCounter = 0; if (HAL_TIM_PWM_Init(&htim) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 4199; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } } ``` 请注意,以上代码仅供参考,并可能需要根据您的具体情况进行适当的修改。建议参考相关的STM32文档和HAL库函数说明来了解更多细节和配置选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值