STM32F103输出占空比可调的PWM信号

关于STM32定时器TIM4输出占空比可调PWM控制信号的方法及原理

 

        关于TIM4的使用我们首先必须要了解到一点,TIM4是什么?对于STM32内核来说,它是属于片上外设。内核如何使用片上外设?当然要通过内部的总线结构。以STM32F103为例,其内部总线结构如下两幅图所示: 

 

 

format,png      format,png

        通过这内部总线结构图我们知道,我们所想配置并使用的TIM4是挂载在内部中线APB1上的,所以我们知道我们要使用的库函数必然是和APB1总线相关的。期中与之相关的库函数包括:

 

 

 

    RCC_APB1PeriphClockCmd()、RCC_APB1PeriphResetCmd()
 

        其中RCC_APB1PeriphClockCmd()是用于使能或者失能 APB1 外设时钟的库函数,RCC_APB1PeriphResetCmd()是用于强制或者释放高速 APB(APB2)外设复位的函数,那么显然我们需要用到库函数RCC_APB1PeriphClockCmd()来使能挂载在APB1总线上的片上外设TIM4,然后我们才能使用这个片上外设。

 

 

        在具体的使用前我们还需要对外设进行相应的配置,就是设置与之相对应的寄存器。但好在库函数已经对这些操作进行了封装,封装了相应的数据结构,利用这些抽象起来的数据结构,我们可以对这些寄存进行整体的设置。所以我们需要定义处相应的数据类型的数据。

 

 

 

        TIM_TimeBaseInitTypeDef类型的数据就是官方函数库给出的用于配置TIMx的一种数据类型。定义好了以后,我们就需要利用相应的初始化函数来对TIMx进行相应的初始化操作,也就是调用TIM_TimeBaseInit()函数,并将设置好了数据的TIM_TimeBaseInitTypeDef类型的数据作为参数传入。

 

 

 

        因为我们需要的是利用TIM4向外部输出PWM信号,就是片内外设需要向片外传送信号,所以我们需要通过相应的引脚才能达到我们的目的。既然如此我们就必须要配置使能合适的引脚。还有一点就是前面我们选择的是TIM4来作为PWM信号源,也就是使用TIM4的复用功能,查阅官方资料,我们不难了解TIM4的复用功能被映射到了GPIOB(也就是PB),然后我们继续查看TIM4的重映射表,选择我们所想要的IO口,这里我们选择PB8,那么我们同时就知道了相应的TIM4需要使用的相应通道为TIM4_CH3(通道三),TIM4_REMAP 需要设置为0。

 

 

 

        以上的描述具体到代码上,我们还需要定义TIM_OCInit_Structure类型的数据来配置TIM4的PWM的具体参数,以及使用TIM_OC3Init()来完成TIM4的PWM的初始配置。当然也不能忘记定义GPIO_InitTypeDef类型的数据和使用GPIO_Init()来配置相应的IO口。

 

 

 

        最后总结出我们在代码层所需要做的事情如下:

 

 

 

    1、定义GPIO_InitTypeDef类型、TIM_TimeBaseInitTypeDef类型、TIM_OCInitTypeDef的数据,并进行设置具体参数。

 

 

 

    2、RCC_APB1PeriphClockCmd()和CC_APB2PeriphClockCmd()使能IO口和定时器

 

 

 

    3、调用GPIO_Init()、TIM_TimeBaseInit()、TIM_OC3Init()将我们在前面所设置的数据写入真实的内部寄存器。

 

 

 

    4、调用TIM_OC3PreloadConfig()来配置TIM4的输出通道为通道三。

 

 

 

    5、最后调用TIM_Cmd()来开启我们的定时器。

 

 

 

 

 

 

        那么通过以上的步骤我们就能完成相应的基本配置,使得PB8能够输出TIM4产生一个固定占空比的脉冲信号。

 

 

 

        要实现产生占空比可调的信号,我们可以将以上的操作进行封装,封装成一个函数:void Timer4_Init(u16 Period)。Period作为外部参数传入,然后内部设置TIM4的TIM_Period 时,通“TIM_TimeBaseInit_Structure.TIM_Period= Period;”的方式进行。那么我们只需要在合适的时候调用这个函数,并传入需要的合适值,便能够达到我们所想要的效果了。

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,我可以为你提供一些关于 STM32F103 的 TIM1 PWM 相关的信息。 首先,TIM1 是 STM32F103 的一个高级定时器,它支持多种定时和计数模式。其中,PWM 模式可以通过调节占空比来产生 PWM 波形信号。 以下是使用 STM32CubeMX 配置 TIM1 PWM 的步骤: 1. 打开 STM32CubeMX,选择 STM32F103 的对应型号。 2. 在 Pinout & Configuration 标签页中,选择需要使用的 TIM1 通道对应的引脚。 3. 在 Configuration 标签页中,选择 TIM1,然后将 Mode 设为 PWM Generation CHx。 4. 根据需要设置 PWM 的频率和占空比等参数。 5. 生成代码并导入到 Keil 或者其他编译器中,编写代码控制 TIM1 的 PWM 输出即可。 这里提供一份使用 HAL 库的示例代码,可以在 main 函数中调用 TIM1_PWM_Init() 函数初始化 TIM1,并在 while 循环中调用 TIM1_PWM_Set_Duty() 函数设置 PWM占空比: ```c #include "stm32f1xx_hal.h" TIM_HandleTypeDef htim1; void TIM1_PWM_Init(void) { TIM_OC_InitTypeDef sConfigOC; htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 999; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim1); sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); } void TIM1_PWM_Set_Duty(uint16_t duty) { TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = duty; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); } int main(void) { HAL_Init(); TIM1_PWM_Init(); while (1) { TIM1_PWM_Set_Duty(250); HAL_Delay(1000); TIM1_PWM_Set_Duty(750); HAL_Delay(1000); } } ``` 上述代码中,TIM1_PWM_Init() 函数用于初始化 TIM1 的 PWM 输出,TIM1_PWM_Set_Duty() 函数用于设置 PWM占空比。 在主函数中,我们调用 TIM1_PWM_Init() 函数初始化 TIM1,然后在 while 循环中反复调用 TIM1_PWM_Set_Duty() 函数,以产生不同占空比PWM 波形信号。具体来说,我们设置占空比为 25% 和 75%,并且每次设置后都延迟 1 秒钟,以便观察 PWM 波形的变化。 希望这些信息对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值