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)
-   -   dsPIC Tutorial 5-Module ADC và MCPWM (http://www.picvietnam.com/forum/showthread.php?t=650)

namqn 04-09-2009 12:07 AM

Trích:

Nguyên văn bởi JohnnyNguyen (Post 29275)
hỏi về tutorial của thầy Nam.thầy cho em hỏi,cái câu lệnh:
ADCValue = ADCBUF0 >>1 //chi lay 9 bit cao nhat
tại sao chỉ lấy 9 bit cao nhất.em chưa hiểu rõ chỗ này.em mới đang tiếp cận ADC,mong thầy chỉ rõ cho.
cho em hỏi thêm về sơ đồ mạch,cái con MAX232 có tác dụng gì a.

Vì trong ví dụ đó tôi thiết lập tần số PWM là 40 kHz, ứng với tần số thực thi lệnh là 8 MHz, nên phạm vi duty cycle chỉ là 0 .. 400, tức là có thể mã hóa bằng 9 bit. Để tận dụng gần như toàn bộ dải điện áp ở ngõ vào ADC (phạm vi điều chỉnh biến trở rộng nhất có thể có), chỉ có 9 bit cao nhất của kết quả chuyển đổi A/D được sử dụng để thiết lập duty cycle. Điều này tương ứng với việc bạn vặn biến trở từ 0 đến khoảng 80% để chỉnh duty cycle từ 0 đến 100%.

MAX232 là vi mạch dịch mức, để chuyển logic TTL/CMOS 5 V sang dạng tương thích với chuẩn RS-232 (mức điện áp thể hiện logic là khoảng +/- 12 V).

Thân,

conglong 04-09-2009 08:27 PM

Trích:

Nguyên văn bởi namqn (Post 29284)
Tài liệu vẽ minh họa cho trường hợp cả hai chân PWMxH và PWMxL là active-high (tích cực mức cao), do đó trong thời gian dead-time, cả hai chân này sẽ ở mức low (tức là ở trạng thái inactive).

Các bit HPOL và LPOL trong thanh ghi cấu hình FBORPOR cho phép chọn trạng thái tích cực của các chân PWMxH và PWMxL một cách tương ứng (nếu bạn không mô tả chúng thì mặc định là các bit này ở mức cao, tương ứng với các chân PWMxH và PWMxL là active-high). Bạn có thể thiết lập xóa các bit cấu hình này để các chân PWMxH và PWMxL là tích cực mức thấp (active-low), khi đó trong khoảng deadtime các chân PWMxH và PWMxL sẽ ở mức cao. Và kiểu logic này mới tương thích với mạch công suất của bạn.

Thân,

Em Xin chân thành cảm ơn thầy về câu trả lời này,
Đáng lẽ em phải thử để khỏi làm phiền thầy , nhưng em không có ossilo nên không quan sát được tín hiệu ở 2 chân PWMxH , PWMxL. em định thử set up 2 bit HPOL và LPOL để biết trước khi hỏi thầy nhưng em không chắc nên quyết định hỏi cho chắc !, làm việc với phần công suất (PWM) mà không chắc là em sợ lắm rùi, vì nó chết FET (Đôi khi nổ cái "đùng") hoặc chết IR2102 (mỗi con 17 ngàn) !
Nên em xin chân thành cảm ơn thầy !.
Trân trọng !.

Hiepnv101 11-09-2009 10:39 AM

Anh Nam cho em hỏi, trong chế độ quét nhiều kênh ADC, dùng Timer3 kết thúc lấy mẫu và bắt đầu chuyển đổi thì việc xác định giá trị PR3 có giông như trong chế độ quét 1kênh ADC không? Em thấy khi quét nhiều kênh thì khi đó thời gian ngắt của Timer3 là không đều và không như ý của mình, giá trị hiển thị về thỉnh thoảng lại là 0, em hiển thị lên led 7 thanh.

Thanks,

diepvu1805 10-10-2009 05:42 PM

Em đang dung DSpic30f4013. Nhưng em không biết là ADC của nó có đo được điện áp +/- không. Bác nào biết chỉ dùm em.
Thank các bac

nvcong 19-11-2009 09:18 AM

dieu khien dc dung pic16
 
cho em hoi neu mach cau H co phan hoi dong dien qua Rshun thi tin hieu ve noi vao chan nao cua pic vay?

npbaoduy 19-11-2009 10:53 PM

Trích:

Nguyên văn bởi nvcong (Post 31400)
cho em hoi neu mach cau H co phan hoi dong dien qua Rshun thi tin hieu ve noi vao chan nao cua pic vay?

Đọc áp trên Rshun bằng bộ ADC của PIC, có áp -> dòng -> điều khiển.

npbaoduy 27-11-2009 10:37 PM

Áp vào chân ADC của dspic30F6014A
 
2 Attachment(s)
Em thiết kế mạch khuyếch đại từ micro, sao cho áp ra dao động với biên độ +- 2.5V, sau đó qua mạch lọc, xong qua mạch cộng thêm 2.5v để được áp dao động từ 0-5v. Xong phần này tín hiệu do bằng dao động ký rất tốt (em sử dụng mạch khuyếch đại và lọc dụng Opamp OP07).
Sau đó đưa áp này vào chân ADC của dspic30F6014A, quan sát áp trên dao động ký thì thấy nó bị xén mất một phần ,chỉ còn lại phần từ 0- khoảng 1v (em nhấn mạnh là xén mất chứ ko phải sụt áp). Em ko hiểu tại sao lại như vậy, em đã thử thêm một tần đệm trước khi đưa vào ADC, nhưng kết quả vẫn như vậy.
Em xin đính kèm sơ đồ mạch, ai có kinh nghiệm xem xét giúp em với, em cám ơn rất nhiều.
Sơ đồ mạch em đã post thêm file pdf, phần mạch khuyếch đại và lọc em vẽ ở phía dưới cùng, tín hiệu sau xử lý đưa vào chân AN15 (nối bằng jumper giữa J11 và J3).

namqn 27-11-2009 11:05 PM

Trích:

Nguyên văn bởi npbaoduy (Post 31712)
Em thiết kế mạch khuyếch đại từ micro, sao cho áp ra dao động với biên độ +- 2.5V, sau đó qua mạch lọc, xong qua mạch cộng thêm 2.5v để được áp dao động từ 0-5v. Xong phần này tín hiệu do bằng dao động ký rất tốt (em sử dụng mạch khuyếch đại và lọc dụng Opamp OP07).
Sau đó đưa áp này vào chân ADC của dspic30F6014A, quan sát áp trên dao động ký thì thấy nó bị xén mất một phần ,chỉ còn lại phần từ 0- khoảng 1v (em nhấn mạnh là xén mất chứ ko phải sụt áp). Em ko hiểu tại sao lại như vậy, em đã thử thêm một tần đệm trước khi đưa vào ADC, nhưng kết quả vẫn như vậy.
Em xin đính kèm sơ đồ mạch, ai có kinh nghiệm xem xét giúp em với, em cám ơn rất nhiều.

Nên gửi sơ đồ mạch dạng ảnh (đọc luồng có link nằm trong chữ ký của tôi). Không phải ai cũng dùng phần mềm OrCAD, hay một phần mềm nào khác mà bạn đang dùng.

Nếu đưa dạng sóng đã kiểm tra tốt vào PIC/dsPIC mà dạng sóng bị xén mất thì phải xem lại mức đỉnh của tín hiệu có tương thích với áp nguồn của PIC/dsPIC hay không. Các chân vào/ra của PIC/dsPIC thường có 2 diode bảo vệ.

Thân,

npbaoduy 28-11-2009 09:48 PM

Em vẫn ko hiểu được anh à, nếu như ngõ vào ADC nối vô con biến trở rồi vặn biến trở thì áp bình thường ko bị sụt (0-5V), chỉ có tín hiệu từ sau bộ khuyếch đại đưa vào mới bị xén. Giả thiết bị sụt áp do dòng bé cũng ko thuyết phục lắm, vì nếu dòng nhỏ thì bị sụt áp chứ ko phải xén, hơn nữa em đã thêm mạch khuyếch đại đệm vào kết quả vẫn vậy, tín hiệu bị xén hết chỉ còn phần nằm trong khoảng 0-1V thôi :(. Em xem phần nguồn của con dsPIC cũng ko phát hiện gì cả.

namqn 28-11-2009 10:32 PM

Trích:

Nguyên văn bởi npbaoduy (Post 31754)
Em vẫn ko hiểu được anh à, nếu như ngõ vào ADC nối vô con biến trở rồi vặn biến trở thì áp bình thường ko bị sụt (0-5V), chỉ có tín hiệu từ sau bộ khuyếch đại đưa vào mới bị xén. Giả thiết bị sụt áp do dòng bé cũng ko thuyết phục lắm, vì nếu dòng nhỏ thì bị sụt áp chứ ko phải xén, hơn nữa em đã thêm mạch khuyếch đại đệm vào kết quả vẫn vậy, tín hiệu bị xén hết chỉ còn phần nằm trong khoảng 0-1V thôi :(. Em xem phần nguồn của con dsPIC cũng ko phát hiện gì cả.

Một câu hỏi hơi ngớ ngẩn: Lúc đưa tín hiệu từ mạch OP-AMP vào chân AN15 của dsPIC, bạn có cấp nguồn cho dsPIC không? Nếu có thì code của dsPIC ra sao (phần liên quan đến chức năng ADC)?

Thân,

npbaoduy 28-11-2009 10:52 PM

Tất nhiên là em có cấp nguồn :D.
code em làm tương tự như code mẫu trên trang của microchip
Code:

void Init_ADC12(void)
{
  //ADCON1 Register
        //Set up A/D for Automatic Sampling
        //Use Timer3 to provide sampling time
        //Set up A/D conversrion results to be read in fractional
        //number format.
        //All other bits to their default state
        ADCON1bits.FORM = 3; // luu du lieu dinh dang signed fractional 1.15
        ADCON1bits.SSRC = 2; // dung timer3 de kich chuyen doi ADC
        ADCON1bits.ASAM = 1; // cai dat che do tu dong lay mau

    //ADCON2 Register
        //Set up A/D for interrupting after 16 samples get filled in the buffer
        //All other bits to their default state
        ADCON2bits.SMPI = 15; // cai da che do ngat ADC sau khi day 16 mau trong bo dem du lieu
     
  //ADCON3 Register
        //We would like to set up a sampling rate of 8KHz
        //Total Conversion Time= 1/Sampling Rate = 125 microseconds
        //At 29.4 MIPS, Tcy = 33.9 ns = Instruction Cycle Time
        //Tad > 667ns (for -40C to 125C temperature range)
        //We will set up Sampling Time using Timer3 & Tad using ADCS<5:0> bits
        //All other bits to their default state
        //Let's set up ADCS arbitrarily to the maximum possible amount = 63
        //So Tad = Tcy*(ADCS+1)/2 = 1.085 microseconds
        //So, the A/D converter will take 14*Tad periods to convert each sample
        ADCON3bits.ADCS = 63;

        //Next, we will to set up Timer 3 to time-out every 125 microseconds
        //As a result, the module will stop sampling and trigger a conversion
        //on every Timer3 time-out, i.e., 125 microseconds. At that time,
        //the conversion process starts and completes 14*Tad periods later.
        //When the conversion completes, the module starts sampling again
        //However, since Timer3 is already on and counting, about 110
        //microseconds later (=125 microseconds - 14*Tad), Timer3 will expire
        //again. Effectively, the module samples for 110 microseconds and
        //converts for 15 microseconds
        //NOTE: The actual sampling rate realized may be 7998.698 Hz
        //      due to a small round off error. Ensure you provide the
        //      true sampling rate to dsPICworks if you are trying to plot
        //      the sampled or filtered signal.
        TMR3 = 0x0000;
        PR3 = 0X0E65;
        IFS0bits.T3IF = 0; // cho co ngat timer3=0
        IEC0bits.T3IE = 0; // khong cho phep ngat timer3

        //ADCHS Register
        //Set up A/D Channel Select Register to convert AN7 on Mux A input
        ADCHS = 0x000F; // chon AN15 la kenh thu du lieu analog


        //ADCSSL Register
        //Channel Scanning is disabled. All bits left to their default state
        ADCSSL = 0x0000; // tat che do quet cac kenh. Cac n=bit con lai de che do mac dinh

        //ADPCFG Register
        //Set up channels AN15 as analog input and configure rest as digital
        //Recall that we configured all A/D pins as digital when code execution
        //entered main() out of reset
              ADPCFG = 0xFFFF;
        ADPCFGbits.PCFG15 = 0; //ngo AN15 la ngo vao analog

        //Clear the A/D interrupt flag bit
        IFS0bits.ADIF = 0; // xoa co ngat chuyen doi ADC

        //Set the A/D interrupt enable bit
        IEC0bits.ADIE = 1; // cho phep ngat ADC

        //Turn on the A/D converter
        //This is typically done after configuring other registers
        ADCON1bits.ADON = 1; // bat dau cho do ADC hoat dong

        //Start Timer 3
        T3CONbits.TON = 1; // cho timer3 bat dau chay



void __attribute__((interrupt, no_auto_psv)) _ADCInterrupt(void)
{
    IFS0bits.T3IF = 0; //Xoa co ngat timer3
    unsigned int i = 0;
    IFS0bits.ADIF = 0; //Xoa co ngat ADC
    adcPtr=&ADCBUF0; // lay dia chi thanh ghi ADCBUF0 ghi vao thanh ghi adcPtr

  for(i=0;i<=15;i++)
      {
      *iPtr++=*adcPtr++; //lay noi dung cua cac thanh ghi Buffer lan luot ghi vao cac bien
                    // inputsignal[]
      }
  if (iPtr>&inputsignal[159])    doFilterFlag=1;        // thu duoc 160 mau thi vao xu ly                               
}

Trong chương trình chính:
Code:

....
        while(1)
        {
            while(!doFilterFlag){};  //Vong lap cho day 160 mau trong bo dem ADC
        doFilterFlag=0;          //chuan bi vong lap sau
        (.....tính toán xử lý .........................)

Anh xem giúp em nhé!

npbaoduy 30-11-2009 05:00 PM

Luôn tiện a cho em hỏi luôn là nếu đưa áp vào chân ADC mà vuợt ngoài tầm 0-5v (áp âm hoặc lớn hơn 5v) thì có thể làm hư chân ADC đó ko ?

ngoducbinh1987 14-12-2009 09:48 AM

anh Nam ơi cho em hỏi thanh ghi SEVTCMP có tác dụng gì vậy ạ

thuhuong 04-03-2010 09:36 AM

Anh Nam và các bạn cho hỏi ở phần giới thiệu trong tutorial 5 có nói: "Ví dụ 5-1 sẽ giới thiệu cách điều chỉnh độ rộng xung theo một giá trị tương tự được đọc về thông qua một ngõ vào analog". Vậy ở đây giá trị tương tự là tín hiệu gì và tín hiệu xung điều chỉnh theo tham số nào của tín hiệu tương tự đó. Thank!

namqn 04-03-2010 09:57 AM

Trích:

Nguyên văn bởi thuhuong (Post 33820)
Anh Nam và các bạn cho hỏi ở phần giới thiệu trong tutorial 5 có nói: "Ví dụ 5-1 sẽ giới thiệu cách điều chỉnh độ rộng xung theo một giá trị tương tự được đọc về thông qua một ngõ vào analog". Vậy ở đây giá trị tương tự là tín hiệu gì và tín hiệu xung điều chỉnh theo tham số nào của tín hiệu tương tự đó. Thank!

Giá trị tương tự là tín hiệu điện áp đặt vào ngõ vào analog, thay đổi từ 0 V đến VDD.

Với cách thiết lập tham số cho module MCPWM trong ví dụ 5-1, duty cycle = 100% sẽ ứng với giá trị 400 (đọc kỹ tutorial nếu chưa rõ).

Với cách đọc tín hiệu ADC đã dùng trong ví dụ 5-1, khi điện áp ngõ vào analog thay đổi từ 0 V đến VDD thì sẽ có được giá trị 0 - 511 trong biến ADCValue, và giá trị này được ghi thẳng vào các thanh ghi PDCx để thiết lập duty cycle.

Như vậy, khi ngõ vào analog thay đổi từ 0 V đến khoảng 80% giá trị của VDD (chính xác là 400*VDD/512) thì duty cycle của tín hiệu ra sẽ thay đổi từ 0% đến 100%.

Có vẻ như bạn chưa đọc kỹ tutorial và code đi kèm.

Thân,


Múi giờ GMT. Hiện tại là 06:51 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