#include "HAL_gpio.h"
#include "pwm.h"
///* ********************************************************************************************************
//* 函 数 名: void PWM_IoInit(void)
//* 功能说明: gate1,gate2和PWM管脚配置
//* 形 参:
//* 返 回 值:
//* 备 注:
//**********************************************************************************************************/
void PWM_IoInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB , ENABLE);
//Mod PA3 TIM2_CH4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//CLOCK PB9 TIM4_CH4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
///* ********************************************************************************************************
//* 函 数 名: Mod_PWMConfig
//* 功能说明: mod PWM输出配置
//* 形 参: mod_arr : 自动重装载值
//* mod_psc :预分频系数
//* 返 回 值:
//* 备 注:
//**********************************************************************************************************/
void Mod_PWMConfig(unsigned short mod_arr,unsigned short mod_psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = mod_arr;
TIM_TimeBaseStructure.TIM_Prescaler =mod_psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//比较输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_Pulse = 0;
//输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
//CH4预装载使能
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
//使能TIMx在ARR上的预装载寄存器
TIM_ARRPreloadConfig(TIM2, ENABLE);
//使能TIM2
TIM_Cmd(TIM2, ENABLE);
}
///* ********************************************************************************************************
//* 函 数 名: Clock_PWMConfig
//* 功能说明: mod PWM输出配置
//* 形 参: mod_arr : 自动重装载值
//* mod_psc :预分频系数
//* 返 回 值:
//* 备 注:
//**********************************************************************************************************/
void Clock_PWMConfig(unsigned short clock_arr,unsigned short clock_psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseStructure.TIM_Period = clock_psc;
TIM_TimeBaseStructure.TIM_Prescaler =clock_psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//比较输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_Pulse = 0;
//输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OC4Init(TIM4, &TIM_OCInitStructure);
//CH4预装载使能
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
//使能TIMx在ARR上的预装载寄存器
TIM_ARRPreloadConfig(TIM4, ENABLE);
//使能TIM4
TIM_Cmd(TIM4, ENABLE);
}
///* *****************************************************************************************************************
//* 函 数 名: PWM_OutPut
//* 功能说明: mod PWM输出配置
//* 形 参: mod_clock : 0 -> mod 1 -> clock
//* mc_psc :预分频系数
//* mc_fre : 频率,由此决定周期
//* mc_duty:占空比
//* 返 回 值:
//* 备 注:
//*****************************************************************************************************************/
void PWM_OutPut(unsigned char mod_clock,unsigned short mc_psc,unsigned short mc_fre,float mc_duty)
{
unsigned short PO_arr;
unsigned short OP_duty;
if(!mod_clock)
{
//确定自动重装载值
PO_arr = 72000000/((mc_psc-1)*mc_fre);
//重新设置自动重装载值
TIM_SetAutoreload(TIM2,PO_arr);
//确定比较值
OP_duty = PO_arr * mc_duty;
//设置比较值,用于确定占空比
TIM_SetCompare4(TIM2,OP_duty);
}
else
{
//确定自动重装载值
PO_arr = 72000000/((mc_psc-1)*mc_fre);
//重新设置自动重装载值
TIM_SetAutoreload(TIM4,PO_arr);
//确定比较值
OP_duty = PO_arr * mc_duty;
//设置比较值,用于确定占空比
TIM_SetCompare4(TIM4,OP_duty);
}
}
评论0