性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

liuxiaofei126
認(rèn)證:VIP會(huì)員
所在專題目錄 查看專題
實(shí)例講解(一)移位寄存器
單片機(jī)之USB 硬件和數(shù)據(jù)的四種傳輸方式
實(shí)例講解(二)SPI通訊顯示電子星球
實(shí)例講解(三)之USB模擬串口
實(shí)例分析之可編程數(shù)控電源
軟件和硬件SPI通信模組的實(shí)例分析
作者動(dòng)態(tài) 更多
stm32知識(shí)點(diǎn)總結(jié)
2021-11-24 23:12
工程師單片機(jī)LED項(xiàng)目
2021-11-11 07:46
電容型負(fù)載對(duì)跟隨器的影響
2021-10-28 23:33
圖騰柱和互補(bǔ)推挽兩個(gè)“小冤家”
2021-10-22 23:15
學(xué)習(xí)單片機(jī)的捷徑
2021-10-17 23:07

實(shí)例分析之可編程數(shù)控電源

        從最基本的說起吧,DC-DC的變換電路有很多種,線性電源、開關(guān)電源、電荷泵,線性電源大家比較熟悉的應(yīng)該就是78XX系列的芯片了,電荷泵主要用在小電流的應(yīng)用中,我們也不加討論。主要講講開關(guān)電源,我呢也是一個(gè)先學(xué)先賣的人,就對(duì)照資料啥的隨便介紹下拉,權(quán)當(dāng)是開源本設(shè)計(jì)前的一點(diǎn)準(zhǔn)備工作。

      開關(guān)穩(wěn)壓器的工作原理,就是通過控制電路來控制開關(guān)器件的通斷,配合負(fù)反饋完成穩(wěn)壓,跟線性穩(wěn)壓比起來,具有效率高體積小的特點(diǎn),但是輸出沒有線性電源穩(wěn)定。開關(guān)電源的基本結(jié)構(gòu)有很多種,包括BUCK、BOOST、BUCK-BOOST、CUK等非隔離式的DCDC變換器,也有Flyback、LLC等隔離式的DCDC變換器。開源的這個(gè)設(shè)計(jì),是以buck拓?fù)錇楹诵模浜螰334的高級(jí)定時(shí)器的PWM、PI算法,實(shí)現(xiàn)的一個(gè)很簡(jiǎn)單的閉環(huán)控制,設(shè)計(jì)輸入電壓60V時(shí),輸出電壓可調(diào),輸出電流最大5A,輸出最大功率在200W左右。

這是基本的原理框圖

系統(tǒng)框圖如上,首先說明我這款電壓是從HP電源的基礎(chǔ)上增加人機(jī)界面和改善柵極驅(qū)動(dòng)做的,借這個(gè)機(jī)會(huì)分享下自己的心得。

采用同步BUCK,就是采用導(dǎo)通電阻特別低的mosfet來代替續(xù)流二極管,以此來提高整個(gè)拓?fù)涞墓ぷ餍?。基本圖如下:

圖中采用了無電解電容設(shè)計(jì),這樣雖然紋波可能會(huì)大一點(diǎn),但是響應(yīng)的體積卻小了很多,實(shí)際測(cè)試中,紋波在100MV以下。電感和電容的取值有響應(yīng)公式可以推到,這里不多贅述,直接給大家提供一個(gè)小工具,輸入?yún)?shù)就可以計(jì)算出結(jié)果的小工具:在文章最后配套資料

下面談一談程序的設(shè)計(jì)思路,因?yàn)檫@款設(shè)計(jì)為了盡可能減少體積,因此使用了較大頻率的PWM波,取值為250k,所采用的主控stm32f334是意法半導(dǎo)體專為數(shù)控電源所設(shè)計(jì)的一款MCU。STM32F334xx微控制器具有高分辨率定時(shí)器(HRTIM)外設(shè),可產(chǎn)生多達(dá)10個(gè)信號(hào),能夠處理用于控制、同步或保護(hù)的各種不同輸入信號(hào)。其模塊化架構(gòu)允許對(duì)大部分轉(zhuǎn)換拓?fù)浜投嗖⒙?lián)轉(zhuǎn)換器進(jìn)行處理,并可在運(yùn)行中重新配置它們。

在如上所示的拓?fù)洚?dāng)中,包括輸出電壓讀數(shù)和過流保護(hù)(利用FAULT輸入),使在電流超出可編程閾值時(shí)關(guān)閉轉(zhuǎn)換器。為簡(jiǎn)單起見,此處不討論電流傳感器和調(diào)整電路;預(yù)期的FAULT反饋(在FLT1輸入上)為數(shù)字信號(hào)(在PA12輸入上)。

