//#include "pwm.h"
#ifndef __PWM_H
#define __PWM_H
#include "sys.h"
void TIM1_2PWM_Init(u16 t1pwm_f,u16 t1psc);
void TIM4_PWM_Init(u16 arr,u16 psc);
#endif
// TIM3_PWM_Init(pwm_f,0); //设置频率为50Hz,公式为:溢出时间Tout(单位秒)=(arr+1)(psc+1)/Tclk
//20MS = (59999+1)*(23+1)/72000000
//Tclk为通用定时器的时钟,如果APB1没有分频,则就为系统时钟,72MHZ
//PWM时钟频率=72000000/(59999+1)*(23+1) = 50HZ (20ms),设置自动装载值60000,预分频系数24
//TIM_SetCompare3(TIM3,550);改变比较值TIM3->CCR2达到调节占空比的效果
// TIM_SetCompare3(TIM3,171);
//#include "pwm.c"
#include "pwm.h"
#include "encoder.h"
void TIM1_2PWM_Init(u16 t1pwm_f,u16 t1psc)//boost电路输出互补PWM波形(PA8、PB13)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定时器初始化
TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;//定时器通道初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE); //使能PORTA,B时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
//初始化GPIO,PA8
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//端口复用
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //PA8
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;
GPIO_Init(GPIOB,&GPIO_InitStructure);//PB13
//初始化时具单元
TIM_DeInit(TIM1);
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);//用其默认值填充每个TIM_TimeBaseInitStruct成员
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//分频因子
//TIM_TimeBaseInitStruct.TIM_ClockDivision=0;
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitStruct.TIM_Period=t1pwm_f; //设置自动重装载值
TIM_TimeBaseInitStruct.TIM_Prescaler=t1psc; //预分频系数
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);//完成定时器初始化
//将输出通道2初始化为PWM模式1
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OutputNState=TIM_OutputNState_Enable;
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OCNPolarity=TIM_OCNPolarity_High;
TIM_OCInitStruct.TIM_OCIdleState=TIM_OCIdleState_Set;
TIM_OCInitStruct.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
TIM_OCInitStruct.TIM_Pulse=0;
TIM_OC1Init(TIM1,&TIM_OCInitStruct);// //定时器1 通道1初始化
TIM_OC3Init(TIM1,&TIM_OCInitStruct);// //定时器1 通道1初始化
//使能预装载寄存器
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);// //OC1预装载寄存器使能//CH1 TIM1
TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);// //OC1预装载寄存器使能//CH1 TIM1
//死区和刹车功能配置
TIM_BDTRInitStruct.TIM_OSSIState=TIM_OSSIState_Enable;//空闲模式下的关闭状态选择
TIM_BDTRInitStruct.TIM_OSSRState=TIM_OSSRState_Enable;//运行模式下的关闭状态选择
TIM_BDTRInitStruct.TIM_LOCKLevel=TIM_LOCKLevel_1;//锁存配置
TIM_BDTRInitStruct.TIM_DeadTime=20; //////死区时间
TIM_BDTRInitStruct.TIM_BreakPolarity=TIM_BreakPolarity_Low;//断路输入极性
TIM_BDTRInitStruct.TIM_Break=TIM_Break_Enable;//断路输入使能控制
TIM_BDTRInitStruct.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;//自动输出极性
TIM_BDTRConfig(TIM1,&TIM_BDTRInitStruct);
TIM_ARRPreloadConfig(TIM1,ENABLE); //允许或禁止在定时器工作时向ARR(自动重装载值)的缓冲器中写入新值,
//以便在更新事件发生时载入覆盖以前的值,此处为允许
TIM_CtrlPWMOutputs(TIM1,ENABLE);//高级定时器专属!!!--MOE主输出使能 //高级定时器TIM1:
//必须有这个函数才能输出PWM: TIM_CtrlPWMOutputs(TIM1,ENABL);
TIM_Cmd(TIM1,ENABLE);//定时器使能
}
void TIM3_PWM_Init(u16 arr,u16 psc)//TIM3 PWM初始化 arr重装载值 psc预分频系数
{
GPIO_InitTypeDef GPIO_InitStrue;
TIM_OCInitTypeDef TIM_OCInitStrue;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3和相关GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOB时钟(LED在PB0引脚)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟(定时器3通道3需要重映射到BP5引脚)
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; // TIM_CH3
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; // 复用推挽
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz; //设置最大输出速度
GPIO_Init(GPIOB,&GPIO_InitStrue); //GPIO端口初始化设置
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //映射,重映射只用于64、100、144脚单片机
//当没有重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PA6,PA7,PB0,PB1
//当部分重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PB4,PB5,PB0,PB1 (GPIO_PartialRemap_TIM3)
//当完全重映射时,TIM3的四个通道CH1,CH2,CH3,CH4分别对应PC6,PC7,PC8,PC9 (GPIO_FullRemap_TIM3)
TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动重装载值
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数器向上溢出
TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue); //TIM3初始化设置(设置PWM的周期)
TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1; // PWM模式1:CNT < CCR时输出有效电平
TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为:高电平
TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
TIM_OC3Init(TIM3,&TIM_OCInitStrue); //TIM3的通道3 PWM 模式设置
TIM_OC4Init(TIM3,&TIM_OCInitStrue); //TIM3的通道4 PWM 模式设置
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable); //使能预装载寄存器
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_Cmd(TIM3,ENABLE); //使能TIM3
// TIM3_PWM_Init(pwm_f,0); //设置频率为50Hz,公式为:溢出时间Tout(单位秒)=(arr+1)(psc+1)/Tclk
//20MS = (59999+1)*(23+1)/72000000
//Tclk为通用定时器的时钟,如果APB1没有分频,则就为系统时钟,72MHZ
//PWM时钟频率=72000000/(59999+1)*(23+1) = 50HZ (20ms),设置自动装载值60000,预分频系数24
//TIM_SetCompare3(TIM3,550);改变比较值TIM3->CCR2达到调节占空比的效果
// TIM_SetCompare3(TIM3,171);
}
void TIM4_PWM_Init(u16 arr,u16 psc)//TIM4 PWM初始化 arr重装载值 psc预分频系数
{
GPIO_InitTypeDef GPIO_InitStrue;
TIM_OCInitTypeDef TIM_OCInitStrue;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);////使能TIM4和相关GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);////使能GPIOB时钟(LED在PB0引脚)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO时钟(定时器3通道3需要重映射到BP5引脚)
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_8; ///// TIM_CH3 |GPIO_Pin_9;
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; // 复用推挽
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz; //设置最大输出速度
GPIO_Init(GPIOB,&GPIO_InitStrue); //GPIO端口初始化设置
TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动重装载值
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数器向上溢出
TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStrue); /////TIM4初始化设置(设置PWM的周期)
TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1; // PWM模式1:CNT < CCR时输出有效电平
TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为:高电平
TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
TIM_OC3Init(TIM4,&TIM_OCInitStrue); ////TIM4的通道3 PWM 模式设置
TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable); /////使能预装载寄存器
TIM_Cmd(TIM4,ENABLE); //使能TIM3
}
void TIM1_PWM_Init(u16 arr,u16 psc){ //TIM3 PWM初始化 arr重装载值 psc预分频系数
GPIO_InitTypeDef GPIO_InitStruct; //GPIO初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct; //定时器初始化
TIM_OCInitTypeDef TIM_OCInitStruct; //定时器通道初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1 | RCC_APB2Periph_AFIO,ENABLE);//开启时钟
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP; // 初始化GPIO--PA8、PA11为复用推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct); //GPIO初始化
TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct); //用其默认值填充每个TIM_TimeBaseInitStruct成员
TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //分频因子
TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStruct.TIM_Period=arr; //自动重装载值
TIM_TimeBaseInitStruct.TIM_Prescaler=psc; //预分频值
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct); //完成定时器初始化
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; // 初始化输出比较
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_Pulse=0;
TIM_OC1Init(TIM1,&TIM_OCInitStruct);//定时器通道1初始化
TIM_OC4Init(TIM1,&TIM_OCInitStruct);//定时器通道4初始化
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC1预装载寄存器使能//CH1 TIM1
TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC4预装载寄存器使能//CH4 TIM1
TIM_ARRPreloadConfig(TIM1,ENABLE); //允许或禁止在定时器工作时向ARR(自动重装载值)的缓冲器中写入新值,以便在更新事件发生时载入覆盖以前的值,此处为允许
TIM_CtrlPWMOutputs(TIM1,ENABLE); //高级定时器专属!!!--MOE主输出使能 //高级定时器TIM1:必须有这个函数才能输出PWM: TIM_CtrlPWMOutputs(TIM1,ENABL);
TIM_Cmd(TIM1,ENABLE); //定时器使能
// TIM_SetCompare1(TIM1,500);//设置TIMx捕获比较1寄存器值 此处为TIM1通道1
// TIM_SetCompare4(TIM1,500);//设置TIMx捕获比较4寄存器值 此处为TIM1通道4
}
// TIM3_PWM_Init(pwm_f,0); //设置频率为50Hz,公式为:溢出时间Tout(单位秒)=(arr+1)(psc+1)/Tclk 20MS = (59999+1)*(23+1)/72000000
//Tclk为通用定时器的时钟,如果APB1没有分频,则就为系统时钟,72MHZ
//PWM时钟频率=72000000/(59999+1)*(23+1) = 50HZ (20ms),设置自动装载值60000,预分频系数24
//TIM_SetCompare3(TIM3,550);改变比较值TIM3->CCR2达到调节占空比的效果
// TIM_SetCompare3(TIM3,171);
对你有帮助吗???
|