使用STM32的TIM3模块实现不同占空比的PWM波形

目录

硬件准备

PWM介绍

产生PWM方法

 TIM3模块介绍

 代码部分

详细步骤

总结


硬件准备

首先,需要准备一块带有STM32芯片的开发板,例如STM32F103C8T6或STM32F407VET6。连接开发板到电脑上,并使用Keil,IAR等软件进行编程。本文章用的是Keil软件。

PWM介绍

PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量。

基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等但宽度不一致的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,既可改变逆变电路输出电压的大小,也可改变输出频率 。

产生PWM方法

有以下几种方法可以产生PWM信号:

1. 模拟方式:使用比较器、多谐振荡器等电路来实现PWM,输出的信号是一个脉冲宽度可变的模拟信号。

2. 软件方式:使用单片机来编写PWM输出程序,通过改变占空比来改变脉冲宽度,输出的信号是数字信号。

3. 硬件方式:使用专用的PWM控制芯片,如NE555、NE556、TL494等,这些芯片内置了比较器和多谐振荡器电路,可以通过调节管脚的电平和电容电阻来产生PWM信号。

4. 混合方式:使用单片机和PWM控制芯片的组合方式,通过软件控制硬件的方式来产生PWM信号。

如下图是用计数器,定时自增,设置一个比较值:

 

 TIM3模块介绍

定时器基础:在STM32芯片中,定时器是一种非常有用的工具,它可以用于生成各种脉冲、测量时间间隔等。对于PWM输出而言,我们通常使用定时器的输出比较功能。一个定时器通常有两个或四个通道,每个通道都可以独立地产生PWM波。在PWM波形中,高电平时间占整个周期的比例被称为占空比。

TIM3(Timer3)模块是STM32微控制器中的计时器模块之一。它是一个通用定时器,可以用于测量时间、控制PWM信号、产生周期信号等应用。TIM3模块具有以下特性:

1. 支持多种工作模式,包括定时器模式、PWM输入模式和PWM输出模式。

2. 可以配置为16位或32位定时器。

3. 支持输出比较和输入捕获功能。

4. 可以配置为单脉冲模式,可以在输入捕获时自动停止计数器。

5. 具有多种时钟源,包括内部时钟、外部时钟和自动重载计数器。

6. 支持中断,可以在计数器到达指定值时触发中断。

7. 可以通过DMA控制来进行数据传输。

TIM3模块广泛应用于各种嵌入式应用中,如控制电机、测量时间、产生PWM信号等。

 代码部分

下面是使用STM32的TIM3模块和Keil软件实现不同占空比波形的步骤:

  1. 首先,需要在Keil软件中创建一个新的工程,并选择适合的STM32芯片型号。在这个例子中,我们使用STM32F103C8T6芯片。

  2. 在工程中添加STM32的库文件和头文件。在Keil软件中,可以通过Project->Manage->Pack Installer来下载和添加相关库文件。

  3. 接下来,需要配置TIM3模块的工作模式和时钟频率。在代码中,可以使用以下语句来进行配置:

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    TIM_TimeBaseInitTypeDef TIM_InitStruct;
    TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_InitStruct.TIM_Period = 1000 - 1; // 1 kHz PWM frequency
    TIM_InitStruct.TIM_Prescaler = 72 - 1; // 72 MHz / 72 = 1 MHz (1 us)
    TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
    

    4.接下来,需要配置TIM3的输出模式和输出通道。在代码中,可以使用以下语句来进行配置:

    TIM_OCInitTypeDef TIM_OCInitStruct;
    TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStruct.TIM_Pulse = 500 - 1; // 50% duty cycle
    TIM_OC1Init(TIM3, &TIM_OCInitStruct);
    

 可以通过修改定时器TIM3的CCR2_Val寄存器的值,可以改变PWM的占空比。

int main(void)
{ 	
	unsigned char a=0;
	TIM_OCInitTypeDef  TIM3_OCInitStructure;
  	RCC_Configuration();  
  	time_ini();		      
    SysTick_Config(72000);	   //配置SYSTICK时钟节拍为1ms一次
  	while(1){
  		Delay(1);		  //延时1ms	   	
		TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 					  //PWM模式2 
  		TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 		  //输出禁止        
  		TIM3_OCInitStructure.TIM_Pulse = CCR2_Val; 							  //确定占空比
  		TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
  		TIM_OC2Init(TIM3, &TIM3_OCInitStructure);

  		/*调整CCR2_Val的值来改变占空比,逐步的控制LED1的亮度, 占空比大过一定值时,
		亮度的变化就不明显了,所以CCR2_VAL最大设定到17000*/
		if(a==0) CCR2_Val=CCR2_Val+10;										 
		else CCR2_Val=CCR2_Val-10;
		if(CCR2_Val>17000){ CCR2_Val=17000; a=1;} 							  
		else if(CCR2_Val<200){ CCR2_Val=200; a=0;} 
  	}
}

最后,我们需要在代码中设置不同的占空比来生成不同的PWM波形。在代码中,可以使用以下语句来修改占空比:

TIM3_OCInitStructure.TIM_Pulse = 14600;

详细步骤

要在STM32上实现不同占空比的PWM波形,需要使用STM32的TIM3定时器,并按照以下步骤进行配置:

  1. 使能TIM3时钟,并选择预分频器的值。预分频器值越小,时钟频率越高,但计数器周期越短。

  2. 配置TIM3的计数模式和计数方向。可以选择向上计数、向下计数或者向上/向下计数。

  3. 配置TIM3的自动重载寄存器(ARR),以设置计数器的最大值。

  4. 配置TIM3的PWM模式和输出通道。可以选择不同的PWM模式(例如,正常PWM、反相PWM或中心对齐PWM)和输出通道(例如,CH1、CH2、CH3和CH4)。

  5. 配置TIM3的比较寄存器(CCR),以设置输出占空比。CCR的值越大,输出的占空比越高。

总结

STM32是一款非常有用的开发板,学习过程需要逐步掌握基本知识和技能,并进行实践项目。本文章主要介绍STM32-TIM3-PWM是一种利用STM32芯片的定时器3实现PWM波形输出的方法。在实现不同占空比的PWM波形时,可以通过改变TIM3的ARR和CCR寄存器的值来实现。

物联网应用技术2班莫丽婷

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32的TIM3模块实现不同占空比的PWM波形

发表评论