基于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波。

使用STM32F103C8T6TIM1定时器生成互补PWM通常涉及以下几个步骤: 1. **初始化TIM1**: - 首先需要配置TIM1作为通用定时器,并将其设置为PWM模式。这包括设置时钟源、工作模式(例如PWM模式下通常是PWM1 mode 1),以及预分频器值。 ```c TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure.TIM_Prescaler = RCC_APB2_TIM1PrescalerDiv2; TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure.TIM_Period = 499; // 500Hz PWM (假设系统时钟是16MHz) TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseInitTypeDef.TIM_TimeBaseStructure.TIM_CounterMode = TIM_COUNTERMODE_UP; HAL_TIM_TimeBaseInit(&htim1, &TIM_TimeBaseStructure); ``` 2. **配置通道**: - 设置TIM1的输出通道(例如Channel 1 for PWM1),启用输出并选择互补输出(通常通过设置EXTI线作为互补信号) ```c TIM_OCInitTypeDef sConfigOC; sConfigOC.TIM_OCMode = TIM_OCMode_PWM1; // 输出模式为PWM1 sConfigOC.TIM_OutputState = TIM_OutputState_Enable; // 启动输出 sConfigOC.TIM_Pin = GPIO_PIN_15; // 对于 TIM1 Channel 1, 这是GPIOB的PB15 sConfigOC.TIM_Speed = 0; // 如果不需要改变占空比速度,则设为0 sConfigOC.TIM_Pulse = 0; HAL_TIM_OCInit(&htim1, &sConfigOC); HAL_TIM_OC2Cmd(&htim1, ENABLE); // 开启互补输出 ``` 3. **设置周期和占空比**: - 可能还需要动态调整周期和占空比,可以使用`HAL_TIM_SetCounter()`和`HAL_TIM_OC_ConfigPulse()`函数。 4. **启动TIM1**: - 最后,调用`HAL_TIM_Start(&htim1)`开始计时器,定时器就会按照配置生成PWM。 ```c HAL_TIM_Start(&htim1); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值