基于STM32F103C8T6——TIM3输出四路PWM波(直接用)

摘要

本篇博客将介绍如何利用STM32F103C8T6微控制器的定时器模块,实现输出四路PWM波的控制。PWM(脉冲宽度调制)是一种常用的数字信号调制技术,可用于控制电机速度、LED亮度等应用。通过本文的指导,读者可以学习如何配置STM32的定时器模块,设置PWM波的频率和占空比,从而实现多路PWM信号的输出。

引言

STM32F103C8T6是意法半导体推出的一款基于ARM Cortex-M3内核的低成本微控制器,具有丰富的外设资源,包括多个定时器模块,适合用于各种嵌入式应用。本文将以该型号的定时器模块为基础,演示如何配置和控制四路PWM信号的输出。

硬件准备

  • STM32F103C8T6开发板
  • USB转串口模块
  • 4个LED灯
  • 杜邦线

软件准备

  • STM32CubeMX
  • Keil MDK-ARM开发环境

步骤

1. 初始化工程

使用STM32CubeMX创建一个新工程,并选择对应的芯片型号(STM32F103C8T6)。在配置时钟、引脚等基本设置后,进入定时器配置界面。

2. 配置定时器
  • 选择一个可用的定时器(比如TIM1)。
  • 配置定时器的基本参数,如时钟源、计数频率等。
  • 设置定时器的工作模式为PWM Generation Mode。
  • 配置定时器的周期和占空比,以生成所需的PWM信号。
3. 配置输出通道
  • 选择定时器的输出通道(比如CH1、CH2、CH3、CH4)。
  • 配置通道的工作模式为PWM Mode 1。
  • 设置通道的占空比,以控制输出PWM信号的占空比。
4. 编写代码

PWM的C文件,这里void PWM_SetCompare(uint16_t Compare1,uint16_t Compare2,uint16_t Compare3,uint16_t Compare4),,控制的是占空比,但并不是只控制它就行了

这里可以看到我们只是控制变量保证  PSC  ARR固定有了频率就能算出周期,例如

我们想定时20ms    

CK_PSC=72MHz(不分频)=72000 000Hz   PSC=72-1     ARR=20000-1

那么频率就是50Hz周期就是20ms

本文是定时  1S

#include "stm32f10x.h"                  // Device header




void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
		
    GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	
    TIM_InternalClockConfig(TIM3);//连接内部时钟  打通第一个通道
	
	TIM_TimeBaseInitTypeDef Timebasestructer;
	Timebasestructer.TIM_ClockDivision=TIM_CKD_DIV1 ;    	// 时钟为72MHz   选择1  为部分频  即72 000 000 Hz
	Timebasestructer.TIM_CounterMode=TIM_CounterMode_Up; //  计数模式   为向上计数  即从0开始
	Timebasestructer.TIM_Period=10000 -1;                		//   ARR    自动重装值 当计数到达时  就触发中断
	Timebasestructer.TIM_Prescaler=7200 -1;             	 //   PSC     预分频     将72MHz 频率设置为10k Hz
	Timebasestructer.TIM_RepetitionCounter=0;            
	//该时基单元    一秒    发生一次中断
	TIM_TimeBaseInit(TIM3, &Timebasestructer);

	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//配置默认项
	
	TIM_OCInitStructure.TIM_OCMode      = TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OCPolarity  = TIM_OCPolarity_High;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
	
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);//开启四个PWM通道
	
    TIM_Cmd(TIM3, ENABLE);                  //打开TIIM3

}

void PWM_SetCompare(uint16_t Compare1,uint16_t Compare2,uint16_t Compare3,uint16_t Compare4)
{
	TIM_SetCompare1(TIM3, Compare1);
	TIM_SetCompare2(TIM3, Compare2);
	TIM_SetCompare3(TIM3, Compare3);
	TIM_SetCompare4(TIM3, Compare4);
}

 main函数

这里我们江占空比从0到100再从100到0

