資源簡介
TimerOne庫文件

代碼片段和文件信息
/*
?*??Interrupt?and?PWM?utilities?for?16?bit?Timer1?on?ATmega168/328
?*??Original?code?by?Jesse?Tane?for?http://labs.ideo.com?August?2008
?*??Modified?March?2009?by?Jér?me?Despatis?and?Jesse?Tane?for?ATmega328?support
?*??Modified?June?2009?by?Michael?Polli?and?Jesse?Tane?to?fix?a?bug?in?setPeriod()?which?caused?the?timer?to?stop
?*
?*??This?is?free?software.?You?can?redistribute?it?and/or?modify?it?under
?*??the?terms?of?Creative?Commons?Attribution?3.0?United?States?License.?
?*??To?view?a?copy?of?this?license?visit?http://creativecommons.org/licenses/by/3.0/us/?
?*??or?send?a?letter?to?Creative?Commons?171?Second?Street?Suite?300?San?Francisco?California?94105?USA.
?*
?*/
#include?“TimerOne.h“
TimerOne?Timer1;??????????????//?preinstatiate
ISR(TIMER1_OVF_vect)??????????//?interrupt?service?routine?that?wraps?a?user?defined?function?supplied?by?attachInterrupt
{
??Timer1.isrCallback();
}
void?TimerOne::initialize(long?microseconds)
{
??TCCR1A?=?0;?????????????????//?clear?control?register?A?
??TCCR1B?=?_BV(WGM13);????????//?set?mode?as?phase?and?frequency?correct?pwm?stop?the?timer
??setPeriod(microseconds);
}
void?TimerOne::setPeriod(long?microseconds)
{
??long?cycles?=?(F_CPU?*?microseconds)?/?2000000;????????????????????????????????//?the?counter?runs?backwards?after?TOP?interrupt?is?at?BOTTOM?so?divide?microseconds?by?2
??if(cycles???else?if((cycles?>>=?3)???else?if((cycles?>>=?3)???else?if((cycles?>>=?2)???else?if((cycles?>>=?2)???else????????cycles?=?RESOLUTION?-?1?clockSelectBits?=?_BV(CS12)?|?_BV(CS10);??//?request?was?out?of?bounds?set?as?maximum
??ICR1?=?pwmPeriod?=?cycles;?????????????????????????????????????????????????????//?ICR1?is?TOP?in?p?&?f?correct?pwm?mode
??TCCR1B?&=?~(_BV(CS10)?|?_BV(CS11)?|?_BV(CS12));
??TCCR1B?|=?clockSelectBits;?????????????????????????????????????????????????????//?reset?clock?select?register
}
void?TimerOne::setPwmDuty(char?pin?int?duty)
{
??unsigned?long?dutyCycle?=?pwmPeriod;
??dutyCycle?*=?duty;
??dutyCycle?>>=?10;
??if(pin?==?1?||?pin?==?9)???????OCR1A?=?dutyCycle;
??else?if(pin?==?2?||?pin?==?10)?OCR1B?=?dutyCycle;
}
void?TimerOne::pwm(char?pin?int?duty?long?microseconds)??//?expects?duty?cycle?to?be?10?bit?(1024)
{
??if(microseconds?>?0)?setPeriod(microseconds);
??if(pin?==?1?||?pin?==?9)?{
????DDRB?|=?_BV(PORTB1);???????????????????????????????????//?sets?data?direction?register?for?pwm?output?pin
????TCCR1A?|=?_BV(COM1A1);?????????????????????????????????//?activates?the?output?pin
??}
??else?if(pin?==?2?||?pin?==?10)?{
????DDRB?|=?_BV(PORTB2);
????TCCR1A?|=?_BV(COM1B1);
??}
??setPwm
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4092??2009-06-26?14:34??TimerOne\TimerOne.cpp
?????文件???????1335??2009-06-26?14:35??TimerOne\TimerOne.h
?????文件????????171??2009-06-26?14:34??TimerOne\__MACOSX\._TimerOne.cpp
?????文件????????171??2009-06-26?14:35??TimerOne\__MACOSX\._TimerOne.h
?????目錄??????????0??2009-06-26?14:35??TimerOne\__MACOSX
?????目錄??????????0??2011-08-24?17:35??TimerOne
-----------?---------??----------?-----??----
?????????????????5769????????????????????6
- 上一篇:natbib.sty
- 下一篇:STM32 多通道 不同頻率 可變頻 pwm輸出
評論
共有 條評論