stm32 TIM1的CH1N~CH3N、CH1~CH4基本配置

TIM1的CH1、CH1N、CH2、CH2N、CH3、CH3N、CH4基本配置输出PWM

tim.h

#ifndef __TIM_H
#define __TIM_H
#include "stm32f4xx_hal.h"
#include "led.h"  
#include "sys.h" 
/*
*
*TIM1
*
*/
extern u8 TIM1_flag1;		//定时器标志位
void TIM1_Init(u16 arr,u16 psc);
void TIM1_PWM_Init(u16 arr,u16 psc);	 //TIM? PWM部分初始化 
void TIM_SetTIM1Compare1(u32 compare); //设置TIM?通道?的占空比
void TIM_SetTIM1Compare2(u32 compare); //设置TIM?通道?的占空比
void TIM_SetTIM1Compare3(u32 compare); //设置TIM?通道?的占空比
void TIM_SetTIM1Compare4(u32 compare); //设置TIM?通道?的占空比
void TIM_SetTIM1Compare1N(u32 compare);//设置TIM?通道?的占空比
void TIM_SetTIM1Compare2N(u32 compare);//设置TIM?通道?的占空比
void TIM_SetTIM1Compare3N(u32 compare);//设置TIM?通道?的占空比
#endif 


tim.c

/***************************************************************
*
*
*TIM1
*
*
****************************************************************/
void TIM1_Init(u16 arr,u16 psc)
{  
	TIM1_Handler.Instance=TIM1;                         
	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_Base_Init(&TIM1_Handler);
	
	HAL_TIM_Base_Start_IT(&TIM1_Handler); //使能定时器和定时器更新中断
}
//PWM部分初始化  
void TIM1_PWM_Init(u16 arr,u16 psc)
{ 
	TIM1_Handler.Instance=TIM1;           
	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_CH_Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
	TIM1_CH_Handler.Pulse=arr/2;            //设置比较值,此值用来确定占空比,
                                          //默认比较值为自动重装载值的一半,即占空比为50%
    TIM1_CH_Handler.OCPolarity=TIM_OCPOLARITY_LOW; //输出比较极性为低 
    HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH_Handler,TIM_CHANNEL_1);//配置TIM?通道? 
	HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH_Handler,TIM_CHANNEL_2);//配置TIM?通道?
	HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH_Handler,TIM_CHANNEL_3);//配置TIM?通道?
	HAL_TIM_PWM_ConfigChannel(&TIM1_Handler,&TIM1_CH_Handler,TIM_CHANNEL_4);//配置TIM?通道?
	HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_1);//开启PWM?通道CH1	
	HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_2);//开启PWM?通道CH2
	HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_3);//开启PWM?通道CH3
	HAL_TIM_PWM_Start(&TIM1_Handler,TIM_CHANNEL_4);//开启PWM?通道CH4
	HAL_TIMEx_PWMN_Start(&TIM1_Handler, TIM_CHANNEL_1); //开启PWM?通道CH1N
    HAL_TIMEx_PWMN_Start(&TIM1_Handler, TIM_CHANNEL_2); //开启PWM?通道CH2N
	HAL_TIMEx_PWMN_Start(&TIM1_Handler, TIM_CHANNEL_3); //开启PWM?通道CH3N
}
//设置TIM?通道?的占空比
void TIM_SetTIM1Compare1(u32 compare)
{
	TIM1->CCR1=compare; //compare:比较值
}
void TIM_SetTIM1Compare2(u32 compare)
{
	TIM1->CCR2=compare; //compare:比较值
}
void TIM_SetTIM1Compare3(u32 compare)
{
	TIM1->CCR3=compare; //compare:比较值
}
void TIM_SetTIM1Compare4(u32 compare)
{
	TIM1->CCR4=compare; //compare:比较值
}
void TIM_SetTIM1Compare1N(u32 compare)
{
	TIM1->CCR1=compare; //compare:比较值
}
void TIM_SetTIM1Compare2N(u32 compare)
{
	TIM1->CCR2=compare; //compare:比较值
}
void TIM_SetTIM1Compare3N(u32 compare)
{
	TIM1->CCR3=compare; //compare:比较值
}
//定时器中断服务函数
void TIM1_CC_IRQHandler(void)
{
   HAL_TIM_IRQHandler(&TIM1_Handler);
}

tim_STEPMOTOR.h

#ifndef __TIM_STEPMOTOR_H
#define __TIM_STEPMOTOR_H
#include "tim.h"
	
#endif 

tim_STEPMOTOR.c


/***************************************************************
*
*
*定时器底层驱动,时钟使能,引脚配置
*此函数会被HAL_TIM_PWM_Init()调用
*htim:定时器句柄
****************************************************************/
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
	GPIO_InitTypeDef GPIO_Initure;
	__HAL_RCC_TIM1_CLK_ENABLE();			//使能定时器
	
	__HAL_RCC_GPIOA_CLK_ENABLE();			//开启GPIO时钟
	__HAL_RCC_GPIOB_CLK_ENABLE();			//开启GPIO时钟

    //TIM1
	GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11;   
	GPIO_Initure.Mode=GPIO_MODE_AF_PP;  		//复用推完输出
	GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
	GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
	GPIO_Initure.Alternate=GPIO_AF1_TIM1;		
	HAL_GPIO_Init(GPIOA,&GPIO_Initure);
	
	GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_13;   
	GPIO_Initure.Mode=GPIO_MODE_AF_PP;  		//复用推完输出
	GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
	GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //高速
	GPIO_Initure.Alternate=GPIO_AF1_TIM1;		
	HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}

main.c

#include "main.h"
#include "delay.h"
#include "tim.h"

/***************************************************************************************************
*	函 数 名: main
*	入口参数: 无
*	返 回 值: 无
*	函数功能: 
*	说    明: 无
****************************************************************************************************/

int main(void)
{
    u8 dir=1;
	u16 led0pwmval=0;

    //200M/200=1M的计数频率,自动重装载为500,那么PWM频率为1M/500=2kHZ
	TIM1_PWM_Init(500-1,200-1); 

    while (1)
	{
		delay_ms(10);	
		if(dir)led0pwmval++;			    //dir==1 led0pwmval递增
		else led0pwmval--;				    //dir==0 led0pwmval递减 
		if(led0pwmval>300)dir=0;			//led0pwmval到达300后,方向为递减
		if(led0pwmval==0)dir=1;			    //led0pwmval递减到0后,方向改为递增
		TIM_SetTIM1Compare1(led0pwmval);	//修改比较值,修改占空比
		TIM_SetTIM1Compare2(led0pwmval);	//修改比较值,修改占空比
		TIM_SetTIM1Compare3(led0pwmval);	//修改比较值,修改占空比
		TIM_SetTIM1Compare4(led0pwmval);	//修改比较值,修改占空比
		TIM_SetTIM1Compare1N(led0pwmval);	//修改比较值,修改占空比
		TIM_SetTIM1Compare2N(led0pwmval);	//修改比较值,修改占空比
		TIM_SetTIM1Compare3N(led0pwmval);	//修改比较值,修改占空比
	}
}

猜你喜欢

转载自blog.csdn.net/qq_35831134/article/details/110932411