Re: dsPIC30F6012A的12位ADC的疑问???
|
||||
---|---|---|---|---|
新會員
|
多谢版主指点!
發表於: 2008/1/7 20:52
|
|||
|
Re: dsPIC30F6012A的12位ADC的疑问???
|
||||
---|---|---|---|---|
新會員
|
多谢版主, 但教材是10位AD,我用的是12位AD,只有一个S/H通道 看了教材之后还有两个问题请版主再来指点一下! 1.用Timer3方式和自动采样自动转换方式哪一种方式更好一点呢? 用Timer3方式时间更精准吗? 我用的自动采样自动转换方式是想省一个Timer3定时器资源 2.比如我想10路AD,(an0~an9) 我想只扫描8路,第一次是an0~an5,an6,an7, 第二次是an0~an5,an8,an9,这样反复,然后每8次中断一次 我这样在中断里切换扫描通道可以,时间能保存准确吗? void InitADC(void) { ADCON1bits.ADON = 0; ADCHS = 0x0000; IPC2bits.ADIP = 7; // highest IFS0bits.ADIF = 0; IEC0bits.ADIE = 1; ADPCFGbits.PCFG0 = 0; // an0~an9,diagal ad ADPCFGbits.PCFG1 = 0; ADPCFGbits.PCFG2 = 0; ADPCFGbits.PCFG3 = 0; ADPCFGbits.PCFG4 = 0; ADPCFGbits.PCFG5 = 0; ADPCFGbits.PCFG6 = 0; ADPCFGbits.PCFG7 = 0; ADPCFGbits.PCFG8 = 0; ADPCFGbits.PCFG9 = 0; ADPCFGbits.PCFG10 = 1; ADPCFGbits.PCFG11 = 1; ADPCFGbits.PCFG12 = 1; ADPCFGbits.PCFG13 = 1; ADPCFGbits.PCFG14 = 1; ADPCFGbits.PCFG15 = 1; ADCSSLbits.CSSL0 = 0; //first scan an0~an7 ADCSSLbits.CSSL1 = 0; ADCSSLbits.CSSL2 = 0; ADCSSLbits.CSSL3 = 0; ADCSSLbits.CSSL4 = 0; ADCSSLbits.CSSL5 = 0; ADCSSLbits.CSSL6 = 0; ADCSSLbits.CSSL7 = 0; ADCSSLbits.CSSL8 = 1; ADCSSLbits.CSSL9 = 1; ADCSSLbits.CSSL10 = 1; ADCSSLbits.CSSL11 = 1; ADCSSLbits.CSSL12 = 1; ADCSSLbits.CSSL13 = 1; ADCSSLbits.CSSL14 = 1; ADCSSLbits.CSSL15 = 1; ADCON3bits.SAMC = 11; //Tsamp=11Tad,Tconv=14Tad ADCON3bits.ADCS = 19; //Tad=10Tcy Tsamp=13.75us,Tconv=17.5us ADCON2bits.VCFG = 0; // AVDD AVSS ADCON2bits.CSCNA = 1; // Scan ADCON2bits.SMPI = 7; //Pre8 interrupt ADCON2bits.BUFM = 0; //16Word ADCON2bits.ALTS = 0; //mux A ADCON1bits.FORM = 0; //unsigned integer ADCON1bits.SSRC = 9; //auto convert ADCON1bits.ASAM = 1; //auto sample ADCON1bits.ADON = 1; } void __attribute__ ((interrupt, no_auto_psv)) _ADCInterrupt(void) { IFS0bits.ADIF = 0; if(!ADCSSLbits.CSSL8) { ADCSSLbits.CSSL0 = 0; //first scan an0~an7 ADCSSLbits.CSSL1 = 0; ADCSSLbits.CSSL2 = 0; ADCSSLbits.CSSL3 = 0; ADCSSLbits.CSSL4 = 0; ADCSSLbits.CSSL5 = 0; ADCSSLbits.CSSL6 = 0; ADCSSLbits.CSSL7 = 0; ADCSSLbits.CSSL8 = 1; ADCSSLbits.CSSL9 = 1; ADCSSLbits.CSSL10 = 1; ADCSSLbits.CSSL11 = 1; ADCSSLbits.CSSL12 = 1; ADCSSLbits.CSSL13 = 1; ADCSSLbits.CSSL14 = 1; ADCSSLbits.CSSL15 = 1; } else { ADCSSLbits.CSSL0 = 0; //second scan an0~an7 ADCSSLbits.CSSL1 = 0; ADCSSLbits.CSSL2 = 0; ADCSSLbits.CSSL3 = 0; ADCSSLbits.CSSL4 = 0; ADCSSLbits.CSSL5 = 0; ADCSSLbits.CSSL6 = 1; ADCSSLbits.CSSL7 = 1; ADCSSLbits.CSSL8 = 0; ADCSSLbits.CSSL9 = 0; ADCSSLbits.CSSL10 = 1; ADCSSLbits.CSSL11 = 1; ADCSSLbits.CSSL12 = 1; ADCSSLbits.CSSL13 = 1; ADCSSLbits.CSSL14 = 1; ADCSSLbits.CSSL15 = 1; } }
發表於: 2008/1/5 9:59
|
|||
|
Re: dsPIC30F6012A的12位ADC的疑问???
|
||||
---|---|---|---|---|
版主
|
因為你的取樣時間算蠻慢的,可以考慮使用 Timer3 的 Trigger 來觸發 ADC 做轉換。 在 dsPIC30F Peripheral Module - 10-bit ADC 裡的教材裡有利用 Timer3來觸發 ADC 的範例,也有用 Syatem Clock 做自動取樣的範例。
另外有關 Tsamp & Tconv 的說明在這獎以的後面也有詳細的說明與使用方式。 http://www.microchip.com.tw/modules/mydownloads/viewcat.php?cid=4
發表於: 2008/1/4 14:52
|
|||
|
dsPIC30F6012A的12位ADC的疑问???
|
||||
---|---|---|---|---|
新會員
|
如果用自动采样自动转换方式的话,那个Tsamp与Tconv怎样设置才好一点!
比如我扫描10路AD,每路都是20ms内采样64个点,每10次采样/转换过程中断一次, 假设Fcy=8000000,我的程序如下: #define CHANNUM 10 #define SAMPNUM 64 uint g_Samples[CHANNUM][SAMPNUM] void InitADC1(void) { fAdcDone = FALSE; ADCON1bits.ADON = 0; ADCHS = 0x0000; IPC2bits.ADIP = 7; // highest IFS0bits.ADIF = 0; IEC0bits.ADIE = 1; ADPCFG = 0xC8D0; //an0~an3,an5,an8~an10,an12,an13 ADCSSL = 0x372F; ADCON3bits.SAMC=6; //Tsamp=6Tad,Tconv=14Tad ADCON3bits.ADCS=24; //Tad=12.5Tcy Tsamp=9.375us,Tconv=21.875us ADCON2bits.VCFG = 0; // AVDD AVSS ADCON2bits.CSCNA=1; // Scan ADCON2bits.SMPI=9; //Pre10 interrupt ADCON2bits.BUFM=0; //16Word ADCON2bits.ALTS=0; //mux A ADCON1bits.FORM=0; //unsigned integer ADCON1bits.SSRC=9; //auto convert ADCON1bits.ASAM=1; //auto sample ADCON1bits.ADON = 1; } void InitADC2(void) { fAdcDone = FALSE; ADCON1bits.ADON = 0; ADCHS = 0x0000; IPC2bits.ADIP = 7; // highest IFS0bits.ADIF = 0; IEC0bits.ADIE = 1; ADPCFG = 0xC8D0; //an0~an3,an5,an8~an10,an12,an13 10 channel ADCSSL = 0x372F; ADCON3bits.SAMC=11; //Tsamp=11Tad,Tconv=14Tad ADCON3bits.ADCS=19; //Tad=10Tcy Tsamp=13.75us,Tconv=17.5us ADCON2bits.VCFG = 0; // AVDD AVSS ADCON2bits.CSCNA=1; // Scan ADCON2bits.SMPI=9; //Pre10 interrupt ADCON2bits.BUFM=0; //16Word ADCON2bits.ALTS=0; //mux A ADCON1bits.FORM=0; //unsigned integer ADCON1bits.SSRC=9; //auto convert ADCON1bits.ASAM=1; //auto sample ADCON1bits.ADON = 1; } void __attribute__ ((interrupt, no_auto_psv)) _ADCInterrupt(void) { IFS0bits.ADIF = 0; static int iLoopCount = 0; int i; uint *p; //pre10 interrupt get 10 adcvalue==ADCBUF0~ADCBUF9 p = (uint *) & ADCBUF0; for(i = 0; i < CHANNUM; i++) g_Samples[i][iLoopCount] = *p++; // Cycle SAMPNUM=64 20ms if(++iLoopCount >= SAMPNUM) { iLoopCount = 0; fAdcDone = TRUE; } } 用InitADC1()方式设置的Tsamp和Tconv好 还是用InitADC2()方式设置的Tsamp和Tconv好呢? Tsamp与Tconv的时间选择这个问题一直困扰着我? 喜欢哪位大侠给讲讲了?
發表於: 2008/1/4 13:34
|
|||
|