uint32_t SystemClock = 72000000;//gstTempCtrPara.TempretureTCR =100~800
void pwm_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
//TimerPeriod = (SystemClock / FreQ ) - 1;
TimerPeriod = SystemClock/1000 / gstTempCtrPara.TempretureTCR - 1;//72000000/850000=84 //FREQ_INIT 72000000/800000=90
TIM1->ARR = TimerPeriod;//TimerPeriod*(50-Pulse%50)/50;
PwmValueSet= (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);
/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Prescaler = 0; //att // 时钟频率:Ftime3 = 48M/(time_divide + 1) = 48M/(191+1) = 250khz
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = TimerPeriod; //att //PWM周期 = 4ms
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* Channel 1, 2,3 and 4 Configuration in PWM mode */
// TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
// TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //TIM_OutputNState_Disable
// TIM_OCInitStructure.TIM_Pulse = PwmValueSet;
// TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //反相
// TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
// TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //TIM_OutputNState_Disable
TIM_OCInitStructure.TIM_Pulse = PwmValueSet;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_CCPreloadControl(TIM1,ENABLE);/
/* TIM14 counter enable */
TIM_Cmd(TIM1, ENABLE);
/* Enable the CC2 Interrupt Request */
// TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
/* TIM14 Main Output Enable */
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
volatile u16 pwm_timer_cnt=0;
volatile u16 timer_set=0;
//volatile u16 timer_cnt=0;
void pwm_number_cutdown()//100us 中断调用
{
#if true //false//
if(pwm_timer_cnt>0)
{
pwm_timer_cnt--;
if(pwm_timer_cnt==0)
{
// PWM_OFF();//关断PWM
TIM_ForcedOC3Config( TIM1, TIM_ForcedAction_Active);//强制有效//TIM1->CCR3 =0;
// if(gstTempCtrPara.boostEn==0&& timer_set<35&&err<20) PWM_EN_OFF;
// if(timer_set<20)//50)
// PWM_EN_OFF;
}
}
#endif
}
//-------------------------------------------------------------------------
uint16_t period=800;
uint16_t Max_period=600;//1500;//最高80K~周期最小90 720000/80=900 72000/50=1440 30
uint16_t Min_period=120;//200;//400;//800;//最高80K~周期最小90 72000/800=90k 72000/600=120k 72000/400=180k
void pfm_set(uint16_t percent)
{
static u16 cnt=0;
#define MOS_OFF 72*(2+0.6)//2.6us~4.5us 高电平MOS导通放电时长<5us;
#define MIN_FRE 85//80~110 KHZ
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);//TIM_OCPreload_Disable); //使能或者失能TIMx在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM1,ENABLE);//
Min_period=72000/MIN_FRE;//if(FreQ<200*1000)FreQ=660*1000;
TimerPeriod = SystemClock/1000 / gstTempCtrPara.TempretureTCR - 1;72000/240=300
// Max_period=72000/MIN_FRE;//if(FreQ<200*1000)FreQ=660*1000;
/* Set the Capture Compare Register value */
//TIM1->ARR = Max_period;
#if false//true //test
TIM1->ARR = TimerPeriod;//MOS_OFF*3;//period;//MOS_OFF+(Max_period-MOS_OFF)*percent/100;
TIM1->CCR3 = pulse_wide;
if(++cnt<20)//100)
{TIM_CtrlPWMOutputs(TIM1, 1); TIM1->CCMR2 &= ~TIM_CCMR2_OC3M;
}
else if(cnt<40)//200)
{
//TIM_CtrlPWMOutputs(TIM1, 0); TIM_ForcedOC3Config( TIM1, TIM_ForcedAction_Active);//强制有效
}
else cnt=0;
return;
#endif
TIM1->CNT = TIM1->CCR3+1;//T3C1 输出有效 TIM_OCPolarity_High高
TIM_ForcedOC3Config( TIM1, TIM_ForcedAction_Active);//强制有效 TIM_OCPolarity~=TIM_OCPolarity_High 拉高
//TIM1->CCR3 = 0xffff;//MOS_OFF;
//TIM_ForcedOC3Config( TIM1, TIM_ForcedAction_Active);//强制高
// TIM1->ARR = period;
// TIM1->CCR3 = (TimerPeriod-1)*49/100;// by will
#if 1//D003 //LC 并联谐振 导磁体周向加热 glue方案
if(percent==0 ||percent>100)//||Pulse*pwm_coe < MOS_OFF) //TIM_OCMode_PWM2!! LP1111——DRVL接MOS
{
TIM_ForcedOC3Config( TIM1, TIM_ForcedAction_Active);
//TIM_CtrlPWMOutputs(TIM1, DISABLE);
// //TIM1->CCR3 = 0;