PWM_PFM结合使用控制温度

该博客详细介绍了如何使用STM32单片机结合PWM和PFM控制技术来精确调整温度。通过设置不同的定时器参数,实现了对温度控制的频率和占空比调节,以达到期望的加热效果。文中涉及到关键变量如系统时钟频率、温度TCR值以及PWM周期等,并提供了相应的初始化函数和中断服务函数示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值