【STM32】PWM多通道输出

目标:

1- 把PWM信号的频率改成100KHZ
2- 使用高级定时器1输出4路占空比相同的PWM信号

编程要点:

1.定时器用到的GPIO初始化
2.定时器时基结构体f初始化
3.定时器输出比较结构体初始化

宏定义:

#ifndef _LL_TIM_H
#define _LL_TIM_H

#include "stm32f10x.h"
// 这里我们使用高级控制定时器TIM1

#define            TIM_arr            (10-1)
#define            TIM_psc            (72-1)
#define            TIM_ccr1             5

void TIM1_Init(void);

#endif	

GPIO初始化:


static void TIM1_GPIO_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形	GPIOA.8
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 		//TIM1_CH1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  	//复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//设置该引脚为复用输出功能,输出TIM1 CH2的PWM脉冲波形	GPIOA.9
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 		//TIM1_CH2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  	//复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//设置该引脚为复用输出功能,输出TIM1 CH3的PWM脉冲波形	GPIOA.10
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 		//TIM1_CH3
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  	//复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//设置该引脚为复用输出功能,输出TIM1 CH4的PWM脉冲波形	GPIOA.11
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 		//TIM1_CH4
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  	//复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
}

定时器模式配置:

// PWM 信号的频率F = TIM_CLK/{(ARR+1) *(PSC+1)}
// TIM_CLK等于72MHz
// ARR :自动重装载寄存器的值,对应TIM_arr这个宏
// PSC :计数器时钟的分频因子,对应TIM_psc这个宏
// 占空比Duty=CCR/(ARR+1),CCR对应TIM_ccr1这个宏,该测试程序中占空比{ 5/(10-1)}为50%

static void TIM1_Model_Config(void)
{
	// 开启定时器时钟,即内部时钟CK_INT=72M
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
	 
	 /*--------------------时基结构体初始化-------------------------*/
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	// 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
	TIM_TimeBaseStructure.TIM_Period=TIM_arr;	
	TIM_TimeBaseStructure.TIM_Prescaler= TIM_psc;	// 驱动CNT计数器的时钟 = Fck_int/(psc+1)
	// 时钟分频因子 ,配置死区时间时需要用到
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;	//不分频	
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;// 计数器计数模式,设置为向上计数	
	// 重复计数器的值,没用到不用管
	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;	
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);// 初始化定时器

	
	/*-------------------------输出比较结构体初始化---------------------------------*/
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 配置为PWM模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;// 输出通道电平极性配置
	
	
	TIM_OCInitStructure.TIM_Pulse = TIM_ccr1;// 设置占空比大小
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能TIM1在CCR1上的预装载寄存器
	
	//ch2 PWM模式
	TIM_OCInitStructure.TIM_Pulse = TIM_ccr1;// 设置占空比大小
	TIM_OC2Init(TIM1, &TIM_OCInitStructure);
	TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能TIM1在CCR1上的预装载寄存器
	
	//ch3 PWM模式
TIM_OCInitStructure.TIM_Pulse = TIM_ccr1;// 设置占空比大小
	TIM_OC3Init(TIM1, &TIM_OCInitStructure);
	TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能TIM1在CCR1上的预装载寄存器
	
	//ch4 PWM模式
	TIM_OCInitStructure.TIM_Pulse = TIM_ccr1;// 设置占空比大小
	TIM_OC4Init(TIM1, &TIM_OCInitStructure);
	TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能TIM1在CCR1上的预装载寄存器
	
	TIM_Cmd(TIM1, ENABLE);	// 使能计数器
	TIM_CtrlPWMOutputs(TIM1, ENABLE);// 主输出使能,当使用的是通用定时器时,这句不需要

}
void TIM1_Init(void)
{
	TIM1_GPIO_Config();
	TIM1_Model_Config();

}

主函数:

int main(void)
{	
  /* 高级定时器初始化 */
	TIM1_Init();
	
  while(1)
	{	
		
	}	
}

下载验证程序中4个通道的占空比设置均为50%

需要注意的地方

// * 【注意】:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有
// * TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,
// * 另外三个成员是通用定时器和高级定时器才有.
// *-----------------------------------------------------------------------------
// *typedef struct
// *{ TIM_Prescaler --------------------------都有
// * TIM_CounterMode ----------------------TIMx,x[6,7]没有,其他都有
// * TIM_Period---------------------------------都有
// * TIM_ClockDivision -----------------------TIMx,x[6,7]没有,其他都有
// * TIM_RepetitionCounter------------------TIMx,x[1,8,15,16,17]才有
// *}TIM_TimeBaseInitTypeDef;
// -----------------------------------------------------------------------------
// /
/**-----------------------------------------------------------------------------------------------
/
/
注意】TIM_CtrlPWMOutputs(TIM1, ENABLE); // 主输出使能,当使用的是通用定时器时,这句不需要
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重复计数器,高级控制定时器特有
*/
// * 【注意】:高级控制定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车(断路)功能,主要针对工业电机控制方面,通过设置死区时间(由MOS管工艺确定)防止电路短路;

	/*-------------------刹车和死区结构体初始化-------------------*/
	TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
	// 这里配置的死区时间为152ns
  TIM_BDTRInitStructure.TIM_DeadTime = 11;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
	// 当BKIN引脚检测到高电平的时候,输出比较信号被禁止,就好像是刹车一样
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);

