日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

您好,歡迎進(jìn)入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁 新聞資訊 >> 新聞?lì)^條 >> 說說M451例程之PWM
新聞資訊
NEWS INFORMATION

說說M451例程之PWM

關(guān)鍵字:M451 發(fā)布時(shí)間:2019-05-22

/**************************************************************************//** * @file main.c * @version V3.00 * $Revision: 2 $ * $Date: 15/09/02 10:03a $ * @brief Demonstrate how to set GPIO pin mode and use pin data input/output control. * @note * Copyright (C) 2013~2015 Nuvoton Technology Corp. All rights reserved. * ******************************************************************************/#include "stdio.h"#include "M451Series.h"#include "NuEdu-Basic01.h"

#define PLL_CLOCK 72000000

void SYS_Init(void){ /*---------------------------------------------------------------------------------------------------------*/ /* Init System Clock */ /*---------------------------------------------------------------------------------------------------------*/

/* Enable HIRC clock (Internal RC 22.1184MHz) */
CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

/* Wait for HIRC clock ready */ CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

/* Select HCLK clock source as HIRC and and HCLK clock divider as 1 */
CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

/* Enable HXT clock (external XTAL 12MHz) */ CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

/* Wait for HXT clock ready */
CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);

/* Set core clock as PLL_CLOCK from PLL */ CLK_SetCoreClock(PLL_CLOCK);

/* Enable UART module clock */
CLK_EnableModuleClock(UART0_MODULE);

/* Select UART module clock source as HXT and UART module clock divider as 1 */ CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));

/*---------------------------------------------------------------------------------------------------------*/
/* Init I/O Multi-function */
/*---------------------------------------------------------------------------------------------------------*/

/* Set PD multi-function pins for UART0 RXD(PD.6) and TXD(PD.1) */ SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD6MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk); SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD6MFP_UART0_RXD | SYS_GPD_MFPL_PD1MFP_UART0_TXD);

}

void UART0_Init(){ /*---------------------------------------------------------------------------------------------------------*/ /* Init UART */ /*---------------------------------------------------------------------------------------------------------*/ /* Reset UART module */ SYS_ResetModule(UART0_RST);

/* Configure UART0 and set UART0 baud rate */
UART_Open(UART0, 115200);
}

/*---------------------------------------------------------------------------------------------------------*//* Main Function *//*---------------------------------------------------------------------------------------------------------*/int32_t main(void){ uint32_t temp,temp1 = 0; /* Unlock protected registers */ SYS_UnlockReg();

/* Init System, peripheral clock and multi-function I/O */
SYS_Init();

/* Lock protected registers */ SYS_LockReg();

/* Init UART0 for printf */
UART0_Init();

printf("\nNuEdu-SDK-M451 PWM-DAC\n");

Initial_PWM_LED();
Initial_PWM_DAC();
Initial_LED();
Open_ADC_Knob();
Write_PWMDAC(1,temp1);

while(1)
{
        //Get Volume Knob Data
        temp = Get_ADC_PWMDAC(); //Volume Range: 0 ~ 4095
Write_LED_Bar((temp * (8 + 1) / 4096));
Write_PWMDAC(1,temp1++);
if(temp1>100)
temp1 = 0;
CLK_SysTickDelay(10000);
}
}

 

以上是PWM的例程,今天主要講講PWM的發(fā)生

M451提供了兩路PWM發(fā)生器。每路PWM支持6通道PWM輸出或輸入捕捉。有一個(gè)12位的預(yù)分頻器把時(shí)鐘源分頻后輸入給16位的計(jì)數(shù)器,另外還有一個(gè)16位的比較器。PWM計(jì)數(shù)器支持向上,向下,上下計(jì)數(shù)方式。PWM用比較器和計(jì)數(shù)器的比較來產(chǎn)生事件,這些事件用來產(chǎn)生PWM脈沖,中斷,EADC/DAC轉(zhuǎn)換觸發(fā)信號(hào)。
PWM發(fā)生器支持兩種標(biāo)準(zhǔn)PWM輸出模式:獨(dú)立模式和互補(bǔ)模式,它們的架構(gòu)不同。標(biāo)準(zhǔn)輸出模式又有兩種輸出功能:組功能和同步功能。組功能可以在獨(dú)立模式和互補(bǔ)模式下使能。同步功能只有在互補(bǔ)模式下才可以被使能;パa(bǔ)模式,有兩個(gè)比較器產(chǎn)生各種帶12位死區(qū)時(shí)間的PWM脈寬,另外還有一個(gè)自由觸發(fā)比較器來產(chǎn)生給EADC的觸發(fā)信號(hào)。PWM輸出控制單元,它支持極性輸出,獨(dú)立管腳屏蔽和剎車功能。
PWM也支持輸入捕捉功能,當(dāng)輸入通道有向上跳變、向下跳變、或者兩者都有的跳變時(shí),鎖存PWM計(jì)數(shù)器的值到相應(yīng)的寄存器中。捕捉功能也支持通過PDMA把捕捉到的數(shù)據(jù)搬移到內(nèi)存。

PWM功能特性 6.9.2.1
? 支持時(shí)鐘頻率最高達(dá)144MHz
? 支持兩個(gè)PWM模塊,每個(gè)模塊提供6個(gè)輸出通道
? 支持獨(dú)立模式的PWM輸出/輸入捕捉
? 支持3組互補(bǔ)通道的互補(bǔ)模式
? 12位解析度的死區(qū)插入
? 相控制的同步功能
? 每個(gè)周期兩個(gè)比較值
? 支持12位從1到4096的預(yù)分頻
? 支持16位解析度的PWM計(jì)數(shù)器
? 向上,向下和上下計(jì)數(shù)操作類型
? 支持one-shot或自動(dòng)裝載計(jì)數(shù)器工作模式
? 支持組功能
? 支持同步功能
? 每個(gè)PWM管腳支持屏蔽功能和三態(tài)使能
? 支持剎車功能
? 剎車源來自管腳、模擬比較器和系統(tǒng)安全事件(時(shí)鐘故障、SRAM奇偶校驗(yàn)錯(cuò)誤、欠壓監(jiān)測(cè)和CPU鎖。
? 剎車源管腳噪聲濾波器
? 通過邊緣檢測(cè)剎車源來控制剎車狀態(tài)直到剎車中斷清除

? 剎車條件解除后電平檢測(cè)剎車源自動(dòng)恢復(fù)功能

? 支持下列事件中斷:
? PWM計(jì)數(shù)器值為 0、周期值或比較值
? 發(fā)生剎車條件
? 支持下列事件觸發(fā)EADC/DAC :
? PWM計(jì)數(shù)器值為0、周期值或比較值
? PWM 計(jì)數(shù)器匹配自由觸發(fā)比較器比較值(僅EADC)
捕捉功能特性 6.9.2.2
? 支持12個(gè)16位解析度的輸入捕捉通道
? 支持上升/下降沿捕捉條件
? 支持輸入上升/下降沿 捕捉中斷
? 支持計(jì)數(shù)器重載選項(xiàng)的上升/下降沿 捕捉
? 支持PWM 的所有通道PDMA數(shù)據(jù)搬移功能

 

PWM系統(tǒng)時(shí)鐘可以設(shè)為等于或兩倍的HCLK頻率, 圖 6.9-2, 寄存器設(shè)置細(xì)節(jié)請(qǐng)參考表 6.9-1.
每個(gè)PWM發(fā)生器有三個(gè)輸入時(shí)鐘源,每個(gè)時(shí)鐘源可以從系統(tǒng)時(shí)鐘或者4組定時(shí)器觸發(fā)PWM輸出,圖
6.9-3,PWM_CLK0設(shè)置ECLKSRC0 (PWM_CLKSRC[2:0]),PWM_CLK2設(shè)置ECLKSRC2
(PWM_CLKSRC[10:8]),PWM_CLK4設(shè)置ECLKSRC4 (PWM_CLKSRC[18:16])

圖 6.9-4 和圖 6.9-5表示PWM獨(dú)立模式和互補(bǔ)模式的架構(gòu)。不管獨(dú)立模式還是比較模式,一對(duì)通道
組(PWM_CH0 和PWM_CH1, PWM_CH2 和 PWM_CH3, PWM_CH4 和 PWM_CH5)計(jì)數(shù)器來自相
同的時(shí)鐘源和預(yù)分頻。當(dāng)計(jì)數(shù)器的值等于0,PERIOD(PWM_PERIODn[15:0])或比較器值,將產(chǎn)生
事件。這些事件通過相應(yīng)的發(fā)生器來產(chǎn)生PWM脈沖、中斷信號(hào)、EADC/DAC的轉(zhuǎn)換觸發(fā)信號(hào)。輸
出控制是用來改變PWM脈沖輸出狀態(tài)的。輸出控制的剎車功能也能產(chǎn)生中斷事件。在互補(bǔ)模式,
同步功能有效,偶數(shù)通道用奇數(shù)通道比較器產(chǎn)生事件,自由觸發(fā)比較器事件只用于產(chǎn)生觸發(fā)EADC
信號(hào)。

#include <stdio.h>
#include "M451Series.h"
#include "NuEdu-Basic01_PWMDAC.h"


void Write_PWMDAC(unsigned char Enable, unsigned char ch0_dut)
{
    /* set PWMB channel 0 output configuration */
    PWM_ConfigOutputChannel(PWM1, 4, 1000, ch0_dut);

    // Start PWM COUNT
    PWM_Start(PWM1, 1 << 4);

    if(Enable == 0)
        /* Enable PWM Output path for PWMB channel 0 */
        PWM_DisableOutput(PWM1, 1 << 4);
    else
        /* Diable PWM Output path for PWMB channel 0 */
        PWM_EnableOutput(PWM1, 1 << 4);
}


void Initial_PWM_DAC(void)
{
    GPIO_SetMode(PC, BIT13, GPIO_MODE_INPUT); //avoid to pwm dac out
    SYS->GPC_MFPH &= ~SYS_GPC_MFPH_PC13MFP_Msk ;
    SYS->GPC_MFPH |= SYS_GPC_MFPH_PC13MFP_PWM1_CH4;

    /* Enable PWM module clock */
    CLK_EnableModuleClock(PWM1_MODULE);

    /* Select PWM module clock source */
    CLK_SetModuleClock(PWM1_MODULE, CLK_CLKSEL2_PWM1SEL_PCLK1, 0);

    /* Reset PWM1 channel 0~5 */
    SYS_ResetModule(PWM1_RST);
}
/**************************************************************************//**
 * @file     NuEdu-NuEdu-Basic01_RGBLED.c
 * @version  V1.00
 * $Revision: 5 $
 * $Date: 15/09/02 10:02a $
 * @brief    NuEdu-Basic01_RGBLED driver source file for NuEdu-SDK-M451 
 *
 * @note
 * Copyright (C) 2014~2015 Nuvoton Technology Corp. All rights reserved.
*****************************************************************************/
#include <stdio.h>
#include "M451Series.h"
#include "NuEdu-Basic01_RGBLED.h"

/** @addtogroup M451_Library M451 Library
  @{
*/

/** @addtogroup NuEdu-SDK-M451_Basic01 M451_Basic01 Library
  @{
*/

/** @addtogroup M451_Basic01_FUNCTIONS RGB LED Functions
  @{
*/

/**
 * @brief       Set multi-function pins for PWM1 channel 0,1,2
 * @return      None
 */
void Initial_PWM_LED(void)
{
    /* Set PC9~PC11 multi-function pins for PWM1 Channel0~2  */
    SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC9MFP_Msk | SYS_GPC_MFPH_PC10MFP_Msk | SYS_GPC_MFPH_PC11MFP_Msk);
    SYS->GPC_MFPH |= SYS_GPC_MFPH_PC9MFP_PWM1_CH0 | SYS_GPC_MFPH_PC10MFP_PWM1_CH1 | SYS_GPC_MFPH_PC11MFP_PWM1_CH2;

    /* Enable PWM module clock */
    CLK_EnableModuleClock(PWM1_MODULE);

    /* Select PWM module clock source */
    CLK_SetModuleClock(PWM1_MODULE, CLK_CLKSEL2_PWM1SEL_PCLK1, 0);

    /* Reset PWM1 channel 0~5 */
    SYS_ResetModule(PWM1_RST);
}

