Browsing this Thread:
2 Anonymous Users
|
CCP(1)
|
|
資深會員
Joined
: 2009/8/17 13:53 最後登入時間
: 2013/9/4 9:22
Group:
註冊會員
Level : 12 HP : 0 / 277 MP : 56 / 12252 EXP : 9
|
#include <p18f4520.h> #include <delays.h> #include <adc.h> #include <timers.h>
#pragma config OSC=HS, BOREN=OFF, BORV = 2, PWRT=ON, WDT=OFF, LVP=OFF
void CCP1_isr(void);
#pragma code low_vector=0x18 void interrupt_at_low_vector(void) { _asm GOTO CCP1_isr _endasm } #pragma code
#pragma interruptlow CCP1_isr
void CCP1_isr (void) { INTCONbits.GIEH=0; ; Delay10TCYx(5); ConvertADC() ; while(BusyADC()); if (PORTDbits.RD0) PORTD = (ADRESH & 0xFE) ; else PORTD = (ADRESH | 0x01) ;
CCPR1H = ADRESH; // 將PWM設定為ADC結果 PIR1bits.CCP1IF = 0; // 清除中斷旗標 INTCONbits.GIEH=1; // 啟動所有的中斷 }
void main () { PORTD = 0x00; TRISD = 0;
TRISCbits.TRISC2 = 0; // 設定CCP1為輸出 CCP1CON = 0x0B; //=>00001011 // 設定CCP模組 CCPR1H = 0; //這句的用意不了解 // 設定PWM週期為一個微小值以避免全部為0 CCPR1L = 0x80; //b'10000000=128 T3CONbits.T3CCP2=0; // 設定TIMER1為CCP時序來源 T3CONbits.T3CCP1=0; IPR1bits.CCP1IP=0; // 設定CCP為低優先中斷 PIR1bits.CCP1IF=0; // 清除中斷旗標 PIE1bits.CCP1IE=1; // 啟動CCP中斷
ADCON0=0x01; // 選擇AN0通道轉換,開啟ADC模組 ADCON1=0x0E; // 使用VDD,VSS為參考電壓,設定AN0為類比輸入 ADCON2=0x3A; // 結果向左靠齊並設定轉換時間為Fosc/32,採樣時間為20TAD
/*OpenTimer1( TIMER_INT_OFF & // 初始化TIMER1 T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_8 & T1_OSC1EN_OFF & T1_SYNC_EXT_ON );*/ T1CON=0xB5;
RCONbits.IPEN=1; //啟動中斷優先順序的功能 INTCONbits.GIEL=1; // 啟動所有的低優先中斷 INTCONbits.GIEH=1; // 啟動所有的高優先中斷
while(1) ; // 永久迴圈 }
這是CCP模組的比較模式,配合TIMER1訊號發生,然後用類比壓,改變輸出訊號的period 這題把timer1設定成ccp1的計時器!但timer1到底是怎麼計時的,使cpp1和timer1符合比較數值的呢?這點一直不通,後面的章節一直走不下去!可以請各位指導一下嗎?後面另外有解說它的工作週期為50%,不是PWM下,這個工作期要怎麼算的?
發表於: 2009/11/19 10:30
|
|
You can view topic.
你 不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.