注意】定时器输出频率和占空比问题
1.系统频率(TIM_CLK)设置为72MHz时,F = TIM_CLK/{(ARR+1) *(PSC+1)}
//(为什么要加1,是因为是从0开始计数)
//ARR:0~65535
//PSC:1~65536
2.占空比由CCR和ARR决定 Duty=CCR/(ARR+1)

### 回答1: STM32PWM模块可以配置多通道,以实现多路PWM输出。 在STM32中,有三个定时器(TIM1、TIM2和TIM3)和三个高级定时器(TIM8、TIM9和TIM10)可以用于PWM输出。每个定时器都有多个通道,可以分别配置不同的PWM输出。 要配置多通道PWM,首先需要初始化定时器,包括选择定时器的时钟源、预分频值、计数器模式等。然后,根据需要选择要使用的通道数量,配置每个通道的PWM频率和占空比。可以选择不同的PWM模式,如边沿对齐模式、中央对齐模式等。 在配置PWM时,可以使用PWM的模式选择寄存器(PWM Mode Selection Register)来选择PWM的模式。还可以使用PWM通道模式选择寄存器(PWM Channel Mode Selection Register)来选择每个通道的工作模式,包括输出使能、PWM极性等。 配置完成后,可以启动定时器开始PWM输出。可以通过设置和清除相应的位来使能和禁用每个通道的PWM输出,以及调整每个通道的占空比。 通过配置多通道PWM,可以实现多路PWM输出,满足不同的应用需求,如驱动多路电机、控制多个LED等。 ### 回答2: STM32是一种常用的微控制器,具有强大的功能和灵活的配置选项。其中,PWM(脉宽调制)是一种常见的输出信号类型,可用于驱动电机、LED灯等设备。 在STM32中,可以很容易地配置多通道PWM输出。首先,需要选择并配置合适的定时器。STM32微控制器通常有多个定时器可供选择,每个定时器通常都有多个通道。 在初始化定时器时,需设置相关的时钟输入、分频系数、周期值和分辨率等参数。还要选择PWM模式,以及启用或禁用定时器的自动重装载功能。此外,还可以设置比较输出模式和电平极性等。 在初始化完定时器后,就可以配置每个通道的输出参数了。可以设置通道的输出比较值和极性,以及输出引脚的映射。通常,PWM输出引脚可以直接与外部设备连接,例如电机驱动器或LED。 在编写代码时,可以选择使用STM32提供的库函数或寄存器级编程来配置PWM输出通道。库函数提供了更高级别的抽象和易用性,而寄存器级编程可以获得更好的性能和灵活性。 总结而言,配置多通道PWM输出通常需要选择适合的定时器,并在初始化时设置参数。然后,根据需要配置每个通道的输出参数,最后使用库函数或寄存器级编程来完成配置。这样,我们就能够在STM32上灵活地实现多通道PWM输出。 ### 回答3: 在STM32微控制器中,PWM(脉冲宽度调制)是一种用于控制电机、LED灯、舵机和其他电子元件的信号输出方式。STM32提供了丰富的PWM资源,允许我们配置多个通道。 首先,我们需要选择一个适合的定时器作为PWM的时基。STM32提供了有多个定时器,如TIM1、TIM2等。选择定时器时,要考虑所需的PWM精度和频率。比如,如果需要高精度和高频率的PWM,可以选择TIM1。 接下来,我们需要设置PWM的周期。周期是指PWM信号从一个脉冲开始到下一个脉冲开始的时间间隔。通过设置定时器的预分频器值和重载寄存器的值,可以确定PWM的周期。例如,如果我们设置预分频器为48000,重载寄存器为999,那么PWM的周期将为1秒(48000/48000000=1)。 然后,我们需要配置每个通道的占空比。占空比是指PWM信号中高电平信号持续的时间比例。在STM32中,可以通过设置定时器的比较寄存器的值来控制每个通道的占空比。比如,如果我们将比较寄存器的值设置为499,那么占空比将为50%(499/999=0.5)。 最后,我们需要使能PWM输出。通过设置定时器的CR1寄存器中的位来使能定时器和PWM输出。同时,还需要配置GPIO引脚的模式和输出类型,使其能够输出PWM信号。 总结起来,配置STM32PWM多通道需要选择适合的定时器,设置周期和占空比,并使能PWM输出。这样就可以实现多个通道的PWM控制。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值