娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年01月21日(星期二)

正在發生

2020年01月21日 | MSP430 定時器輸出PWM波形

發布者:信息巫師 來源: eefocus關鍵字:MSP430  定時器輸出  PWM波形 手機看文章 掃描二維碼
隨時隨地手機看文章

硬件介紹:

MSP430系列單片機的TimerA結構復雜,功能強大,適合應用于工業控制,如數字化電機控制,電表和手持式儀表的理想配置。它給開發人員提供了較多靈活的選擇余地。當PWM 不需要修改占空比和時間時,TimerA 能自動輸出PWM,而不需利用中斷維持PWM輸出。


MSP430F16x和MSP430F14x單片機內部均含有兩個定時器,TA和TB;TA有三個模塊,CCR0-CCR2;TB含有CCR0-CCR67個模塊;其中CCR0模塊不能完整的輸出PWM波形(只有三種輸出模式可用);TA可以輸出完整的2路PWM波形;TB可以輸出6路完整的PWM波形。


定時器的PWM輸出有有8種模式:


輸出模式0  輸出模式:輸出信號OUTx由每個捕獲/比較模塊的控制寄存器CCTLx中的OUTx位定義,并在寫入該寄存器后立即更新。最終位OUTx直通。 

輸出模式1 置位模式:輸出信號在TAR等于CCRx時置位,并保持置位到定時器復位或選擇另一種輸出模式為止。 

輸出模式2 PWM翻轉/復位模式:輸出在TAR的值等于CCRx時翻轉,當TAR的值等于CCR0時復位。 

輸出模式3 PWM置位/復位模式:輸出在TAR的值等于CCRx時置位,當TAR的值等于CCR0時復位。 

輸出模式4 翻轉模式:輸出電平在TAR的值等于CCRx時翻轉,輸出周期是定時器周期的2倍。 

輸出模式5復位模式:輸出在TAR的值等于CCRx時復位,并保持低電平直到選擇另一種輸出模式。 

輸出模式6PWM翻轉/置位模式:輸出電平在TAR的值等于CCRx時翻轉,當TAR值等于CCR0時置位。 

輸出模式7PWM復位/置位模式:輸出電平在TAR的值等于CCRx時復位,當TAR的值等于CCR0時置位。


下圖是增計數模式下的輸出波形(本程序使用的是增模式3和7):

image

計數模式:


增計數模式 

捕獲/比較寄存器CCR0用作Timer_A增計數模式的周期寄存器,因為CCR0為16位寄存器,所以該模式適用于定時周期小于65 536的連續計數情況。計數器TAR可以增計數到CCR0的值,當計數值與CCR0的值相等(或定時器值大于CCR0的值)時,定時器復位并從0開始重新計數。

image

連續計數模式 

在需要65 536個時鐘周期的定時應用場合常用連續計數模式。定時器從當前值計數到0FFFFH后,又從0開始重新計數

image

增/減計數模式 

需要對稱波形的情況經??梢允褂迷?減計數模式,該模式下,定時器先增計數到CCR0的值,然后反向減計數到0。計數周期仍由CCR0定義,它是CCR0計數器數值的2倍。

image

TA定時器有比較、捕獲兩種工作方式;比較可以產生PWM波形等,捕獲可以精確的測量時間;這里用的是比較輸出。


硬件介紹就這么多了,其他的可以參考msp430x1xx_family_users_guide(用戶指南)。


程序實現:

本程序是直接從msp430f42x移植的,只改動了端口就能正常使用了。由此,430的模塊在不同的系列中是通用的,有關寄存器是一樣的;只是也許外部端口不太一樣。


程序初始化部分:完成TA相關寄存器的初始化。


char TAPwmInit(char Clk,char Div,char Mode1,char Mode2)

{

    TACTL = 0;                  //清除以前設置

    TACTL |= MC_1;              //定時器TA設為增計數模式  

    switch(Clk)                 //選擇時鐘源

    { 

        case 'A': case 'a':  TACTL|=TASSEL_1; break;    //ACLK

        case 'S': case 's':  TACTL|=TASSEL_2; break;    //SMCLK

        case 'E':            TACTL|=TASSEL_0; break;    //外部輸入(TACLK)

        case 'e':            TACTL|=TASSEL_3; break;    //外部輸入(TACLK取反)

        default :  return(0);                           //參數有誤

    } 

    switch(Div)                 //選擇分頻系數

    { 

        case 1:   TACTL|=ID_0; break;   //1

        case 2:   TACTL|=ID_1; break;   //2

        case 4:   TACTL|=ID_2; break;   //4

        case 8:   TACTL|=ID_3; break;   //8

        default :  return(0);           //參數有誤

    } 

    switch(Mode1)               //設置PWM通道1的輸出模式。

    { 

        case 'P':case 'p':          //如果設置為高電平模式

            TACCTL1 = OUTMOD_7;     //高電平PWM輸出

            P1SEL |= BIT2;          //從P1.2輸出 (不同型號單片機可能不一樣)

            P1DIR |= BIT2;          //從P1.2輸出 (不同型號單片機可能不一樣)              

            break;

        case 'N':case 'n':          //如果設置為低電平模式          

            TACCTL1 = OUTMOD_3;     //低電平PWM輸出

            P1SEL |= BIT2;          //從P1.2輸出 (不同型號單片機可能不一樣) 

            P1DIR |= BIT2;          //從P1.2輸出 (不同型號單片機可能不一樣)                

            break; 

        case '0':case 0:            //如果設置為禁用          

            P1SEL &= ~BIT2;         //P1.2恢復為普通IO口              

            break;                 

        default :  return(0);       //參數有誤

    } 

    switch(Mode2)                   //設置PWM通道1的輸出模式。

    { 

        case 'P':case 'p':          //如果設置為高電平模式

            TACCTL2 =OUTMOD_7;      //高電平PWM輸出

            P1SEL |= BIT3;          //從P1.3輸出 (不同型號單片機可能不一樣)

            P1DIR |= BIT3;          //從P1.3輸出 (不同型號單片機可能不一樣)

            break;

        case 'N':case 'n':          //如果設置為低電平模式          

            TACCTL2 =OUTMOD_3;      //低電平PWM輸出

            P1SEL |= BIT3;          //從P1.3輸出 (不同型號單片機可能不一樣)  

            P1DIR |= BIT3;          //從P1.3輸出 (不同型號單片機可能不一樣)              

            break; 

        case '0':case 0:            //如果設置為禁用          

            P1SEL &= ~BIT3;         //P1.3恢復為普通IO口              

            break;                 

        default :  return(0);       //參數有誤

    }    

    return(1);  

}

主要是設置TACTL寄存器,讓TA工作于增模式,設置時鐘源和分頻;CCTLx設置對應的輸出模式;并且打開相應端口的第二功能。


設置周期函數:設置PWM波形的周期,單位是多少個TACLK周期。


void TAPwmSetPeriod(unsigned int Period)

{

    TACCR0 = Period;

}

工作于增模式時,TA計數到TACCR0,設CCR0就完成了周期的設置。


設置占空比:設置TA的PWM輸出的有效電平的時間。


void TAPwmSetDuty(char Channel,unsigned int Duty)

{

    switch(Channel)

    {

        case 1: TACCR1=Duty; break; 

        case 2: TACCR2=Duty; break;    

    }

}

根據參數分別設置每一路的參數。


設置占空比,用千分比設置:


* 入口參數:Channel: 當前設置的通道號  1/2

            Percent: PWM有效時間的千分比 (0~1000) 

* 出口參數:無

* 說    明: 1000=100.0%  500=50.0% ,依次類推        

