一 ?實(shí)驗(yàn)?zāi)康?/b>
1.培養(yǎng)從示例代碼、用戶手冊(cè)快速學(xué)習(xí)相應(yīng)功能使用方法的能力。
2.學(xué)會(huì)偷懶,讓代碼更容易修改、提高可讀性。
3.學(xué)習(xí)msp430中的時(shí)鐘系統(tǒng)(UCS)與定時(shí)器(WDT、Timer)。
4.初步掌握msp430中12位ADC的使用。
二 ADC12
ADC的概念在Arduino中已經(jīng)介紹過(guò)了。本節(jié)課我們使用口袋版上的撥碼電位器作為模擬信號(hào)輸入,原理圖p2。
先學(xué)習(xí)msp430使用ADC的主要步驟與設(shè)置:分別閱讀example/adc12文件夾下的adc12_a_ex1_avccRef.c,?adc12_a_ex2_intRef.c,?adc12_a_ex3_extRef.c 講一下能看懂多少。注:GPIO_setAsPeripheralModuleFunctionInputPin是將該引腳設(shè)為使用外置功能,要不然這個(gè)引腳只是在簡(jiǎn)單的GPIO數(shù)字開(kāi)關(guān)的工作狀態(tài)。(參考ppt第三講.p75~p78)
初步認(rèn)識(shí)寄存器:
1.通過(guò)中斷函數(shù)中出現(xiàn)的ADC12IV,看一下寄存器用戶手冊(cè)中的介紹。(開(kāi)始接觸用戶手冊(cè))
2.通過(guò)加中斷,在debug模式中查看ADCMEM0的值。
實(shí)驗(yàn)內(nèi)容:
撥動(dòng)撥碼電位器,LED1~LED6順序點(diǎn)亮,ADC讀到的值越大亮的燈越多。
不使用ADCMEM0區(qū)塊儲(chǔ)存,換用其他區(qū)塊,改寫(xiě)程序中參數(shù)設(shè)置部分和中斷case部分,重新實(shí)現(xiàn)上面的實(shí)驗(yàn)。
*.改變硬件接法,將麥克風(fēng)MIC與運(yùn)放OPA_IN相連,OPA_OUT連接到另一個(gè)ADC輸入端口,繼續(xù)使用上面的程序,觀察現(xiàn)象。
三 了解UCS內(nèi)部時(shí)鐘系統(tǒng)
介紹:


實(shí)驗(yàn)內(nèi)容:
直接使用ucs_ex3_XT1SourcesACLK.c的代碼,用示波器觀察。
*.參考上面的例程,自己查找硬件接線原理圖,找到XT2晶振XT2IN和XT2OUT的GPIO復(fù)用引腳,同時(shí)找到SMCLK時(shí)鐘輸出的GPIO復(fù)用引腳,輸出XT2晶振信號(hào)??纯词遣皇?MHz
四 看門(mén)狗
用亍在“程序跑飛”時(shí),WDT就會(huì)產(chǎn)生溢出,從而產(chǎn)生系統(tǒng)復(fù)位,CPU需要重新運(yùn)行用戶程序,這樣程序就可以又回到正常運(yùn)行狀態(tài)。計(jì)數(shù)模式看ppt第二講p31以后。
實(shí)驗(yàn)內(nèi)容:
運(yùn)行wdt_a_ex3_watchdogACLK.c,分析現(xiàn)象
改變WDT_A_initWatchdogTimer函數(shù)中的CLOCKDIVIDER參數(shù),觀察現(xiàn)象,了解不同分頻的影響
*.改變WDT_A_initWatchdogTimer函數(shù)中的CLOCKSOURCE參數(shù),用示波器觀察現(xiàn)象?
五 計(jì)數(shù)器
計(jì)數(shù)器輸出模式在ppt第二講p63~p66。timer_a_ex2_continousModeOperationWithCCR0Interrupt.c
實(shí)驗(yàn)內(nèi)容:
用計(jì)數(shù)器定時(shí)功能實(shí)現(xiàn)跑馬燈。思考這種“延遲”方法和__delay_cycles的區(qū)別。已知例程中默認(rèn)使用的SMCLK時(shí)鐘頻率約為1.045MHz,而計(jì)數(shù)寄存器(也就是函數(shù)參數(shù)要設(shè)置的值)param.timerPeriod是16位的(可以看到類(lèi)型為uint16_t),也就是最大計(jì)數(shù)值為2^16-1,按默認(rèn)設(shè)置計(jì)數(shù)到65536/1045000秒的時(shí)候就會(huì)溢出,但是我們想觀察到明顯的跑馬燈現(xiàn)象,每個(gè)燈亮滅之間延時(shí)起碼要在0.1s以上,可以怎么實(shí)現(xiàn)呢?(tips:改用更慢的時(shí)鐘源、分頻、代碼里加計(jì)數(shù)變量)
思考:接著上面的實(shí)驗(yàn),實(shí)現(xiàn)一個(gè)和第一節(jié)課delayms函數(shù)功能相似的“延時(shí)”函數(shù)。注意時(shí)鐘源的選擇。
應(yīng)用:PWM:ppt第二講p69~p72。timer_a_ex1_pwmSingle.c。由于沒(méi)有示波器,就用頻率較慢的(32.768kHz)的ACLK時(shí)鐘,手動(dòng)從P2.0接一條線出來(lái)到之前Arduino時(shí)候用的LED模塊上面,實(shí)現(xiàn)大概亮0.75s滅0.25s的閃爍。參考參數(shù)TIMER_PERIOD為32768(周期為1s,所以和時(shí)鐘頻率相等),DUTY_CYCLE為32768*0.75。成功之后再嘗試改變param.clockSourceDivider參數(shù),看看亮滅時(shí)間有什么變化。
參考我發(fā)的adc+timer(PWMled).zip(不過(guò)我之前好像使用寄存器法寫(xiě)的...),寫(xiě)一個(gè)用撥碼電位器或者麥克風(fēng)控制大LED的亮度的程序
大功率LED驅(qū)動(dòng)
在init初始化函數(shù)中:
//LED H-bridge 電路圖見(jiàn)原理圖p5直流電機(jī)模塊
//P2.4->TA2.1 P2.5->TA2.2 接到了TimerA2.1和2.2為了用PWM輸出
//P1.5 NLSLEEP 高電平時(shí)模塊工作
//GPIO的寄存器說(shuō)明在ppt1的p87
P1DIR |= BIT5; //將P1.5設(shè)置為輸出,|=為或操作,把某一位置1時(shí)用到
P2DIR |= BIT4 + BIT5; //將P2.4,P2.5口設(shè)置為輸出
P2SEL |= BIT4 + BIT5; //將P2.4,P2.5口設(shè)置為使用外置功能
在開(kāi)關(guān)LED時(shí):
P1OUT |= BIT5; // NLSLEEP high to enable ,開(kāi)
P1OUT &=~ BIT5; //關(guān),&=與運(yùn)算,~非運(yùn)算
位運(yùn)算舉例:
xxxxxxxx |= 00100000 = xx1xxxxx
xxxxxxxx & ~(00100000) =xxxxxxxx &11011111 = xx0xxxxx