uint16_t  i=0;
uint16_t  j=0;
uint16_t  k=0;
uint16_t  w=0;
int main(void)
{

PWM_Init();	
	
	
	while (1)
	{
	for (i = 0,j=0,k=0,w=0; i <= 100; k++,j++,i++,w++)
		{
			PWM_SetCompare(i,j,k,w);
			Delay_ms(10);
		}
	for (i = 0,j=0,k=0,w=0; i <= 100; k++,j++,i++,w++)
		{
			PWM_SetCompare((100 - i),(100-j),(100-k),(100-w));
			Delay_ms(10);
		}		
	
				
	}
}

在Keil MDK-ARM开发环境中编写C代码,包括初始化定时器、配置输出通道、设置PWM参数等操作。通过代码控制定时器的启动和停止,以及PWM信号的输出。

5. 测试验证

将LED灯连接到对应的PWM输出引脚上,通过调节占空比和频率参数,验证PWM信号的输出效果。可以通过示波器或者逻辑分析仪来观察PWM波形。

结论

通过本文的介绍,读者可以了解如何使用STM32F103C8T6的定时器模块输出四路PWM信号。掌握PWM波的生成方法对于控制各种电路和设备具有重要意义,在实际应用中可以根据需求灵活调整PWM波的参数,实现精确的控制效果。

希望本文能够帮助读者更深入地了解STM32的定时器模块,并在嵌入式系统设计中发挥更大的作用。感谢您的阅读!


通过以上框架,您可以继续详细展开每个步骤的具体操作方法、代码实现和测试验证过程,使读者能够清晰地理解如何在STM32F103C8T6上实现输出四路PWM波。

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用STM32F103C8T6TIM3输出PWM,可以按照以下步骤进行设置: 1. 使能TIM3时钟 在使用TIM3之前,需要使能TIM3的时钟。可以通过RCC_AHBPeriphClockCmd和RCC_APB1PeriphClockCmd函数来使能TIM3所需的AHB和APB1总线时钟。例如: ``` RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); ``` 2. 配置TIM3定时器模式和PWM输出模式 TIM3可以用作定时器和PWM输出。在这里,我们需要将TIM3配置为PWM输出模式。我们可以使用TIM_OCInitTypeDef结构体来配置TIM3PWM输出模式。例如: ``` TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //设置PWM模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出 TIM_OCInitStructure.TIM_Pulse = 0; //设置占空比为0 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置输出极性为高电平 TIM_OC3Init(TIM3, &TIM_OCInitStructure); //配置TIM3通道3 ``` 3. 配置TIM3的时钟源和计数值 TIM3的时钟源可以是内部时钟(APB1时钟)或外部时钟。在这里,我们将使用内部时钟。我们可以使用TIM_TimeBaseInitTypeDef结构体来配置TIM3的时钟源和计数值。例如: ``` TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 1000; //设置计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler = 71; //设置预分频值,得到1us的计数单位 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3 ``` 4. 启动TIM3计数器 在完成上述配置后,可以启动TIM3计数器。例如: ``` TIM_Cmd(TIM3, ENABLE); ``` 5. 调整PWM占空比 在TIM3开始计数后,可以通过修改TIM3通道3的CCR寄存器来调整PWM的占空比。例如: ``` TIM3->CCR3 = 500; //设置占空比为50% ``` 通过以上步骤,就可以在STM32F103C8T6上使用TIM3输出PWM了。完整的代码示例如下: ``` #include "stm32f10x.h" int main(void) { // 使能TIM3时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 配置TIM3定时器模式和PWM输出模式 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //设置PWM模式 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出 TIM_OCInitStructure.TIM_Pulse = 0; //设置占空比为0 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //设置输出极性为高电平 TIM_OC3Init(TIM3, &TIM_OCInitStructure); //配置TIM3通道3 // 配置TIM3的时钟源和计数值 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 1000; //设置计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler = 71; //设置预分频值,得到1us的计数单位 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3 // 启动TIM3计数器 TIM_Cmd(TIM3, ENABLE); // 调整PWM占空比 TIM3->CCR3 = 500; //设置占空比为50% while(1) { } } ``` 注意:在使用TIM3作为PWM输出时,需要将对应引脚配置为复用推挽输出模式。例如,将PA7配置为TIM3通道2的PWM输出引脚,可以通过以下代码来实现: ``` GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值