您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!
以前小看了定時器,發(fā)現(xiàn)這東西還真的很講究,那先復習復習吧。
先提提中斷:我的理解就是cpu執(zhí)行時,遇到中斷——根據(jù)對應的中斷源(硬件或軟件)——pc定位中斷入口地址,然后根據(jù)這里的函數(shù)指針——跳轉(zhuǎn)到相應的服務程序
之所以上面()了硬件或軟件,這里還涉及到向量中斷和非向量中斷:區(qū)別就在于確定中斷源,如果是硬件編碼了中斷源的,直接跳轉(zhuǎn)相應的服務函數(shù)則是向量中斷。而非向量中斷指的是:如果發(fā)生中斷了,但此時還不清楚是那個中斷,需要查找標志位來確定跳轉(zhuǎn)到那個中斷區(qū)域。
可以發(fā)現(xiàn)向量中斷肯定來的快些,這里為定時器的中斷來做好準備。
再來看看avr單片機的定時器:
定時器/計數(shù)1(16位)————分為普通模式,CTC模式,快速pwm模式,相位修正pwm模式,相位頻率修正pwm模式,輸入捕獲模式。
普通模式:
*1 寄存器TCCR1B (控制寄存器)
7 6 5 4 3 2 1 0
ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
CS12 CS11 CS10控制分頻(內(nèi):預分頻器):取值0-5對應了停止,無分頻,8,64,256,1024
當為110為下降沿驅(qū)動,111為上升沿驅(qū)動(外部):用于對外部信號的計數(shù)
*2上面的計數(shù)結(jié)果放在計數(shù)寄存器TCNT1,TCNT0中(高低8位)
*3中斷屏蔽寄存器(TIMSK)
OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
TOIE1 :設置為溢出中斷,置1
嘿嘿,有了上面的3個寄存器就可以做秒表等了——思路為:設定控制寄存器(內(nèi)分頻,還是外部計數(shù)?)——裝初值——設置中斷方式(這里用了溢出)——打開中斷
注意點:裝初值時需要先寫高位TCNT1,再寫低位TCNT0,讀時相反
TCCR1B=0x01;無分頻
TCNT1H=0x88;
TCNT1L=0x88;TIMSK|=BIT(2); 再開中斷 SREG|=bit(7); 這樣初始化oK!
由于avr不像51無int code等之類定義的方法,用的是#pragma data:code 底下為存儲的內(nèi)容
寫中斷也類似:#pragma interrupt_handler (中斷函數(shù)名:向量號)miao:9 (現(xiàn)在該理解向量中斷吧)
寫好申明后就寫函數(shù)體了 void miao(){中斷服務程序}
這樣作為普通用法就小功告成了
總結(jié)一下就是模式,初值,中斷 (對應的3個寄存器) 和具體C函數(shù)的寫法
CTC模式比較輸出模式: 用于輸出50%占空比的方波信號,用于產(chǎn)生準確的連續(xù)定時信號
硬件:對應了pd4,pd5輸出比較b和a
比較輸出
*1 寄存器TCCR1A(控制寄存器) 功能多了寄存器也分a、b了^_^
7 6 5 4 3 2 1 0
com1A1 COM1A0 com1B1 COM1B0 FOC1A FOC1B WGM11 WGM10
用到了4567和01 4、5控制b 6、7控制a
com1A(B)1 COM1A(B)0 一般用00和01 WGM11,WGM10放在底下講
0 0 普通i/0
0 1 比較匹配時輸出取反
1 0 比較匹配時輸出0
1 1 比較匹配時輸出1
*2 寄存器TCCR1B (控制寄存器)
7 6 5 4 3 2 1 0
ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
CS12、CS11、CS10為設置時鐘源的
WGM13,WGM12,WGM11,WGM10用于波形產(chǎn)生描述的位選擇,有對應的表0-15 這里選了4:CTC-OCR1A-立即更新-最大 OCR1A (16位)輸出比較寄存器-這里存放了上限值
設置的目的是,計數(shù)上升到了設定的上限后就電平取反
思路:先初始話,對應的復用i/o為輸出——設定com1A(B)1,COM1A(B)0 為比較輸出取反——設定上限值為ocr1A 就ok了
0CR1A可以根據(jù)公式計算:具體公式看手冊,這里因為我打不起來 o(∩_∩)o...哈哈
總結(jié)一下就是控制寄存器a,b以及上限的值即可產(chǎn)生方波
快速PWM
分8位9位10位快速pwm,以及自定義方式
我的理解:OCR1A存放上限值,這樣用上了A的功能,由上面可知A只能為方波了,且計數(shù)到這個值時取反
下限值通過OCR1B來確定的,從而計數(shù)到這個值置0,從而可以發(fā)現(xiàn)在一個周期內(nèi) OCROB即為高電平的時間(確定占空比)如圖
TCCR1A=0x63;TCCR1B=0x1B; 工作方式(快速pwm15,64分頻)和分頻系數(shù)
OcR1A=1249;OCCR1B=250; 設為100Hz PWM信號,和2毫秒的高電平時間
總結(jié)一下就是控制寄存器:由上限值,和分頻系數(shù)可以確定計數(shù)的時間,確定頻率
由下限值可以確定占空比
怎么樣?明白了嗎?o(∩_∩)o...
相位修正PWM
和快速pwm一樣,模式分8位9位10位快速pwm,以及自定義方式共5種對應123和10,11
相位修正其實和上面的方法相同,只不過到最大值時,不是取反,而是計數(shù)--,直到到了下限時取反
由上可以發(fā)現(xiàn)2圖的區(qū)別吧,一個為到TOP后,直接置0,后者為--,且在top不取反而是到了最小值是取的,周期故而也比快速的長了一倍,故頻率為快速pwm的一半,但是占空比不變,這也是為什么叫快速pwm的原因
TCCR1A=0x63;TCCR1B=0x13 工作方式(相位修正pwm11,64分頻)和分頻系數(shù)
OcR1A=1249;OCCR1B=250; 設為100Hz PWM信號,和2毫秒的高電平時間
相位頻率修正PWM
和相位修正的類似
輸入捕獲
上一篇:C語言字符串處理函數(shù)
掃碼關(guān)注我們
傳真:0755-82591176
郵箱:vicky@yingtexin.net
地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08