• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users






Re: 求教A/D转换问题!
#8
版主
版主


查看用戶資訊
Timer 3 觸發 – 範例程式
void _ISR _ADCInterrupt(void)
{
        
IFS0bits.ADIF ;        // 清除 ADIF 中斷旗號
        
ADC_Buf ADCBUF0 ;    // 讀取 AD 的轉換值
        
LED16 = !LED16 ;    // LED16 轉態一次供量取訊號除錯用
}

本範例是 Timer 3 觸發 AD 轉換,待 AD 轉換完成時立即產生中斷
注意 
SAMP 位元硬體會自動設定(取樣)與清除(轉換),軟體毋需
設定此位元


Void  Timer3_Initial 
void )
{
    
ConfigIntTimer3 T3_INT_PRIOR_7 T3_INT_OFF ) ;      //中斷禁能
    
OpenTimer3 T3_ON T3_IDLE_STOP T3_GATE_OFF T3_PS_1_1 T3_SOURCE_INT ,  (((long)FCY/1000 )) ) ;    // 計時=1mS, 啟動 Timer3
}

void ADC10_Initial (void)
{
     
ADPCFG 0xFF7F;    // AN7/RB7 為類比電壓輸入腳 , 其它為一般  I/O
     
ADCON1 0x0046;    // 0b0000 0000 0100 0110 
                // 設定 Timer3 為 AD 轉換的觸發來源
                // A/D 採用自動取樣自動轉換模式
     
ADCON2 0x0000;    // 參考電壓 : Vref+ = Vdd, Vref- =Vss 
                //不採用輸入掃描方式, SMPI=000 ( 每次轉換完成就產生中斷 )
     
ADCSSL 0x0000;    // 不採用輸入掃描方式
     
ADCON3 0x1F3F;    // TAD = 8 Tcy , SAMC = 15 TAD 
    
ADCHS =  0x0007 ;    // CH0正端輸入選擇AN7,負端輸入為Vss
    
IEC0bits.ADIE ;    // 打開AD的中斷
    
IPC2bits.ADIP ;    // 中斷等級=7 ( 最高優先權中斷等級 )
     
ADCON1bits.ADON 1;    // 啟動 AD
}

--------------------------------------------------------------------------------------------------------------------------------
自動取樣與轉換 – 範例程式

#define FILTER_BLOCK_LENGTH 512     
int SigIn[FILTER_BLOCK_LENGTH]; 

InitADC12( );
     
ADCON1bits.ADON 1;

      for ( 
0FILTER_BLOCK_LENGTHi++ ) // Sample 512 A/D input
       
{
        while ( !
ADCON1bits.DONE );     // wait for end of conversion
        
ADCON1bits.DONE 0;          // reset DONE bit
        
SigIn[i] = ADCBUF0;            // store sample in SigIn buffer
    
}


void InitADC12(void)
{
IFS0bits.ADIF 0;                 // clear A/D interrupt flag
IEC0bits.ADIE 0;                 // disable A/D interrupt
ADCON1bits.ADON 0;               // turn off the A/D converter

ADPCFG 0xFFF7;  // PCFG3 = 0, only AN3 (RB3) input pin in analog mode
ADCHS 0x0003;   // CH0NB = 0, CH0SB = 0000, CH0SB = Vref-, CH0SA = AN3
ADCON1 0x03E4;  // ADON=0, FORM=Frational, SSRC=AD clock Trigger
                  // ASAM=Auto Sampling & Conversion
ADCON2 0x0000;  // VCFG = AVdd and AVss are used, CSCNA = disable scanning
                  // SMPI = 0000 , SMPI = 16-word buffer , ALTS = use MUX A 

ADCON3 0x1F3F;  // 0001 1111 0011 1111
    /****************************************************************/
    /* SAMC = 11111, sampling time is 31*Tad                        */
    /* ADRC = 0, A/D clock derived from system clock                */
    /* ADCS = 111111, Tad = (ADCS<5:0>+1)* Tcy/2, Tconv=14Tad       */
    /*--------------------------------------------------------------*/
    /*      Tad= 64*33.91nS/2 = 1.08512uS , Tconv= 15.1968uS        */
    /*  A/D = Tsample+Tconv= (32+14)1.08512= 49.915uS = 50uS(20KHz) */ 
    /****************************************************************/
       
ADCSSL 0x0000;               // 0000 0000 0000 0000
}


發表於: 2006/6/2 10:18
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 求教A/D转换问题!
#7
新會員
新會員


查看用戶資訊
首先谢谢您的帮忙!在您改的程序中确实可以得到正确的值,但是请您试一下去掉那个while(1),这个程序就不能正常地工作了,
#include <p30f4011.h>
unsigned int ADCValue;
int main(void)
{
ADPCFG = 0xFFFE; // <====這和你設定不同
ADCON1 = 0x00E0;
ADCSSL = 0;
ADCON3 = 0x1F02;
ADCON2 = 0;
ADCHS = 0x0000;
ADPCFGbits.PCFG0 = 0;
ADCON1bits.ADON = 1;
while(1) <-------去掉这个无限循环就不成了
{
ADCON1bits.DONE = 0; // <+++加這一行
ADCON1bits.SAMP = 1;
while (!ADCON1bits.DONE);
ADCValue = ADCBUF0; // <===中斷觀查點
}
}
我要编写的系统中要不定时的采样,如果加了while(1),那就不能跳回到主函数中,就无法继续执行了,我只想每次采样一个通道,手动开始,不采样时关掉A/D,研究了很久,还是不知道怎么能办到?如果您知道请您指点一下,不胜感激!!