HRTIM工作于連續(xù)模式,PWM信號(hào)定義如下:

• TA1:在 TA Period 置位,在 TA CMP2 復(fù)位

• TA2:利用死區(qū)時(shí)間發(fā)生器,與 TA1 互補(bǔ) (相同的上升沿和下降沿死區(qū)時(shí)間)

需要注意的是,有關(guān)AD采樣的觸發(fā)時(shí)機(jī)選擇是一個(gè)很關(guān)鍵的點(diǎn),如下圖所示,對(duì)于特定占空比的PWM波,在其中央觸發(fā)AD工作,這樣可以避免紋波的影響。

由此,通過AD采樣的輸出電壓與設(shè)定的電壓一起,配合PI調(diào)節(jié)占空比,即完成了閉環(huán)反饋過程,通過對(duì)輸出電壓電流的編程,即完成電池充電程序的編寫。

這里給出配置的代碼和PI的代碼。

/***************************************************************************
#define PWM_PERIOD = 144000000*32/switchfrequency
#define DT_RISING = risingtime*switchfrequency*PWM_PERIOD
#define DT_FALLING = fallingtime*switchfrequency*PWM_PERIOD
***************************************************************************/
/**
  * [url=home.php?mod=space&uid=159083]@brief[/url]  用于配置HRTIM_A的輸出,關(guān)閉deadtime時(shí),為單輸出,開啟deadtime時(shí),為雙輸出。
  * @param  死區(qū)使能,配套AD采樣使能,錯(cuò)誤使能,中斷使能,初始頻率,初始占空比(HO),中斷頻率,上升死區(qū)時(shí)間(單位納秒),下降死區(qū)時(shí)間
  * @retval None
  */
