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); //修改比较值,修改占空比
}
}