* 范    例: TAPwmSetPermill(1,300)設置PWM通道1方波的占空比為30.0%

            TAPwmSetPermill(2,825)設置PWM通道2方波的占空比為82.5%

            */

void TAPwmSetPermill(char Channel,unsigned int Percent)

{

    unsigned long int Period;

    unsigned int Duty;

    Period = TACCR0;

    Duty = Period * Percent / 1000;

    TAPwmSetDuty(Channel,Duty);

}

這個函數用千分比來設置PWM輸出的有效時間。方便程序的使用。


有關定時器,TI提供的大量的例程,這些歷程都很簡潔、清晰。需要其他功能可以自己根據例程編寫對應的程序。程序實現就這么多了,下面說下本程序的使用方法。


使用示例:

使用方式:依然是在工程中加入c文件;文件包含h頭文件;然后就可以正常使用本函數了。詳細參考示例工程和main.c。


main主要程序如下:


#include "msp430x16x.h"     //430寄存器頭文件

#include "TAPwm.h"          //TA PWM輸出程序庫頭文件


void main()

{

    // Stop watchdog timer to prevent time out reset

    WDTCTL = WDTPW + WDTHOLD;

    ClkInit();

    

    TAPwmInit('A',1,'P','P');   //將定時器TA初始化成為PWM發生器

                  //時鐘源=ACLK ; 無分頻;  通道1和通道2均設為高電平模式。

    TAPwmSetPeriod(500);        //通道1/2的PWM方波周期均設為500個時鐘周期

    TAPwmSetDuty(1,200);        //1通道 有效200個時鐘周期

    TAPwmSetPermill(2,200);     //2通道 20.0%


    LPM0;

}

本程序調用程序庫,產生兩路PWM波形。


TA的PWM輸出就到這兒了,如果需要更多路的PWM波,可以使用TB,他可以產生6路完整的PWM波形;可以參考本程序編寫TB的波形輸出程序。有什么不足之處,歡迎評論,討論。

關鍵字:MSP430  定時器輸出  PWM波形 引用地址:MSP430 定時器輸出PWM波形

上一篇:MSP430常見問題解答
下一篇:MSP430晶振配置詳解

推薦閱讀

中科曙光“賦能數據 智領中國”主題客戶會在三亞舉行。會上,中科曙光對其2017年發布的“數據中國智能計劃”進行了詳細解讀,披露了更多實施細節和最新進展,并將“依托大數據和大計算,助力創建AI城市,構造科學大腦”明確為該計劃的兩大目標。2017年,隨著“人工智能”被寫入政府工作報告和國務院《新一代人工智能發展規劃》的印發,發展人工智能提升至...
據報道,瑞士和英國研究人員日前在美國雜志上發表報告說,他們開發出一款柔性微型機器人。“像活體微生物”一般,這款機器人可在有黏性或快速流動的液體中“游泳”,未來有望將藥物送達體內的病灶組織。 論文通訊、瑞士蘇黎世聯邦理工大學的布拉德利·內爾松說,自然界有許多隨環境變化而變形的微生物,他們由此受到啟發,開發了這款機器人。 瑞士蘇...
近日,比亞迪發布了“刀片電池”,在業內產生了較大的反響,同時股價也有明顯上漲。那么比亞迪的“刀片電池”是什么、它相比傳統的動力電池又有哪些優點?近日,比亞迪董事長王傳福對外宣布比亞迪的“刀片電池”將于今年3月在重慶工廠開始量產,并在6月上市的比亞迪漢EV中首次搭載。消息一出,資本市場立馬做出反應,比亞迪股票一度漲停。所謂的“刀片電池...
開發Arm程序的時候,大多數時候我們使用C/C++語言就可以了,但匯編語言在某些情況下能夠實現一些C語言無法實現的功能,這時候就要調用一些匯編語言的程序.我們需要大概了解一下在C語言中如何嵌入匯編語言.1.內嵌匯編語言的語法: __asm { 指令[;指令] ...... [指令] }2.舉例:使能/禁止IRQ中斷 __inline v...