void MY_BSP_Init_HRTIM_A(BOOLEAN deadtime,BOOLEAN adenable,BOOLEAN faultenable,BOOLEAN interrupt,uint32_t Initial_Fre,uint8_t Initial_Duty,uint8_t n_ISR,uint8_t risingtime,uint8_t fallingtime)
{
  HRTIM_TimeBaseCfgTypeDef timebase_config;
  HRTIM_TimerCfgTypeDef timer_config;
  HRTIM_OutputCfgTypeDef output_config_TA;
  HRTIM_CompareCfgTypeDef compare_config;
  /* ----------------------------*/
  /* HRTIM Global initialization */
  /* ----------------------------*/
  /* Initialize the hrtim structure (minimal configuration) */
  hhrtimA.Instance = HRTIM1;
  hhrtimA.Init.HRTIMInterruptResquests = HRTIM_IT_NONE;
  hhrtimA.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;

  /* Initialize HRTIM */
  HAL_HRTIM_Init(&hhrtimA);

  /* HRTIM DLL calibration: periodic calibration, set period to 14祍 */
  HAL_HRTIM_DLLCalibrationStart(&hhrtimA, HRTIM_CALIBRATIONRATE_14);
  /* Wait calibration completion*/
  if (HAL_HRTIM_PollForDLLCalibration(&hhrtimA, 100) != HAL_OK)
  {
    Error_Handler(); // if DLL or clock is not correctly set
  }        
  /* --------------------------------------------------- */
  /* TIMERA initialization: timer mode and PWM frequency */
  /* --------------------------------------------------- */
  timebase_config.Period = 4608000000/Initial_Fre; /* 400kHz switching frequency */
  timebase_config.RepetitionCounter = n_ISR - 1; /* n ISR every 128 PWM periods */
  timebase_config.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
  timebase_config.Mode = HRTIM_MODE_CONTINUOUS;
        HAL_HRTIM_TimeBaseConfig(&hhrtimA, HRTIM_TIMERINDEX_TIMER_A, &timebase_config);        
  /* --------------------------------------------------------------------- */
  /* TIMERA global configuration: cnt reset, sync, update, fault, burst... */
  /* timer running in continuous mode, with deadtime enabled               */
  /* --------------------------------------------------------------------- */
  timer_config.DMARequests = HRTIM_TIM_DMA_NONE;
  timer_config.DMASrcAddress = 0x0;
  timer_config.DMADstAddress = 0x0;
  timer_config.DMASize = 0x0;
  timer_config.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
  timer_config.StartOnSync = HRTIM_SYNCSTART_DISABLED;
  timer_config.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
  timer_config.DACSynchro = HRTIM_DACSYNC_NONE;
  timer_config.PreloadEnable = HRTIM_PRELOAD_ENABLED;
  timer_config.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
  timer_config.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
  timer_config.RepetitionUpdate = HRTIM_UPDATEONREPETITION_ENABLED;
  timer_config.ResetUpdate = HRTIM_TIMUPDATEONRESET_DISABLED;
        if(interrupt == TRUE)
        {
                timer_config.InterruptRequests = HRTIM_TIM_IT_REP;
        }
        else 
                timer_config.InterruptRequests = HRTIM_TIM_IT_NONE;
  timer_config.PushPull = HRTIM_TIMPUSHPULLMODE_DISABLED;
        if(faultenable == TRUE)
                timer_config.FaultEnable = HRTIM_TIMFAULTENABLE_FAULT1;
        else
                timer_config.FaultEnable = HRTIM_TIMFAULTENABLE_NONE;
  timer_config.FaultLock = HRTIM_TIMFAULTLOCK_READWRITE;
  timer_config.DeadTimeInsertion = HRTIM_TIMDEADTIMEINSERTION_ENABLED;
  timer_config.DelayedProtectionMode = HRTIM_TIMER_A_B_C_DELAYEDPROTECTION_DISABLED;
  timer_config.UpdateTrigger= HRTIM_TIMUPDATETRIGGER_NONE;
  timer_config.ResetTrigger = HRTIM_TIMRESETTRIGGER_NONE;
        HAL_HRTIM_WaveformTimerConfig(&hhrtimA, HRTIM_TIMERINDEX_TIMER_A, &timer_config);        
        
  /* Set compare registers for duty cycle on TA1 */
  compare_config.CompareValue = 46080000*Initial_Duty/Initial_Fre;  /*duty cycle */
  HAL_HRTIM_WaveformCompareConfig(&hhrtimA,
                                  HRTIM_TIMERINDEX_TIMER_A,
                                  HRTIM_COMPAREUNIT_1,
                                  &compare_config);        
        /* --------------------------------- */
  /* TA1 and TA2 waveforms description */
  /* --------------------------------- */
  output_config_TA.Polarity = HRTIM_OUTPUTPOLARITY_HIGH;
  output_config_TA.SetSource = HRTIM_OUTPUTSET_TIMPER;
  output_config_TA.ResetSource  = HRTIM_OUTPUTRESET_TIMCMP1;
  output_config_TA.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE;
  output_config_TA.IdleLevel = HRTIM_OUTPUTIDLELEVEL_INACTIVE;
  output_config_TA.FaultLevel = HRTIM_OUTPUTFAULTLEVEL_INACTIVE;
  output_config_TA.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED;
  output_config_TA.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR;
  HAL_HRTIM_WaveformOutputConfig(&hhrtimA,
                                 HRTIM_TIMERINDEX_TIMER_A,
                                 HRTIM_OUTPUT_TA1,
                                 &output_config_TA);
        if(deadtime == TRUE)
        {
                HAL_HRTIM_WaveformOutputConfig(&hhrtimA,
                                                                                                                                                HRTIM_TIMERINDEX_TIMER_A,
                                                                                                                                                HRTIM_OUTPUT_TA2,
                                                                                                                                                &output_config_TA);
        }        
        if(deadtime == TRUE)
        {
                HRTIM_DeadTimeCfgTypeDef HRTIM_TIM_DeadTimeConfig;
          /* Deadtime configuration for Timer A */
                HRTIM_TIM_DeadTimeConfig.FallingLock = HRTIM_TIMDEADTIME_FALLINGLOCK_WRITE;
                HRTIM_TIM_DeadTimeConfig.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE;
                HRTIM_TIM_DeadTimeConfig.FallingSignLock = HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_READONLY;
                HRTIM_TIM_DeadTimeConfig.FallingValue = risingtime*4096/1000;
                HRTIM_TIM_DeadTimeConfig.Prescaler = HRTIM_TIMDEADTIME_PRESCALERRATIO_MUL8;
                HRTIM_TIM_DeadTimeConfig.RisingLock = HRTIM_TIMDEADTIME_RISINGLOCK_WRITE;
                HRTIM_TIM_DeadTimeConfig.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE;
                HRTIM_TIM_DeadTimeConfig.RisingSignLock = HRTIM_TIMDEADTIME_RISINGSIGNLOCK_READONLY;
                HRTIM_TIM_DeadTimeConfig.RisingValue = fallingtime*4096/1000;
                HAL_HRTIM_DeadTimeConfig(&hhrtimA, HRTIM_TIMERINDEX_TIMER_A, &HRTIM_TIM_DeadTimeConfig);                
        }
        if(adenable == TRUE)
        {
                HRTIM_ADCTriggerCfgTypeDef adc_trigger_config;
                /* ------------------------------------------- */
                /* ADC trigger intialization (with CMP4 event) */
                /* ------------------------------------------- */
                compare_config.AutoDelayedMode = HRTIM_AUTODELAYEDMODE_REGULAR;
                compare_config.AutoDelayedTimeout = 0;
                if(Initial_Duty >=50)
                        compare_config.CompareValue = 46080000*Initial_Duty/Initial_Fre; /* Samples in middle of ON time */
                else                                                                                                                                                                
                        compare_config.CompareValue = 23040000*(100+Initial_Duty)/Initial_Fre;
                HAL_HRTIM_WaveformCompareConfig(&hhrtimA,
                                                                                                                                                HRTIM_TIMERINDEX_TIMER_A,
                                                                                                                                                HRTIM_COMPAREUNIT_4,
                                                                                                                                                &compare_config);

                adc_trigger_config.Trigger = HRTIM_ADCTRIGGEREVENT24_TIMERA_CMP4;
                adc_trigger_config.UpdateSource = HRTIM_ADCTRIGGERUPDATE_TIMER_A;
                HAL_HRTIM_ADCTriggerConfig(&hhrtimA,
                                                                                                                         HRTIM_ADCTRIGGER_2,
                                                                                                                         &adc_trigger_config);
        }
        if(faultenable == TRUE)
        {
                HRTIM_FaultCfgTypeDef fault_config;
                /* ---------------------*/
                /* FAULT initialization */
                /* ---------------------*/
                fault_config.Filter = HRTIM_FAULTFILTER_NONE;
                fault_config.Lock = HRTIM_FAULTLOCK_READWRITE;
                fault_config.Polarity = HRTIM_FAULTPOLARITY_LOW;
                fault_config.Source = HRTIM_FAULTSOURCE_DIGITALINPUT;
                HAL_HRTIM_FaultConfig(&hhrtimA,
                                                                                                        HRTIM_FAULT_1,
                                                                                                        &fault_config);

                HAL_HRTIM_FaultModeCtl(&hhrtimA,
                                                                                                        HRTIM_FAULT_1,
                                                                                                        HRTIM_FAULTMODECTL_ENABLED);
        }
        if(deadtime == TRUE)
        {
                /* ---------------*/
                /* HRTIM start-up */
                /* ---------------*/
                /* Enable HRTIM's outputs TA1 and TA2 */
                /* Note: it is necessary to enable also GPIOs to have outputs functional */
                /* This must be done after HRTIM initialization */
                HAL_HRTIM_WaveformOutputStart(&hhrtimA, HRTIM_OUTPUT_TA1 | HRTIM_OUTPUT_TA2);        
        }
        else
                HAL_HRTIM_WaveformOutputStart(&hhrtimA, HRTIM_OUTPUT_TA1);        
        
  /* Start both HRTIM TIMER A, B and D */
        if(interrupt == TRUE)
                HAL_HRTIM_WaveformCounterStart_IT(&hhrtimA, HRTIM_TIMERID_TIMER_A);
        else
                HAL_HRTIM_WaveformCounterStart(&hhrtimA, HRTIM_TIMERID_TIMER_A);
        
        
        
        GPIO_InitTypeDef GPIO_InitStruct;

  /* Enable GPIOA clock for timer A outputs */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /* Configure HRTIM output: TA1 (PA8) */
  GPIO_InitStruct.Pin = GPIO_PIN_8; 
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;;  
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;;  
  GPIO_InitStruct.Alternate = GPIO_AF13_HRTIM1;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

        if(deadtime == TRUE)
        {
                /* Configure HRTIM output: TA2 (PA9) */
                GPIO_InitStruct.Pin = GPIO_PIN_9;
                HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        }
}
/**
* @brief  This function calculates new duty order with PI.
* @param  None
* @retval New duty order
*/
int32_t PI_Buck(uint32_t RealVol,uint32_t SetVol,int32_t dec2hex(int32_t temp))
{ 
  /* Compute PI for Buck Mode */
  /* Every time the PI order sets extreme values then CTMax or CTMin are managed */
  int32_t seterr, pid_out;
  int32_t error;
        
  error = ((int32_t ) RealVol - (int32_t) SetVol);
        error = dec2hex(error);
        
  seterr = (-Kp * error) / 200;

  Int_term_Buck = Int_term_Buck + ((-Ki * error) / 200);

  if (Int_term_Buck > SAT_LIMIT)
  {
    Int_term_Buck = SAT_LIMIT;
  }
  if (Int_term_Buck < -(SAT_LIMIT))
  {
    Int_term_Buck = -(SAT_LIMIT);
  }
  pid_out = seterr + Int_term_Buck;
  pid_out += BUCK_PWM_PERIOD / 2;

  if (pid_out >= MAX_DUTY_A)
  {
    pid_out = MAX_DUTY_A;
    CTMax++;
  }
  else
  {
    if (CTMax != 0)
    {
      CTMax--;
    }
  }
  if (pid_out <= MIN_DUTY_A)
  {
    pid_out = MIN_DUTY_A;
    CTMin++;
  }
  else
  {
    if (CTMin != 0)
    {
      CTMin--;
    }
  }
  return  pid_out;
}

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
本篇所含全部資料,點(diǎn)擊此處留下郵箱我會(huì)發(fā)給你
資料明細(xì):BOOST電感、BUKC電感、逆變電容、電感計(jì)算表.rar
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 8
收藏 14
關(guān)注 210
成為作者 賺取收益
全部留言
0/200
  • lumos 2024-04-24 10:25
    內(nèi)容已刪除 29****@****.com
    回復(fù) 1條回復(fù)
  • lumos 2024-04-24 10:25
    老師,能不能發(fā)我一下資料,謝謝! 29****@****.com
    回復(fù) 1條回復(fù)
  • 善作魂 2023-07-27 23:34
    老師,能不能發(fā)我一下資料,謝謝! 13****@****.com
    回復(fù) 1條回復(fù)
  • dy-FJIyEPKe 2023-04-13 00:31
    老師,能不能發(fā)我一下資料,謝謝! 11****@****.com
    回復(fù) 1條回復(fù)
  • ???????????????? 2022-12-18 23:17
    老師,能不能發(fā)我一下資料,謝謝! 94****@****.com
    回復(fù) 1條回復(fù)
  • dy-dZawlF2I 2022-11-24 22:09
    老師,能不能發(fā)我一下資料,謝謝! 22****@****.com
    回復(fù) 1條回復(fù)
  • 空?城? 2022-11-12 12:44
    老師,能不能發(fā)我一下資料,謝謝! 28****@****.com
    回復(fù) 1條回復(fù)
  • 星球居民-UHai2BTW 2022-08-03 17:36
    老師,能不能發(fā)我一下資料,謝謝! 57****@****.com
    回復(fù) 1條回復(fù)
  • gmh0601 2021-10-11 13:32
    多想學(xué)習(xí)數(shù)控電源知識(shí)啊,謝謝老師賜教
    回復(fù)
  • gmh0601 2021-10-11 13:31
    老師,能不能發(fā)我一下資料,謝謝! gm****@****.com
    回復(fù) 1條回復(fù)
  • 開源節(jié)流 2021-05-10 09:39
    老師,能不能發(fā)我一下資料,謝謝! 18****@****.com
    回復(fù) 1條回復(fù)
  • 荊鵬飛 2021-04-11 11:29
    老師,能不能發(fā)我一下資料,謝謝! 30****@****.com
    回復(fù) 1條回復(fù)
  • 莜藍(lán) 2021-03-15 01:37
    老師,能不能發(fā)我一下資料,謝謝! 13****@****.com
    回復(fù) 1條回復(fù)
  • 小董 2021-03-11 16:12
    圍觀學(xué)習(xí)
    回復(fù)
  • dy-blNlwnWV 2021-02-25 21:44
    學(xué)習(xí)了
    回復(fù)
  • chexiaozhu 2021-02-02 13:22
    老師,能不能發(fā)我一下資料,謝謝! 12****@****.com
    回復(fù) 1條回復(fù)
  • keyhei66 2021-01-20 21:58
    學(xué)習(xí)一下數(shù)控電源
    回復(fù)
  • 余云淺 2021-01-19 08:09
    老師,能不能發(fā)我一下資料,謝謝! 25****@****.com
    回復(fù) 1條回復(fù)
  • lihui710884923 2021-01-18 11:12
    數(shù)控電源精度咋樣
    回復(fù)