/**
 * @brief       Set PWM clock enable and HCLK as PWM clock source,
  *
 * @param[in]   ch        Channel numbers that will be enabled.
 *                                    
 * @param[in]   ch0_fre        Channel 0 frequency.
 *                                    
 * @param[in]   ch0_dut        Channel 0 duty.
 *
 * @param[in]   ch1_fre        Channel 1 frequency.
 *                                    
 * @param[in]   ch1_dut        Channel 1 duty.
 *
 * @param[in]   ch2_fre        Channel 2 frequency.
 *                                    
 * @param[in]   ch2_dut        Channel 2 duty.
 *
 * @return      None
 */
void PWM_LED(unsigned char ch, unsigned int ch0_fre, unsigned int ch0_dut, unsigned int ch1_fre, unsigned int ch1_dut, unsigned int ch2_fre, unsigned int ch2_dut)
{
    /* set PWMA channel 1 output configuration */
    PWM_ConfigOutputChannel(PWM1, 0, ch0_fre, ch0_dut);
    PWM_ConfigOutputChannel(PWM1, 1, ch1_fre, ch1_dut);
    PWM_ConfigOutputChannel(PWM1, 2, ch2_fre, ch2_dut);

    /* Enable PWM Output path for PWMA channel 0 */
    PWM_EnableOutput(PWM1, ch);

    // Start
    PWM_Start(PWM1, ch);
}

