|
/*******************************************TIMX,初始化为+-计数的pwm输出******************************/
void TIMX_PWM_Init(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//桥数据
Power_Bridge_Init();
TIM_DeInit(TIM1);TIM_DeInit(TIM8);
/*********************************中断优先级设置************************************/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //4-4优先级
NVIC_StructInit(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢先优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_IRQChannel;
NVIC_Init(&NVIC_InitStructure);
//clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1|RCC_APB2Periph_TIM8, ENABLE);
//tim1:ch1234,pa8、9、10、11 ch123n,pb13、14、15 etr,pa12 bkin,pb12
//tim8:ch1234,pc6、7、8 、9 ch123n,pa7 pb0 pb1 etr,pa0 bkin,pa6
GPIOX_Init(GPIOA,(GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10),GPIO_Mode_AF_PP);
GPIOX_Init(GPIOB,(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15),GPIO_Mode_AF_PP);
GPIOX_Init(GPIOC,(GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8),GPIO_Mode_AF_PP);
//定时器pwm模式
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); //其它默认值
TIM_TimeBaseStructure.TIM_Period = (DEFAULT_PERIOD-1); //重载定时器周期,ARPE=1时更新事件时//
TIM_TimeBaseStructure.TIM_Prescaler = 0x0; //定时器时钟分频数,下次更新事件时采用//
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割//
//1下计数设置中断,指比较中断(如果不用比较中断,123都可以)
//这个必须的,会触发更新
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000; //重复计数
//Tim1
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //执行设置//
TIM_ARRPreloadConfig(TIM1,ENABLE); //使能与装载Period
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM8,ENABLE); //使能与装载Period
/* 通道工作模式 */
TIM_OCStructInit(&TIM_OCInitStructure); //其它默认值
//110:PWM模式1- 在向上计数时,一旦TIMx_CNT
//在向下计数时, 一旦TIMx_CNT>TIMx_CCR1 时通道1 为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性0:高电平有效
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; //补极性
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出
// TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0x200; //123初值
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //TIM1_OCIdleState选择空闲状态下的非工作状态(MOE=0时设置TIM1输出比较空闲状态)
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;//OIS1N
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC1FastConfig(TIM1, TIM_OCFast_Enable);
TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); //通道预装载使能
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC2FastConfig(TIM1, TIM_OCFast_Enable);
TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OC3FastConfig(TIM1, TIM_OCFast_Enable);
TIM_OC3PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_OC1Init(TIM8, &TIM_OCInitStructure);
TIM_OC1FastConfig(TIM8, TIM_OCFast_Enable);
TIM_OC1PreloadConfig(TIM8,TIM_OCPreload_Enable); //通道预装载使能
TIM_OC2Init(TIM8, &TIM_OCInitStructure);
TIM_OC2FastConfig(TIM8, TIM_OCFast_Enable);
TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable);
TIM_OC3Init(TIM8, &TIM_OCInitStructure);
TIM_OC3FastConfig(TIM8, TIM_OCFast_Enable);
TIM_OC3PreloadConfig(TIM8,TIM_OCPreload_Enable);
/* 通道4为普通输出,用来输出过0
TIM_OCStructInit(&TIM_OCInitStructure); //其它默认值
TIM_OCInitStructure.TIM_Pulse = 0x20; //123初值
TIM_OC4Init(TIM1, &TIM_OCInitStructure); */
/* CCxE CCxNE OCxM设置为非预装载的 */
TIM_CCPreloadControl(TIM1,DISABLE);
TIM_CCPreloadControl(TIM8,DISABLE);
TIM_ClearFlag(TIM1,TIM_FLAG_Update|TIM_FLAG_CC1|TIM_FLAG_CC2|TIM_FLAG_CC3|TIM_FLAG_CC4);
TIM_ClearFlag(TIM8,TIM_FLAG_Update|TIM_FLAG_CC1|TIM_FLAG_CC2|TIM_FLAG_CC3|TIM_FLAG_CC4);
TIM_ITConfig(TIM1,TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM8,TIM_IT_Update, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM8, ENABLE);
Power1.Run_Status|=POWER_RUN_FLAG; Power2.Run_Status|=POWER_RUN_FLAG;
TIM_Cmd(TIM1, ENABLE);TIM_Cmd(TIM8, ENABLE); //时器开始计数
} |
|