STM32高级定时器互补输出,HAL库版

按照原子哥的HAL库版程序学习定时器PWM输出,使用STM32F429。里面定时器PWM输出程序使用的PB1引脚,使用定时器3的4通道,即TIM3_CH4。查看原理图时发现PB1也是TIM1_CH3N引脚,所以想试试TIM1_CH3N输出,直接把原来程序里的都换成TIM1_CH3最后没有输出PWM,上网一查发现TIM1是高级定时器,具有互补输出功能,TIM1_CH3N是TIM1_CH3的互补输出通道。因此设置会稍微复杂一点,但上网查了半天没有发现HAL库写的互补输出PWM程序,自己看了半天数据手册,又对比了没有互补输出的程序,终于实现了互补输出,现在记录在这里。

 首先,这是原子哥原来初始化TIM3_CH4的程序:


TIM_HandleTypeDef TIM3_Handler;         //定时器3PWM句柄 
TIM_OC_InitTypeDef TIM3_CH4Handler;	    //定时器3通道4句柄

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{ 
    TIM3_Handler.Instance=TIM3;            //定时器3
    TIM3_Handler.Init.Prescaler=psc;       //定时器分频
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM3_Handler.Init.Period=arr;          //自动重装载值
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&TIM3_Handler);       //初始化PWM
    
    TIM3_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM3_CH4Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
    TIM3_CH4Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
    HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);//配置TIM3通道4
	
    HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4);//开启PWM通道4
}


//定时器底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_Initure;
	__HAL_RCC_TIM3_CLK_ENABLE();			//使能定时器3
    __HAL_RCC_GPIOB_CLK_ENABLE();			//开启GPIOB时钟
	
    GPIO_Initure.Pin=GPIO_PIN_1;           	//PB1
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;  	//复用推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
	GPIO_Initure.Alternate= GPIO_AF2_TIM3;	//PB1复用为TIM3_CH4
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}


//设置TIM通道4的占空比
//compare:比较值
void TIM_SetTIM3Compare4(u32 compare)
{
	TIM3->CCR4=compare; 
}

这是我修改后TIM1_CH3N初始化的程序:


TIM_HandleTypeDef TIM1_Handler;         //定时器1PWM句柄 
TIM_OC_InitTypeDef TIM1_CH3Handler;	    //定时器1通道3句柄

//TIM3 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{ 
    TIM1_Handler.Instance=TIM1;            //定时器1
    TIM1_Handler.Init.Prescaler=psc;       //定时器分频
    TIM1_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
    TIM1_Handler.Init.Period=arr;          //自动重装载值
    TIM1_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(&TIM1_Handler);       //初始化PWM
    
    TIM1_CH3Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
    TIM1_CH3Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
    TIM1_CH3Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
	TIM1_CH3Handler.OCNPolarity=TIM_OCNPOLARITY_HIGH;	//互补输出极性为高,无互补时不需要!!!
    HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH3Handler,TIM_CHANNEL_3);//配置TIM1通道3
	
    HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_3);//开启PWM通道3
	HAL_TIMEx_PWMN_Start(&TIM1_Handler,TIM_CHANNEL_3);//开启PWM通道3互补输出,无互补时不需要!!!
}


//定时器底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
    GPIO_InitTypeDef GPIO_Initure;
	__HAL_RCC_TIM1_CLK_ENABLE();			//使能定时器1
    __HAL_RCC_GPIOB_CLK_ENABLE();			//开启GPIOB时钟
	
    GPIO_Initure.Pin=GPIO_PIN_1;           	//PB1
    GPIO_Initure.Mode=GPIO_MODE_AF_PP;  	//复用推挽输出
    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速
	GPIO_Initure.Alternate= GPIO_AF1_TIM1;	//PB1复用为TIM3_CH3
    HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}


//设置TIM通道3的占空比
//compare:比较值
void TIM_SetTIM1Compare3(u32 compare)
{
	TIM1->CCR3=compare; 
}

现在对区别进行说明:

1. 对底层时钟使能的修改,即void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)这个函数, 这个很容易

2. 定时器PWM的初始化函数修改,即void TIM1_PWM_Init(u16 arr,u16 psc),依次修改定时器号和通道也很容易,关键是在使用互补定时器后需要指定互补通道的极性,以及将互补通道PWM输出使能。即在程序中备注了无互补时不需要的两句话。

这样便实现了TIM1_CH3和TIM1_CH3N互补PWM输出,但是互补输出时还有死区的设置等问题,目前这里没有考虑,在H桥控制中需要考虑死区,以后用到时我会再补充进来的,如果有谁已经编好了有死区的程序,也欢迎评论补充。

另:这里有一个寄存器写的互补输出,可以参考:http://www.openedv.com/forum.php?mod=viewthread&tid=62861&highlight=%BB%A5%B2%B9%CA%E4%B3%F6

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值