/*@}*/ /* end of group M451_Basic01_FUNCTIONS */

/*@}*/ /* end of group NuEdu-SDK-M451_Basic01 */

/*@}*/ /* end of group M451_Library */

/*** (C) COPYRIGHT 2013~2015 Nuvoton Technology Corp. **/
uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32UnitTimeNsec, uint32_t u32CaptureEdge)
{
    uint32_t u32Src;
    uint32_t u32PWMClockSrc;
    uint32_t u32NearestUnitTimeNsec;
    uint16_t u16Prescale = 1, u16CNR = 0xFFFF;

    if(pwm == PWM0)
        u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_PWM0SEL_Msk;
    else//(pwm == PWM1)
        u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_PWM1SEL_Msk;

    if(u32Src == 0)
    {
        //clock source is from PLL clock
        u32PWMClockSrc = CLK_GetPLLClockFreq();
    }
    else
    {
        //clock source is from PCLK
        SystemCoreClockUpdate();
        u32PWMClockSrc = SystemCoreClock;
    }

    u32PWMClockSrc /= 1000;
    for(u16Prescale = 1; u16Prescale <= 0x1000; u16Prescale++)
    {
        u32NearestUnitTimeNsec = (1000000 * u16Prescale) / u32PWMClockSrc;
        if(u32NearestUnitTimeNsec < u32UnitTimeNsec)
        {
            if(u16Prescale == 0x1000)  //limit to the maximum unit time(nano second)
                break;
            if(!((1000000 * (u16Prescale + 1) > (u32NearestUnitTimeNsec * u32PWMClockSrc))))
                break;
            continue;
        }
        break;
    }

    // convert to real register value
    // every two channels share a prescaler
    PWM_SET_PRESCALER(pwm, u32ChannelNum, --u16Prescale);

    // set PWM to down count type(edge aligned)
    (pwm)->CTL1 = ((pwm)->CTL1 & ~(PWM_CTL1_CNTTYPE0_Msk << (2 * u32ChannelNum))) | (1UL << (2 * u32ChannelNum));
    // set PWM to auto-reload mode
    (pwm)->CTL1 &= ~(PWM_CTL1_CNTMODE0_Msk << u32ChannelNum);
    PWM_SET_CNR(pwm, u32ChannelNum, u16CNR);

    return (u32NearestUnitTimeNsec);
}

/**
 * @brief This function Configure PWM generator and get the nearest frequency in edge aligned auto-reload mode
 * @param[in] pwm The pointer of the specified PWM module
 *                - PWM0 : PWM Group 0
 *                - PWM1 : PWM Group 1
 * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
 * @param[in] u32Frequency Target generator frequency
 * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
 * @return Nearest frequency clock in nano second
 * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect
 *       existing frequency of other channel.
 */
uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle)
{
    uint32_t u32Src;
    uint32_t u32PWMClockSrc;
    uint32_t i;
    uint16_t u16Prescale = 1, u16CNR = 0xFFFF;

    if(pwm == PWM0)
        u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_PWM0SEL_Msk;
    else//(pwm == PWM1)
        u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_PWM1SEL_Msk;

    if(u32Src == 0)
    {
        //clock source is from PLL clock
        u32PWMClockSrc = CLK_GetPLLClockFreq();
    }
    else
    {
        //clock source is from PCLK
        SystemCoreClockUpdate();
        u32PWMClockSrc = SystemCoreClock;
    }

    for(u16Prescale = 1; u16Prescale < 0xFFF; u16Prescale++)//prescale could be 0~0xFFF
    {
        i = (u32PWMClockSrc / u32Frequency) / u16Prescale;
        // If target value is larger than CNR, need to use a larger prescaler
        if(i > (0x10000))
            continue;

        u16CNR = i;
        break;
    }
    // Store return value here 'cos we're gonna change u16Prescale & u16CNR to the real value to fill into register
    i = u32PWMClockSrc / (u16Prescale * u16CNR);

    // convert to real register value
    // every two channels share a prescaler
    PWM_SET_PRESCALER(pwm, u32ChannelNum, --u16Prescale);
    // set PWM to down count type(edge aligned)
    (pwm)->CTL1 = ((pwm)->CTL1 & ~(PWM_CTL1_CNTTYPE0_Msk << (2 * u32ChannelNum))) | (1UL << (2 * u32ChannelNum));
    // set PWM to auto-reload mode
    (pwm)->CTL1 &= ~(PWM_CTL1_CNTMODE0_Msk << u32ChannelNum);

    PWM_SET_CNR(pwm, u32ChannelNum, --u16CNR);
    if(u32DutyCycle)
    {
        PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1) / 100 - 1);
        (pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum * 2));
        (pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << (u32ChannelNum * 2 + PWM_WGCTL0_PRDPCTL0_Pos));
        (pwm)->WGCTL1 &= ~((PWM_WGCTL1_CMPDCTL0_Msk | PWM_WGCTL1_CMPUCTL0_Msk) << (u32ChannelNum * 2));
        (pwm)->WGCTL1 |= (PWM_OUTPUT_HIGH << (u32ChannelNum * 2 + PWM_WGCTL1_CMPDCTL0_Pos));
    }
    else
    {
        PWM_SET_CMR(pwm, u32ChannelNum, 0);
        (pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum * 2));
        (pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << (u32ChannelNum * 2 + PWM_WGCTL0_ZPCTL0_Pos));
        (pwm)->WGCTL1 &= ~((PWM_WGCTL1_CMPDCTL0_Msk | PWM_WGCTL1_CMPUCTL0_Msk) << (u32ChannelNum * 2));
        (pwm)->WGCTL1 |= (PWM_OUTPUT_HIGH << (u32ChannelNum * 2 + PWM_WGCTL1_CMPDCTL0_Pos));
    }

    return(i);
}

/**
 * @brief Start PWM module
 * @param[in] pwm The pointer of the specified PWM module
 *                - PWM0 : PWM Group 0
 *                - PWM1 : PWM Group 1
 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
 *                           Bit 0 is channel 0, bit 1 is channel 1...
 * @return None
 * @details This function is used to start PWM module.
 */
void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask)
{
    (pwm)->CNTEN |= u32ChannelMask;
}

PWM原理

  隨著電子技術(shù)的發(fā)展,出現(xiàn)了多種PWM技術(shù),其中包括:相電壓控制PWM、脈寬PWM法、隨機(jī)PWM、SPWM法、線電壓控制PWM等,而在鎳氫電池智能充電器中采用的脈寬PWM法,它是把每一脈沖寬度均相等的脈沖列作為PWM波形,通過改變脈沖列的周期可以調(diào)頻,改變脈沖的寬度或占空比可以調(diào)壓,采用適當(dāng)控制方法即可使電壓與頻率協(xié)調(diào)變化?梢酝ㄟ^調(diào)整PWM的周期、PWM的占空比而達(dá)到控制充電電流的目的。   

  模擬信號(hào)的值可以連續(xù)變化,其時(shí)間和幅度的分辨率都沒有限制。9V電池就是一種模擬器件,因?yàn)樗妮敵鲭妷翰⒉痪_地等于9V,而是隨時(shí)間發(fā)生變化,并可取任何實(shí)數(shù)值。與此類似,從電池吸收的電流也不限定在一組可能的取值范圍之內(nèi)。模擬信號(hào)與數(shù)字信號(hào)的區(qū)別在于后者的取值通常只能屬于預(yù)先確定的可能取值集合之內(nèi),例如在{0V, 5V}這一集合中取值。   

  模擬電壓和電流可直接用來進(jìn)行控制,如對(duì)汽車收音機(jī)的音量進(jìn)行控制。在簡單的模擬收音機(jī)中,音量旋鈕被連接到一個(gè)可變電阻。擰動(dòng)旋鈕時(shí),電阻值變大或變;流經(jīng)這個(gè)電阻的電流也隨之增加或減少,從而改變了驅(qū)動(dòng)揚(yáng)聲器的電流值,使音量相應(yīng)變大或變小。與收音機(jī)一樣,模擬電路的輸出與輸入成線性比例。   

  盡管模擬控制看起來可能直觀而簡單,但它并不總是非常經(jīng)濟(jì)或可行的。其中一點(diǎn)就是,模擬電路容易隨時(shí)間漂移,因而難以調(diào)節(jié)。能夠解決這個(gè)問題的精密模擬電路可能非常龐大、笨重(如老式的家庭立體聲設(shè)備)和昂貴。模擬電路還有可能嚴(yán)重發(fā)熱,其功耗相對(duì)于工作元件兩端電壓與電流的乘積成正比。模擬電路還可能對(duì)噪聲很敏感,任何擾動(dòng)或噪聲都肯定會(huì)改變電流值的大小。   

  通過以數(shù)字方式控制模擬電路,可以大幅度降低系統(tǒng)的成本和功耗。此外,許多微控制器和DSP已經(jīng)在芯片上包含了PWM控制器,這使數(shù)字控制的實(shí)現(xiàn)變得更加容易了。

  互補(bǔ)的意思就是當(dāng)pwm1是高電平時(shí),pwm2是低電平,如果pwm1是低電平時(shí)pwm2是高電平,總之是pwm1和pwm2不會(huì)同事變高或變低,總是不一樣的。
  一般這樣的pwm輸出用于控制由兩個(gè)開關(guān)管組成的在電源和地之間的橋,兩個(gè)同時(shí)接通的話會(huì)導(dǎo)致橋臂短路電源和地引起燒毀,互補(bǔ)的波形可避免同時(shí)導(dǎo)通。

 

