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;”的方式进行。那么我们只需要在合适的时候调用这个函数,并传入需要的合适值,便能够达到我们所想要的效果了。

 

 

 

 

 

 

 

 

输出PWM信号,需要使用STM32F103的定时器模块。以下是一个简单的示例程序,演示如何使用STM32F103的定时器3来产生PWM信号: ```c #include "stm32f10x.h" void PWM_Init(void); int main(void) { PWM_Init(); while(1) { // 在这里可以改变占空比控制PWM信号输出 TIM3->CCR1 = 500; } } void PWM_Init(void) { // 使能TIM3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 配置TIM3的GPIO管脚为PWM输出 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); // 配置TIM3为PWM模式 TIM_TimeBaseInitTypeDef TIM_InitStruct; TIM_InitStruct.TIM_Period = 999; // PWM信号的周期为1000个计数器时钟周期 TIM_InitStruct.TIM_Prescaler = 71; // 时钟预分频为72 TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_InitStruct); // 配置TIM3的通道1为PWM模式 TIM_OCInitTypeDef TIM_OCInitStruct; TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = 500; // PWM信号占空比为50% TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStruct); // 使能TIM3的计数器 TIM_Cmd(TIM3, ENABLE); } ``` 这个程序使用了定时器3,将其配置为PWM模式,并将GPIOA的第6个引脚配置为定时器3通道1的PWM输出。在主函数中,可以通过改变TIM3->CCR1寄存器的值来改变PWM信号占空比。你可以根据自己的实际需求进行修改。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值