發表於: 2006/5/30 21:20
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 求教A/D转换问题!
#6
新會員
新會員


查看用戶資訊
我試了你所寫的設定,我沒有4013,使用APP009(網站有資料)測試,全部程式如下,使用ICD2 debug mode
並無不正確的值,請自行對照一下吧!

#include <p30f4011.h>
unsigned int ADCValue;
int main(void)
{
ADPCFG = 0xFFFE; // <====這和你設定不同
ADCON1 = 0x00E0;
ADCSSL = 0;
ADCON3 = 0x1F02;
ADCON2 = 0;
ADCHS = 0x0000;
ADPCFGbits.PCFG0 = 0;
ADCON1bits.ADON = 1;
while(1)
{
ADCON1bits.DONE = 0; // <+++加這一行
ADCON1bits.SAMP = 1;
while (!ADCON1bits.DONE);
ADCValue = ADCBUF0; // <===中斷觀查點
}
}


發表於: 2006/5/25 11:30
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 求教A/D转换问题!
#5
新會員
新會員


查看用戶資訊
谢谢您的帮助!
当我用计数器T3做触发转换原时,采样值与真实值相近,也不会有什么变化!当我想手动采样,并且每次采样一次,怎么也做不好!
我用A/D转换回来的数据除以4095,再乘以5,就应该是单片机上端口的电压了吧!然后再把它对应到0-380就行了吧!电路是工厂的不方便贴,我觉得电路没问题!这是我手动采样的程序,请您帮忙看看!谢谢!
ADPCFG = 0xFFFF;
ADCON1 = 0x00E0;
ADCSSL = 0;
ADCON3 = 0x1F02;
ADCON2 = 0;
ADCHS = 0x0000;
ADPCFGbits.PCFG0 = 0;
ADCON1bits.ADON = 1;
ADCON1bits.SAMP = 1;
while (!ADCON1bits.DONE);
ADCValue = ADCBUF0;
不知什么原因总是不对????
请您指教!
不知道您那有没有手动采样的正确的程序?有的话能不能给我一份!不胜感激!我的邮箱是: qwg_17@163.com

發表於: 2006/5/19 14:44
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 求教A/D转换问题!
#4
新會員
新會員


查看用戶資訊
yuyu 寫到:
參照:

只采样AN0手动采样,只采一次,但回来的值与真实值差的很多,不知道是不是时间的的问题。
想请教您一下:我用A/D采样0--380的电压,经处理后转化成0--5的电压,对其进行12位A/D采样,回来的采样值应该如何处理啊?还有当我改变采样率的时候数据好像没什么变化,采样率不影响结果吗?
谢谢!初学,请您指教!


1. 不知您指的差很多是何種情形呢? 數值會不會隨電壓變化?
2. 先將電路與dsPIC分開,先使用電位計(可變電阻),使AN0電壓變化在0-5V之間,對照A/D數值是否在0-1023之間?
3. 您指的應如何處理是指什麼?
4. 對DC而言,若無noise干擾,A/D值是不會有太大變化,sample rate 也不會有太大影響。
5. 找問題的方法,二分法,將軟體、硬體分開,相互驗證,有問題,最好力求知道原因,如此才能更深入了解…。個人經驗。
6. 會不會在硬體有問題呢?是否方便貼個A/D區塊電路圖?
7. 很高與能和你一同找問題,找到了也不要忘了回應,與大家分享。

發表於: 2006/5/18 9:49
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 求教A/D转换问题!
#3
新會員
新會員


查看用戶資訊
谢谢,我以前没用过A/D转换器,不太清楚他的转换原理!
按照您上面说的办法做了以后,得到的数值没有什么太大的变化。
想请教您一下:我用A/D采样0--380的电压,经处理后转化成0--5的电压,对其进行12位A/D采样,回来的采样值应该如何处理啊?还有当我改变采样率的时候数据好像没什么变化,采样率不影响结果吗?
谢谢!初学,请您指教!

發表於: 2006/5/14 15:07
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 求教A/D转换问题!
#2
新會員
新會員


查看用戶資訊
就先前使用的2010的經驗,使用AVSS在30MIPS會有差,你可先調降至1~2MIPS試試,看是否接近理論值,當然也有可能是取樣時間不足…等可能情形,最好使用Vref-為參考點。

發表於: 2006/5/13 10:35
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


求教A/D转换问题!
#1
新會員
新會員


查看用戶資訊
请问用AVDD和AVSS做A/D的参考电压时,所得回的值会受到影响吗?
我用的是p30f4013,工作在30MIPS,以下是我的程序,只采样AN0手动采样,只采一次,但回来的值与真实值差的很多,不知道是不是时间的的问题,请您指教,谢谢!
{ADPCFG = 0xFFFE;
ADCON1 = 0x20E0;
ADCHS = 0x0000;
ADCSSL = 0x0000;
ADCON3 = 0x053F;
ADCON2 = 0x8000;
ADCON1bits.ADON = 1;
_SAMP=1;
_ADIE=1;
_ADIF=0;
While(1){}
}
void _ISR _ADCInterrupt(void)
{

_ADIF=0;
ADCValue = ADCBUF0;

return;
}

發表於: 2006/5/12 8:38
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







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.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------