久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8946|回復: 1
收起左側

新唐M051學習之(3)-PWM

[復制鏈接]
ID:75013 發表于 2015-3-21 17:44 | 顯示全部樓層 |閱讀模式
       今天學習PWM,把M051的手冊中關于PWM的那一章反反復復看了好幾遍,還是看的云里霧里,最后竟然看的打起盹來。后來覺的差不多了,打算動手寫個呼吸燈程序,鞏固一下學習成果。
      顧名思義,燈光在微電腦控制之下完成由亮到暗又由暗變亮的逐漸變化,感覺像是在呼吸。
      LED等插在P2.0口上(PWM0) 。如下圖。



/*********************************************************************************************
程序名:  PWM實驗   用PWM制作呼吸燈
編寫人:  閃閃發光的金子
編寫時間:2014年2月21日
硬件支持:M0516LNB 12MHz晶體
接口說明:    P2.0接LED正極
---------------------------------------------------

#include <stdio.h>
#include <M051Series.h>
#define PLLCON_SETTING      SYSCLK_PLLCON_50MHz_XTAL
#define PLL_CLOCK           50000000

    uint16_t g_u16PWMValue;
   
void SYS_Init(void)
{
/*---------------------------------------------------------------------------------------------------------*/
/* Init System Clock                                                                                       */
/*---------------------------------------------------------------------------------------------------------*/
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable External XTAL (4~24 MHz) */
    SYSCLK->PWRCON |= SYSCLK_PWRCON_XTL12M_EN_Msk;

    /* Waiting for 12MHz clock ready */
    SYS_WaitingForClockReady( SYSCLK_CLKSTATUS_XTL12M_STB_Msk);

    /* Switch HCLK clock source to XTAL */
    SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_XTAL;

    /* Set PLL to power down mode and PLL_STB bit in CLKSTATUS register will be cleared by hardware.*/
    SYSCLK->PLLCON|= SYSCLK_PLLCON_PD_Msk;

    /* Set PLL frequency */        
    SYSCLK->PLLCON = PLLCON_SETTING;

    /* Waiting for clock ready */
    SYS_WaitingForClockReady(SYSCLK_CLKSTATUS_PLL_STB_Msk);

    /* Switch HCLK clock source to PLL */
    SYSCLK->CLKSEL0 = SYSCLK_CLKSEL0_HCLK_PLL;

    /* Enable IP clock */
    //設置PWM0、PWM1的時鐘源      
    SYSCLK->APBCLK = SYSCLK_APBCLK_PWM01_EN_Msk;

    /* Select IP clock source */
    SYSCLK->CLKSEL1 = SYSCLK_CLKSEL1_PWM01_XTAL;

    /* Reset PWMB channel0~channel3 */                    
    SYS->IPRSTC2 = SYS_IPRSTC2_PWM47_RST_Msk;                    
    SYS->IPRSTC2 = 0;      


    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate PllClock, SystemCoreClock and CycylesPerUs automatically. */
    //SystemCoreClockUpdate();
    PllClock        = PLL_CLOCK;            // PLL
    SystemCoreClock = PLL_CLOCK / 1;        // HCLK
    CyclesPerUs     = PLL_CLOCK / 1000000;  // For SYS_SysTickDelay()

/*---------------------------------------------------------------------------------------------------------*/
/* Init I/O Multi-function                                                                                 */
/*---------------------------------------------------------------------------------------------------------*/
    /* P2.0 for PWM0 */
    SYS->P2_MFP = SYS_MFP_P20_PWM0 ;



    /* Lock protected registers */
    SYS_LockReg();
}
void PWMA_Init(void)
{
    //配置預分頻器 (PPR)
    PWMA->PPR = PWM_PPR_CP01(30) ;
    //配置時鐘選擇器(CSR)
    PWMA->CSR = PWM_CSR_CSR0(PWM_CSR_DIV16);

    /* Enable PWM0  counter. We must set PWM mode before setting CNR, CMR. */
    //如果設置PWM_PCR_CH0MOD_AUTO_RELOAD ,當PWM計數器達到0,自動重載CNR0的值到PWM計數器
    PWMA->PCR = PWM_PCR_CH0EN_Msk | PWM_PCR_CH0MOD_AUTO_RELOAD;

    //頻率計算公式
    /* PWM0 = 12000000 / 30 / 16 / 200 =    125Hz */
        PWMA->CNR0= 200;   //配置PWM計數器寄存器 (CNR) 設定PWM周期
    PWMA->CMR0= 100;   //配置比較器寄存器(CMR) 設定PWM占空比

    /* Enable PWM channle 0  Output */
    //配置相應的GPIO管腳為PWM功能(使能 POE 和禁用CAPENR).
    PWMA->POE = PWM_POE_PWM0_Msk;
}


int main(void)
{
    uint16_t i,j;
    SYS_Init();
    PWMA_Init();
    while(1)
    {
      //下面有小到大 然后由大到小 循環改變占空比大小,LED燈就會慢慢變亮,然后又慢慢變暗。
      //注意CMR的值不能大于CNR
        for (g_u16PWMValue = 1;g_u16PWMValue<200;g_u16PWMValue++)   
        {      
            PWMA->CMR0 = g_u16PWMValue;
            for(i=0;i<500;i++)  //延時
                for(j=0;j<100;j++);
        }
        for (g_u16PWMValue = 199;g_u16PWMValue>0;g_u16PWMValue--)   
        {      
            PWMA->CMR0 = g_u16PWMValue;
            for(i=0;i<500;i++)  //延時
                for(j=0;j<100;j++);
        }
    }
}





回復

使用道具 舉報

ID:124748 發表于 2016-6-2 19:15 | 顯示全部樓層
樓主,請問如何進行多路的PWM波輸出?為什么我的只能單個的輸出PWM波,
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜免费视频 | 日韩亚洲欧美一区 | 亚洲香蕉 | 美女福利视频 | 亚洲最大av | 国产精品一区在线 | 国产高清精品一区二区三区 | 日日精品| 国产一区二区三区久久 | 久青草影院 | 中文字幕二区三区 | 国产精品99久久久久久久久久久久 | 久草青青草 | www.欧美.com | 一级毛片免费完整视频 | 久久久久久999 | 中文字幕在线免费观看 | 欧美一卡二卡在线 | 精品日韩 | 九九综合 | 中文字幕av第一页 | 亚洲视频二区 | 亚洲欧美激情网 | www.色综合 | 国产99小视频 | 一区二区三区日 | 一区欧美 | 欧美黄色性生活视频 | 久久综合久色欧美综合狠狠 | 欧美三级在线 | 国产成人福利 | 国产一区二区麻豆 | 免费黄色的网站 | 日韩成人精品一区 | 欧美成ee人免费视频 | 国产日韩免费视频 | 久久亚洲视频网 | 亚洲午夜av久久乱码 | 99久久久久久久久 | 亚洲一区二区在线 | 最大av在线|