史海拾趣

問答坊 | AI 解惑

AT89S52中文資料

那我再試一下吧…

查看全部問答∨

請教wince 中的多fat32分區問題

目前我在uboot中增加了一個fat32分區,現在總共一個binfs分區,一個1m的fat32分區,剩下的就為另一個fat32分區。在系統起來后存儲管理器的屬性中能看到part00,part01,part*02。第一個是binfs分區,后兩個為fat分區,感覺part01好象沒有mount上, ...…

查看全部問答∨

小問題,大分貼,PLC通訊基礎問題!

以前一直是做應用軟件,很少接觸到工控這塊。PLC儀器是omron SYSMAC CPM2AH,通過RS232串口連接通訊,目前我這只有一些地址表(比如00011、00100、00102、01307)等等,我看了網絡上的說明只明白大致獲取、寫入狀態命令格式,其他的大致不知道怎樣 ...…

查看全部問答∨

VxWorks內存管理方案

    改進的緩沖區管理模塊的作用在于加強VxWorks實時操作系統對內存的管理,并為上層應用程序提供所需內存申請和釋放工作。因此改進模塊位于VxWorks實時操作系統模塊和應用程序模塊之間。     CPU實際物理內存在bootRoom啟動 ...…

查看全部問答∨

大俠救命,關于pxa310 eboot燒寫問題!

開發板是 pxa310 handheld platform development kit 燒寫軟件是用 marvell(R)XDB JTAG Debugger(SDT2.1) 在燒寫中出現的錯誤是: Executing Initialization Script... Downloading burn algorithm to the target... Error: Operation failed! ...…

查看全部問答∨

在EVC下使用PolyPolygon畫圖的問題

我要用GDI中的PolyPolygon來填充一個區域 ,這個區域大小不定,如果這個區域不是很大的時候,還算正常,但是這個區域大了,填充時會很慢,這是為什么,大家有沒有好的解決辦法呢…

查看全部問答∨

DIY小車,這樣的方案行嗎?

最近有點閑,想找點事樂呵樂呵,做一個智能小車吧! 目標是:開始的時候實現通過上位機軟件遙控小車運動,等以后買了傳感器實現自適應蔽障或追蹤活動目標 可是小馬達驅動部分沒有專門的驅動芯片,BUT,我這里有很多75NF75和2907之類的MOS管(大家 ...…

查看全部問答∨

LED數碼管的安裝

主要材料:LED護欄燈;護欄燈安裝卡子,防水變壓器,LED護欄燈主控器,LED護欄燈分控器, 輔助材料:公 母插頭,超五類網線,兩芯電源線,自攻螺絲,膠粒等 LED外控護欄燈安裝步驟: 第一步:先將LED護欄燈安裝到墻體上:在墻體上打孔,裝膨脹螺 ...…

查看全部問答∨

大家的液晶驅動與MCU是用什么接口阿?

                                 想節約MCU的I/O資源阿…

查看全部問答∨

請教:關于STM32掉電

                                 想在STM32掉電是,向FLASH寫一個字節數據,下次上電時讀取該數據。不知道各位大蝦有什么方案,分享一下了。謝謝…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 界首市| 巩义市| 叙永县| 子长县| 乌鲁木齐市| 霸州市| 香港| 荆门市| 无为县| 靖远县| 临桂县| 三都| 恩平市| 陆良县| 特克斯县| 青冈县| 舞阳县| 什邡市| 沐川县| 昌都县| 江华| 和顺县| 靖江市| 桂东县| 贵阳市| 松潘县| 吉隆县| 元阳县| 林芝县| 保康县| 津市市| 巩义市| 珲春市| 上高县| 宝应县| 溧水县| 岢岚县| 靖州| 清远市| 龙南县| 盘山县|