#include "pwm_output.h"



u16 CCR1_Val = 32768;

u16 CCR2_Val = 16384;

u16 CCR3_Val = 8192;

u16 CCR4_Val = 4096;


u16 CCR1_dc = 50;

u16 CCR2_dc = 50;

u16 CCR3_dc = 50;

u16 CCR4_dc = 50;



u32 capture = 0;

u8 flag1 = 0, flag2 = 0, flag3 = 0, flag4 = 0;

u16 setcap = 0;


u8 i = 0;


void TIM2_PWM_Init(float pwm1, u16 dutyradio1,float pwm2,u16 dutyradio2,float pwm3,u16 dutyradio3,float pwm4,u16 dutyradio4)

{

? ? TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure= {0};

? ? NVIC_InitTypeDef NVIC_InitStructure= {0};

? ? TIM_OCInitTypeDef TIM_OCInitStructure= {0};

? ? GPIO_InitTypeDef GPIO_InitStructure = {0};

? ??

? ? RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE );

? ? RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? ? GPIO_Init( GPIOA, &GPIO_InitStructure );


? ? TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF;//65535;

? ? TIM_TimeBaseInitStructure.TIM_Prescaler = 48-1;//2-1;

? ? TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;

? ? TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

? ? TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

? ? TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStructure );


? ? TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

? ? TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

? ? TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;


? ? CCR1_Val = 0x8000;

? ? CCR2_Val = 0x4000;

? ? CCR3_Val = 0x2000;

? ? CCR4_Val = 0x1000;


? ? CCR1_dc = dutyradio1+10;

? ? CCR2_dc = dutyradio2+20;

? ? CCR3_dc = dutyradio3-10;

? ? CCR4_dc = dutyradio4-20;


? ? TIM_OCInitStructure.TIM_Pulse = CCR1_Val;

? ? TIM_OC1Init( TIM2, &TIM_OCInitStructure );//TIM2_OC1? ?PA0


? ? TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

? ? TIM_OC2Init( TIM2, &TIM_OCInitStructure );//TIM2_OC2? ?PA1


? ? TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

? ? TIM_OC3Init( TIM2, &TIM_OCInitStructure );//TIM2_OC1? ?PA2


? ? TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

? ? TIM_OC4Init( TIM2, &TIM_OCInitStructure );//TIM2_OC1? ?PA3


? ? NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;

? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;

? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;

? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

? ? NVIC_Init( &NVIC_InitStructure );

? ? NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);


? ? TIM_CtrlPWMOutputs(TIM2, ENABLE );


? ? TIM_OC1PreloadConfig( TIM2, TIM_OCPreload_Disable );

? ? TIM_OC2PreloadConfig( TIM2, TIM_OCPreload_Disable );

? ? TIM_OC3PreloadConfig( TIM2, TIM_OCPreload_Disable );

? ? TIM_OC4PreloadConfig( TIM2, TIM_OCPreload_Disable );


? ? TIM_ARRPreloadConfig( TIM2, ENABLE );

? ? TIM_ITConfig( TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE );

? ? TIM_Cmd( TIM2, ENABLE );


}


void TIM2_IRQHandler( void )

{

? ? printf("irq\r\n");


? ? if( TIM_GetITStatus( TIM2, TIM_IT_CC1 ) != RESET )

? ? {

? ? ? ? TIM_ClearITPendingBit( TIM2, TIM_IT_CC1 );

? ? ? ? capture = TIM_GetCapture1( TIM2 );


? ? ? ? if( flag1 == 0 )

? ? ? ? {

? ? ? ? ? ? flag1 = 1;

? ? ? ? ? ? setcap = capture + ( u32 )CCR1_Val * CCR1_dc / 100;

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? flag1 = 0;

? ? ? ? ? ? setcap = capture + ( u32 )CCR1_Val? * ( 100 - CCR1_dc ) / 100;

? ? ? ? }

? ? ? ? TIM_SetCompare1( TIM2, setcap? );

? ? }


? ? if( TIM_GetITStatus( TIM2, TIM_IT_CC2 ) != RESET )

? ? {

? ? ? ? TIM_ClearITPendingBit( TIM2, TIM_IT_CC2 );

? ? ? ? capture = TIM_GetCapture2( TIM2 );

? ? ? ? if( flag2 == 0 )

? ? ? ? {

? ? ? ? ? ? flag2 = 1;

? ? ? ? ? ? setcap = capture + CCR2_Val * CCR2_dc / 100;

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? flag2 = 0;

? ? ? ? ? ? setcap = capture + CCR2_Val? * ( 100 - CCR2_dc ) / 100;

? ? ? ? }

? ? ? ? TIM_SetCompare2( TIM2, setcap );

? ? }



? ? if( TIM_GetITStatus( TIM2, TIM_IT_CC3 ) != RESET )

? ? {

? ? ? ? TIM_ClearITPendingBit( TIM2, TIM_IT_CC3 );

? ? ? ? capture = TIM_GetCapture3( TIM2 );


? ? ? ? if( flag3 == 0 )

? ? ? ? {

? ? ? ? ? ? flag3 = 1;

? ? ? ? ? ? setcap = capture + CCR3_Val * CCR3_dc / 100;

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? flag3 = 0;

? ? ? ? ? ? setcap = capture + CCR3_Val? * ( 100 - CCR3_dc ) / 100;

? ? ? ? }

? ? ? ? TIM_SetCompare3( TIM2, setcap );

? ? }


? ? if( TIM_GetITStatus( TIM2, TIM_IT_CC4 ) != RESET )

? ? {

? ? ? ? TIM_ClearITPendingBit( TIM2, TIM_IT_CC4 );

? ? ? ? capture = TIM_GetCapture4( TIM2 );


? ? ? ? if( flag4 == 0 )

? ? ? ? {

? ? ? ? ? ? flag4 = 1;

? ? ? ? ? ? setcap = capture + CCR4_Val * CCR4_dc / 100;

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? flag4 = 0;

? ? ? ? ? ? setcap = capture + CCR4_Val? * ( 100 - CCR4_dc ) / 100;

? ? ? ? }

? ? ? ? TIM_SetCompare4( TIM2, setcap );

? ? }


}