開關(guān)管可不是瞬間就能開啟或關(guān)閉的。 
特別是推挽電路中,沒有死區(qū)的話,有可能造成直通短路。
即使是boost 電路,為了限制最大占空比,也得設(shè)計(jì)個(gè)死區(qū)時(shí)間啊,
具體設(shè)置多少要看所用開關(guān)管的開啟和關(guān)閉的延遲時(shí)間,
簡單的說,比如你有5V電源,要控制一臺(tái)燈的亮度,有一個(gè)傳統(tǒng)辦法,就是串聯(lián)一個(gè)可調(diào)電阻,改變電阻,燈的亮度就會(huì)改變。
還有一個(gè)辦法,就是PWM調(diào)節(jié)。不用串聯(lián)電阻,而是串聯(lián)一個(gè)開關(guān)。假設(shè)在1秒內(nèi),有0.5秒的時(shí)間開關(guān)是打開的,0.5秒關(guān)閉,那么燈就亮0.5秒,滅0.5秒。這樣持續(xù)下去,燈就會(huì)閃爍。如果把頻率調(diào)高一點(diǎn),比如是1毫秒,0.5毫秒開,0.5毫秒滅,那么燈的閃爍頻率就很高。我們知道,閃爍頻率超過一定值,人眼就會(huì)感覺不到。所以,這時(shí)你看不到燈的閃爍,只看到燈的亮度只有原來的一半。
同理,如果1毫秒內(nèi),0.1毫秒開,0.9毫秒滅,那么,燈的亮度就只有原來的10分之一。
這就是PWM的基本原理。專業(yè)的說法百度一下就很多,我說了也不專業(yè)。但是道理就是這么簡單,具體PWM還分幾種,總的來說,都是保持一定的電壓或電流不變,但改變一定周期內(nèi)的導(dǎo)通和關(guān)斷時(shí)間。這樣等效于保持導(dǎo)通,但改變電壓或電流大小。
這樣的PWM控制方式,在數(shù)字控制電路上應(yīng)用很方便。因?yàn)樽岆娔X去控制一個(gè)可調(diào)電阻是比較困難的,而且可調(diào)電阻還有模擬電路固有的不穩(wěn)定問題。
聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

麻城市| 宝鸡市| 吴川市| 肇源县| 五寨县| 广灵县| 沭阳县| 手游| 安达市| 乌拉特后旗| 冷水江市| 尼木县| 昌江| 民丰县| 平乐县| 北流市| 安达市| 同仁县| 鄂托克前旗| 高阳县| 新乡县| 习水县| 苏尼特左旗| 禄丰县| 杂多县| 米脂县| 乐东| 板桥市| 承德县| 故城县| 扶余县| 进贤县| 辰溪县| 龙州县| 新昌县| 成都市| 商丘市| 都匀市| 东平县| 明水县| 易门县|