PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   Adcbuf (http://www.picvietnam.com/forum/showthread.php?t=5259)

tkpro 08-11-2009 09:16 AM

Adcbuf
 
các pác cho e hỏi là bộ ADC trong dsPIC chỉ có 01 thanh ghi ADCBUF0 địa chỉ là từ 0300 đến 0319 vậy làm thế nào để e lấy ADC trên 4 kênh đầu vào mà đọc được dữ liệu đúng?thanks!

namqn 08-11-2009 02:26 PM

Trích:

Nguyên văn bởi tkpro (Post 30979)
các pác cho e hỏi là bộ ADC trong dsPIC chỉ có 01 thanh ghi ADCBUF0 địa chỉ là từ 0300 đến 0319 vậy làm thế nào để e lấy ADC trên 4 kênh đầu vào mà đọc được dữ liệu đúng?thanks!

Bạn lấy thông tin địa chỉ như trên từ đâu vậy?

16 thanh ghi kết quả ADC trong dsPIC30 có tên theo thứ tự là ADCBUF0 đến ADCBUFF, bạn cần truy xuất vị trí nào trong bộ đệm kết quả dài 16-word thì cứ dùng tên tương ứng. Vấn đề địa chỉ hãy để cho trình dịch xử lý.

Thân,

tkpro 08-11-2009 09:23 PM

Trích:

Nguyên văn bởi namqn (Post 30982)
Bạn lấy thông tin địa chỉ như trên từ đâu vậy?

16 thanh ghi kết quả ADC trong dsPIC30 và dsPIC33 có tên theo thứ tự là ADCBUF0 đến ADCBUFF, bạn cần truy xuất vị trí nào trong bộ đệm kết quả dài 16-word thì cứ dùng tên tương ứng. Vấn đề địa chỉ hãy để cho trình dịch xử lý.

Thân,

e lấy trong datasheet của dspic33 mà anh, trang 45, ví dụ khi e gán value=ADC1BUF0 thì Ok nhưng khi gán value=ADC1BUF1 thì nó báo lỗi ngay. e đang dùng dsPIC33FJ256GP71.

tkpro 08-11-2009 09:32 PM

Trích:

Nguyên văn bởi namqn (Post 30982)
Bạn lấy thông tin địa chỉ như trên từ đâu vậy?

16 thanh ghi kết quả ADC trong dsPIC30 và dsPIC33 có tên theo thứ tự là ADCBUF0 đến ADCBUFF, bạn cần truy xuất vị trí nào trong bộ đệm kết quả dài 16-word thì cứ dùng tên tương ứng. Vấn đề địa chỉ hãy để cho trình dịch xử lý.

Thân,

e vừa check lại xong.
thằng dsPIC30 thì như anh nói nhưng thằng dsPIC33 lại khác anh ah
anh có thể giúp e cách truy cập địa chỉ của nó để lấy data kô?

namqn 08-11-2009 09:48 PM

Trích:

Nguyên văn bởi tkpro (Post 30990)
e vừa check lại xong.
thằng dsPIC30 thì như anh nói nhưng thằng dsPIC33 lại khác anh ah
anh có thể giúp e cách truy cập địa chỉ của nó để lấy data kô?

Bạn nói đúng. ADC của dsPIC33F chỉ có một thanh ghi đệm kết quả là ADCxBUF0, do đó bạn phải tự copy kết quả vào vùng đệm trước khi có kết quả mới (tham khảo code example CE121 của Microchip), hoặc thiết lập để dùng DMA, cho phép kết quả được tự động sao chép vào một vùng nhớ định trước (tham khảo code example CE120 của Microchip).

Thân,

namqn 08-11-2009 09:51 PM

Trích:

Nguyên văn bởi tkpro (Post 30988)
e lấy trong datasheet của dspic33 mà anh, trang 45, ví dụ khi e gán value=ADC1BUF0 thì Ok nhưng khi gán value=ADC1BUF1 thì nó báo lỗi ngay. e đang dùng dsPIC33FJ256GP71.

Datasheet mô tả rằng ADC1BUF0 có địa chỉ là 0x300, chứ không phải có địa chỉ từ 0x300 đến 0x319.

Thân,

tkpro 09-11-2009 11:51 AM

Trích:

Nguyên văn bởi namqn (Post 30992)
Datasheet mô tả rằng ADC1BUF0 có địa chỉ là 0x300, chứ không phải có địa chỉ từ 0x300 đến 0x319.

Thân,

tôi đã down về và thử đoạn code này rồi.
chạy Ok đấy.
anh e cùng tham khảo nhé.

#if defined(__dsPIC33F__)
#include "p33fxxxx.h"
#elif defined(__PIC24H__)
#include "p24hxxxx.h"
#endif

#include "adcDrv1.h"
#include "tglPin.h"

#define SAMP_BUFF_SIZE 8 // Size of the input buffer per analog input
#define NUM_CHS2SCAN 4 // Number of channels enabled for channel scan

/*================================================= ============================
ADC INITIALIZATION FOR CHANNEL SCAN
================================================== ===========================*/
void initAdc1(void)
{

AD1CON1bits.FORM = 3; // Data Output Format: Signed Fraction (Q15 format)
AD1CON1bits.SSRC = 2; // Sample Clock Source: GP Timer starts conversion
AD1CON1bits.ASAM = 1; // ADC Sample Control: Sampling begins immediately after conversion
AD1CON1bits.AD12B = 0; // 10-bit ADC operation

AD1CON2bits.CSCNA = 1; // Scan Input Selections for CH0+ during Sample A bit
AD1CON2bits.CHPS = 0; // Converts CH0

AD1CON3bits.ADRC = 0; // ADC Clock is derived from Systems Clock
AD1CON3bits.ADCS = 63; // ADC Conversion Clock Tad=Tcy*(ADCS+1)= (1/40M)*64 = 1.6us (625Khz)
// ADC Conversion Time for 10-bit Tc=12*Tab = 19.2us

AD1CON2bits.SMPI = (NUM_CHS2SCAN-1); // 4 ADC Channel is scanned

//AD1CSSH/AD1CSSL: A/D Input Scan Selection Register
AD1CSSH = 0x0000;
AD1CSSLbits.CSS4=1; // Enable AN4 for channel scan
AD1CSSLbits.CSS5=1; // Enable AN5 for channel scan
AD1CSSLbits.CSS10=1; // Enable AN10 for channel scan
AD1CSSLbits.CSS13=1; // Enable AN13 for channel scan

//AD1PCFGH/AD1PCFGL: Port Configuration Register
AD1PCFGL=0xFFFF;
AD1PCFGH=0xFFFF;
AD1PCFGLbits.PCFG4 = 0; // AN4 as Analog Input
AD1PCFGLbits.PCFG5 = 0; // AN5 as Analog Input
AD1PCFGLbits.PCFG10 = 0; // AN10 as Analog Input
AD1PCFGLbits.PCFG13 = 0; // AN13 as Analog Input


IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit
IEC0bits.AD1IE = 1; // Enable A/D interrupt
AD1CON1bits.ADON = 1; // Turn on the A/D converter

tglPinInit();

}

/*================================================= ============================
Timer 3 is setup to time-out every 125 microseconds (8Khz Rate). As a result, the module
will stop sampling and trigger a conversion on every Timer3 time-out, i.e., Ts=125us.
================================================== ===========================*/
void initTmr3()
{
TMR3 = 0x0000;
PR3 = 4999;
IFS0bits.T3IF = 0;
IEC0bits.T3IE = 0;

//Start Timer 3
T3CONbits.TON = 1;

}

/*================================================= ============================
ADC INTERRUPT SERVICE ROUTINE
================================================== ===========================*/
int ain3Buff[SAMP_BUFF_SIZE];
int ain4Buff[SAMP_BUFF_SIZE];
int ain10Buff[SAMP_BUFF_SIZE];
int ain13Buff[SAMP_BUFF_SIZE];

int scanCounter=0;
int sampleCounter=0;

void __attribute__((interrupt, no_auto_psv)) _ADC1Interrupt(void)
{

switch (scanCounter)
{
case 0:
ain3Buff[sampleCounter]=ADC1BUF0;
break;

case 1:
ain4Buff[sampleCounter]=ADC1BUF0;
break;

case 2:
ain10Buff[sampleCounter]=ADC1BUF0;
break;

case 3:
ain13Buff[sampleCounter]=ADC1BUF0;
break;

default:
break;

}

scanCounter++;
if(scanCounter==NUM_CHS2SCAN) {
scanCounter=0;
sampleCounter++;
}

if(sampleCounter==SAMP_BUFF_SIZE)
sampleCounter=0;

tglPin(); // Toggle RA6
IFS0bits.AD1IF = 0; // Clear the ADC1 Interrupt Flag

}

TOVU 09-11-2009 11:36 PM

đúng chổ mình đang thắc mắc!
 
em cũng đang làm phần adc của dspic33f ,rõ ràng trong adc family reference của nó ,ở các giảng đồ định thì thì thấy có tồn tại các thanh ghi buffer1 ,buffer2....,ngay cả trong datasheet vẩn liệt kê vùng nhớ buffer là từ 0300 đến 0319 .vậy mà trong file .h nó chỉ khai báo 1 buffer 0.
em muốn lấy mẩu đồng thời 4 kênh (simultaneous)bằng software ( SSRC<2:0> = 000) ,nhưng không làm được. vì nó chỉ ghi vào buffer0 mà bỏ trống mấy buffer khác .vì quá trình chuyễn đỗi ở chế độ simultaneous chỉ kết thúc (DONE =1) khi đã hoàn tất convert 4 kênh ,và mổi lần convert nó điều ghi vào buffer0 hết .vậy là chỉ nhận dc duy nhất giá trị kênh CH3 ở bufer0 ,các kênh khác là zero.!!!! (em không muốn dùng DMA trong trường hợp này).
vấn đề e không hiểu tại sao MC lại thiết kế dòng dspic33f như vậy ,không biết đây có phải là 1 lỗi thiết kế??.Thầy Nam có thể chỉ cho e cách nào lấy mẫu đồng thời mà không phải dùng DMA được không ?? .Nếu nắm được phần này e sẽ viết một report về phần ADC và DAC của dspic33f cho các bạn cùng tham khảo. xin chân thành cám ơn

tkpro 10-11-2009 02:48 PM

Trích:

Nguyên văn bởi TOVU (Post 31037)
em cũng đang làm phần adc của dspic33f ,rõ ràng trong adc family reference của nó ,ở các giảng đồ định thì thì thấy có tồn tại các thanh ghi buffer1 ,buffer2....,ngay cả trong datasheet vẩn liệt kê vùng nhớ buffer là từ 0300 đến 0319 .vậy mà trong file .h nó chỉ khai báo 1 buffer 0.
em muốn lấy mẩu đồng thời 4 kênh (simultaneous)bằng software ( SSRC<2:0> = 000) ,nhưng không làm được. vì nó chỉ ghi vào buffer0 mà bỏ trống mấy buffer khác .vì quá trình chuyễn đỗi ở chế độ simultaneous chỉ kết thúc (DONE =1) khi đã hoàn tất convert 4 kênh ,và mổi lần convert nó điều ghi vào buffer0 hết .vậy là chỉ nhận dc duy nhất giá trị kênh CH3 ở bufer0 ,các kênh khác là zero.!!!! (em không muốn dùng DMA trong trường hợp này).
vấn đề e không hiểu tại sao MC lại thiết kế dòng dspic33f như vậy ,không biết đây có phải là 1 lỗi thiết kế??.Thầy Nam có thể chỉ cho e cách nào lấy mẫu đồng thời mà không phải dùng DMA được không ?? .Nếu nắm được phần này e sẽ viết một report về phần ADC và DAC của dspic33f cho các bạn cùng tham khảo. xin chân thành cám ơn

bạn làm như trong đoạn chương trình con phục vụ ngắt mà tôi đã post lên rồi ý. tôi thử rồi, nó chạy ầm ầm mà.

TOVU 10-11-2009 10:30 PM

mình biết chương trình của bạn chạy , cái bài toán mình đặt ra khác hẳn so với của bạn ,nên nếu làm vậy thì không được .
bài toán của mình gồm 2 yêu cầu: lấy mẫu đồng thời và chạy ở chế độ manual không DMA.
mình đã giải quyết được yêu cầu này ,nhưng bằng DMA .


Múi giờ GMT. Hiện tại là 04:47 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam