PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 04-10-2006, 12:16 AM   #1
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
dsPIC Tutorial 5-Module ADC và MCPWM

Đây là tutorial 5 cho dsPIC, giới thiệu các module ADC và MCPWM. Mã nguồn được viết trong ASM30 (tập tin "Vidu5.zip") và C30 (tập tin "Vidu5C30.zip"). Các tập tin .hex đã được đính kèm.

Một ví dụ đọc ngõ vào ADC và điều chỉnh độ rộng xung một cách tương ứng, ví dụ còn lại đọc ngõ vào analog và gửi các ký tự biểu diễn giá trị đọc được(hexadecimal) ra cổng RS-232.

Chúc các bạn thành công!

Thân,
File Kèm Theo
File Type: pdf TUT06.01.PVN.NQNT.250906.pdf (91.9 KB, 9117 lần tải)
File Type: zip Vidu5.zip (5.8 KB, 2676 lần tải)
File Type: zip Vidu5C30.zip (5.0 KB, 3793 lần tải)
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-12-2006, 01:05 AM   #2
typhn
Đệ tử 1 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 19
:
Em đọc phần PWM của DSPIC30F4011 mà khó hiểu quá,khác xa so với 16F877A.Em đã test thử PWM cho động cơ mà chưa được,ko hiểu tại sao,mong anh giúp đỡ.
Chương trình của em như sau: Bật chức năng PWM của chân PWM1H và PWM2L, với Fpwm=1khz,tỷ lệ D/t=1/2(chạy 50% công suất).Còn chân PWM1L và PWM2H luôn ở mức thấp.PWM cứ hoạt động cho đến khi bit RB1=1(bình thường thì RB1 ở mức 0) thì dừng PWM và các chân PWM lại vào/ra số như các chân khác.
Em dùng thạch anh 8MHZ
Chương trình của em như sau:
Code:
#include"p30f4011.h"

_FOSC(CSW_FSCM_OFF & XT_PLL4);		
_FWDT(WDT_OFF);
_FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI & PWMxH_ACT_HI);
_FGS(CODE_PROT_OFF);

void init(void)
  {
      ADPCFG	=0xFFFF;							                         //CAC ANX DEU LA DIGITAL
      TRISB	=0x003F;							                      //Dinh nghia RB0-RB5 la loi vao,cac RBX la loi ra
      TRISE	=0x0000;                           //cong E de PWM la loi ra
       LATE            =0x0000;
       PTCON          =0x0000;  //tat PWM
       PTPER	=8000;     //Fpwm=1KHZ
       PWMCON1	=0x0712; // ko su dung mode bù,PWM1H va 2L hoat dong
                                      // cac PWM khác là disable
      OVDCON        =0x0600 //PWM1H và 2L hoạt động PWM,PWM1L và 2H luôn ở mức 0  

}

int main() 
{
                 
   init();    
   PDC1=8000;
  PDC2 =8000;  //chay 50% cong suat
  PTCON=0x8000;//bat PWM o che do free running
while(1)
  {
     if(_RB1==1) break;
  }
PTCON=0x0000;//tat PWM
LATE=0x000F;//vao ra so binh thuong
return 0;
}
chương trình của em chỉ đơn giản như vậy.
Mong bác chỉ bảo.
Em đợi tin của bác
thanks

thay đổi nội dung bởi: typhn, 07-12-2006 lúc 12:47 PM.
typhn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-12-2006, 05:05 AM   #3
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Nếu bạn chưa đọc tutorial này của tôi thì hãy đọc nó trước đi. Nếu bạn đã thử phần tutorial của tôi rồi thì hãy sửa nó theo cách mà bạn muốn. Như vậy sẽ dễ hơn cho bạn.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-05-2008, 10:46 AM   #4
chukhivuitinh
Đệ tử 2 túi
 
Tham gia ngày: Jun 2005
Bài gửi: 27
:
Báo cáo về UART của tut4 và tut5 của a Nam :

Đây là board test của em ,em xài dsPic 30F4011 :



Giao tiếp UART của bài 4-1 và 5-2 :




Bài 4-1 ,với ví dụ là "Xin Chao !" em test thì có rất nhiều đoạn đọc sai ,kí tự " " (khoảng trắng) trong character map là 00A0 ,mà em koi watch thì trong pic đọc ra là 0x0020 ,đây có thể là lỗi do font ko ? cái hình trên là em dùng thời gian tràn của TMR1 là 0.5s ,chứ để 1s ,nó ra tùm lum hết T_T .

Tut 3 và 4-3 ,4-4 vì ko có LCD và DS1307 nên em chưa test thực tế được ,chỉ coi watch chạy thui .Nên chưa nắm rõ lắm .
chukhivuitinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-05-2008, 07:00 PM   #5
chukhivuitinh
Đệ tử 2 túi
 
Tham gia ngày: Jun 2005
Bài gửi: 27
:
ở bài 4-1 ,nếu muốn chuỗi kí tự khi đọc về xuống dòng và về đầu dòng thì thêm cái này vào sau chuỗi nha :
\n : xuống dòng
\r : về đầu dòng
ví dụ :
Trích:
.asciz "-=(chukhivuitinh^_^khiconrangkhenh)=-\n\r"
chukhivuitinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-05-2008, 05:26 PM   #6
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi chukhivuitinh View Post
Báo cáo về UART của tut4 và tut5 của a Nam :
...
Bài 4-1 ,với ví dụ là "Xin Chao !" em test thì có rất nhiều đoạn đọc sai ,kí tự " " (khoảng trắng) trong character map là 00A0 ,mà em koi watch thì trong pic đọc ra là 0x0020 ,đây có thể là lỗi do font ko ? cái hình trên là em dùng thời gian tràn của TMR1 là 0.5s ,chứ để 1s ,nó ra tùm lum hết T_T .

Tut 3 và 4-3 ,4-4 vì ko có LCD và DS1307 nên em chưa test thực tế được ,chỉ coi watch chạy thui .Nên chưa nắm rõ lắm .
Khoảng trắng có mã ASCII là 0x20, còn 0xA0 là mã của 'no-break space' chứ không phải 'space'. Khi dùng Character Map để xem các font thông thường, các mã điều khiển (nằm trong phạm vi 0x00 đến 0x1F) và ký tự 'space' không được thể hiện trong bảng ký tự.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-11-2008, 10:50 PM   #7
tungtuantu
Đệ tử 3 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 54
:
bác namqn cho em hỏi, em có thể dùng chân PWM_L cho chức năng PWM, và chân PWM_H cho chức năng port I/O bình thường ko ah, và làm thế nào.
Nếu em muốn PWM1 là PWM, còn PWM2 hoặc 3 là port I/O thường chỉ việc cho LATx= 0 hoặc 1 là dc hả anh.
Em lấy ví dụ 5.1 của anh sửa đi để chạy với mạch thật, biến trở em nối vào nguồn 5V, diều khiển động cơ dùng L298, dùng PWM1L và PWM2L để điều khiển, em cho luôn chân PWM2L=0, khi điều chỉnh biến trở thì chỉ 1 nửa là động cơ chạy, 1 nửa là dứng yên, tức là ko điều chỉnh dc toàn dải, mắc dù em cho chân PWM2L=0 rồi nhưng khi em đo áp trên chan này thì dc hơn 1 V, em nghĩ đây là nguyên nhân mà ko điều chỉnh dc toàn dải, có phải ko anh, cho em cách khắc phục
_FOSC(CSW_FSCM_OFF & FRC_PLL4); cái này có phải cấu hình dùng dao động nội của chip ?
nếu em dùng thach anh 20Mhz thì em cấu hình như này
_FOSC(CSW_FSCM_OFF & HS); có đúng ko anh.
Nên dùng thạch anh ngoài hay bộ dao động nội, em thấy các ví dụ của anh toàn dùng dao động nội? nếu dùng thạch anh thì fcy (tần số thực thi lệnh) = Fosc/4 đúng ko anh?
Nếu em muốn viết 1 hàm trễ 1ms bằng vòng lặp for thì cách tính toán như nào ( anh cho ví dụ luôn nhé),viết hàm delay nên dùng vòng lặp for hay dùng timer ?
tungtuantu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-11-2008, 02:19 AM   #8
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tungtuantu View Post
bác namqn cho em hỏi, em có thể dùng chân PWM_L cho chức năng PWM, và chân PWM_H cho chức năng port I/O bình thường ko ah, và làm thế nào.
Nếu em muốn PWM1 là PWM, còn PWM2 hoặc 3 là port I/O thường chỉ việc cho LATx= 0 hoặc 1 là dc hả anh.
Em lấy ví dụ 5.1 của anh sửa đi để chạy với mạch thật, biến trở em nối vào nguồn 5V, diều khiển động cơ dùng L298, dùng PWM1L và PWM2L để điều khiển, em cho luôn chân PWM2L=0, khi điều chỉnh biến trở thì chỉ 1 nửa là động cơ chạy, 1 nửa là dứng yên, tức là ko điều chỉnh dc toàn dải, mắc dù em cho chân PWM2L=0 rồi nhưng khi em đo áp trên chan này thì dc hơn 1 V, em nghĩ đây là nguyên nhân mà ko điều chỉnh dc toàn dải, có phải ko anh, cho em cách khắc phục
_FOSC(CSW_FSCM_OFF & FRC_PLL4); cái này có phải cấu hình dùng dao động nội của chip ?
nếu em dùng thach anh 20Mhz thì em cấu hình như này
_FOSC(CSW_FSCM_OFF & HS); có đúng ko anh.
Nên dùng thạch anh ngoài hay bộ dao động nội, em thấy các ví dụ của anh toàn dùng dao động nội? nếu dùng thạch anh thì fcy (tần số thực thi lệnh) = Fosc/4 đúng ko anh?
Nếu em muốn viết 1 hàm trễ 1ms bằng vòng lặp for thì cách tính toán như nào ( anh cho ví dụ luôn nhé),viết hàm delay nên dùng vòng lặp for hay dùng timer ?
Chân PWMxH có thể dùng làm chân I/O một cách độc lập với chân PWMxL tương ứng, nếu thiết lập cho cặp chân đó làm việc ở chế độ độc lập (bit PMODx tương ứng trong thanh ghi PWMCON1 mang giá trị '1').
Nếu muốn các chân của một kênh PWM nào đó là ngõ vào/ra thông thường thì thiết lập các bit PENxH và PENxL mang giá trị '0'.

Nếu bạn dùng L298 thì cần cho biết sơ đồ kết nối giữa dsPIC và L298. Một phần cứng cụ thể sẽ tương ứng với một thuật toán điều khiển cụ thể. Bạn không thể áp ví dụ của tôi vào mạch cầu H, vì tôi không viết phần mềm để điều khiển mạch cầu H. Tôi chỉ xuất ngõ ra PWM với duty cycle được thay đổi theo tín hiệu ADC vào thôi. Bạn tham khảo thêm cách điều khiển được đề xuất cho cầu H ở post #49 của luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1186

_FOSC(CSW_FSCM_OFF & FRC_PLL4); chọn bộ dao động nội với x4 PLL được kích hoạt.

Thạch anh ngoài 20 MHz có thể dùng với các cấu hình:
_FOSC(CSW_FSCM_OFF & HS);
hoặc
_FOSC(CSW_FSCM_OFF & XT_PLL4);

XT_PLL4 có thể gặp khó khăn trong việc ổn định dao động cho thạch anh.

Tôi dùng bộ dao động nội trong các tutorial chỉ để đơn giản hóa phần cứng. Với các bài toán yêu cầu độ chính xác cao đối với xung clock thì nên dùng thạch anh ngoài, hoặc tốt hơn là bộ dao động ngoài.

Việc một vòng for nào đó chạy mất bao nhiêu thời gian còn tùy thuộc vào chế độ tối ưu khi biên dịch code. Tôi thường dùng MPLAB SIM để xác định thời gian (hay số chu kỳ máy) cần thiết để thực thi một vòng for.

Theo tôi, không nên dùng vòng lặp đếm chu kỳ máy cho các thời gian trễ tương đối dài (cỡ ms).

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-11-2008, 09:57 AM   #9
tungtuantu
Đệ tử 3 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 54
:
Em post mạch của lên bác xem, em cho luôn PWM2L =0 (_LATE2=0), còn PWML1 là chân PWM, nhưng em đo áp trên chân E2 vẫn được hơn 1V, em set = 0 rồi, sao nó ko về 0V, bác xem với mạch của em thì điều khiển với tần số tối đa là bao nhiêu, em đã thay 1N4007 bằng diode schotky 1N5819, chương trình em sửa của bác
Code:
#include	<p30f4011.h>

	_FOSC(CSW_FSCM_OFF & FRC_PLL4);
	_FWDT(WDT_OFF);
	_FBORPOR(PBOR_OFF & MCLR_EN);
	_FGS(CODE_PROT_OFF);

//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)
#define	PWM_PORT	PORTE		//Cac tin hieu PWM nam o cong E
#define	PWM_TRIS	TRISE		//Thanh ghi 3 trang thai cho cac tin hieu PWM
#define	PWM_LAT		LATE		//Thanh ghi chot cac tin hieu PWM
#define	Fcy	20000000				//Tan so thuc thi lenh
#define	Fpwm	40000			//Tan so PWM = 40 kHz

//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);
void Init_MCPWM(void);
void Init_ADC10(void);

//Cac bien toan cuc
unsigned int ADCValue;

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
	Init_PORTS();			//Khoi tao cac cong I/O
	Init_MCPWM();			//Khoi tao module PWM
	Init_ADC10();			//Khoi tao module ADC
	while (1) Nop();
}

//Chuong trinh con khoi tao cac cong I/O, de xuat cac tin hieu PWM, va doc tin
//hieu dieu chinh cua bien tro tai AN0
void Init_PORTS(void) {
	PWM_LAT = 0;			//Xoa thanh ghi chot cac tin hieu PWM
	PWM_TRIS = 0xFFC0;		//Cac tin hieu PWM nam tai RE0..RE5
	TRISB = 0x0070;			//Chan RB0 la ngo vao analog AN0, cac chan khac
							//la ngo ra
	_LATE2 = 0;
}

//Chuong trinh con khoi tao module chuyen doi A/D, doc ngo vao AN0
void Init_ADC10(void) {
	ADPCFG = 0xFFBF;		//Cac chan khac la digital, chan AN0/RB0 la analog
	ADCON1 = 0x0060;		//Module PWM cham dut lay mau va kich hoat
							//viec chuyen doi A/D
//	ADCON1 = 0x0040;		//Timer 3 cham dut lay mau va kich hoat
							//viec chuyen doi A/D
	ADCON2 = 0;
	ADCHS = 0x06;				//Kenh 0 doc tin hieu giua AN0 va AVss
	ADCSSL = 0;				//Khong quet cac ngo vao
	ADCON3 = 0x0103;		//Dung 1 TAD cho lay mau, dung clock he thong,
							//TAD = 2xTcy = 250 ns
/*	TMR3 = 0;				//Xoa thanh ghi dem cua Timer 3
	PR3 = 0x03E8;			//Nguong delay cho TMR3 la khoang 1 ms
	T2CON = 0x8010;			//Prescale = 1:8, bat cho TMR3 chay
*/
	_ADIF = 0;				//Xoa co ngat ADC
	_ADIE = 1;				//Cho phep ngat ADC
	_ADON = 1;				//Bat module ADC
	_ASAM = 1;				//Khoi dong che do tu dong lay mau
}

//Chuong trinh con khoi tao module PWM
void Init_MCPWM(void) {
	PTPER = Fcy/Fpwm - 1;	//Dat thanh ghi chu ky voi tan so PWM = 40 kHz
	SEVTCMP = PTPER;
	PWMCON1 = 0x070F;		//Chi dung cac chan PxL, mot cach doc lap
	OVDCON = 0xFF00;		//Khong dung overdrive
	PDC1 = 0x0064;			//Khoi tao PWM1, 2, va 3 la 25%
	PDC2 = 0x0064;
	PDC3 = 0x0064;
	PWMCON2 = 0x0F00;		//Postscale = 1:16
	PTCON = 0x8000;			//Kich hoat module PWM
}

//Trinh phuc vu ngat cho ADC
void _ISR _ADCInterrupt(void)
{
	ADCValue = ADCBUF0 >> 1;		//Chi lay 9-bit cao nhat cua ket qua ADC
	PDC1 = ADCValue;		//Cap nhat cac thanh ghi dem chu ky nhiem vu

	_ADIF = 0;
}
File Kèm Theo
File Type: pdf SCHEMATIC1.pdf (75.8 KB, 683 lần tải)
tungtuantu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-11-2008, 08:15 PM   #10
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tungtuantu View Post
Em post mạch của lên bác xem, em cho luôn PWM2L =0 (_LATE2=0), còn PWML1 là chân PWM, nhưng em đo áp trên chân E2 vẫn được hơn 1V, em set = 0 rồi, sao nó ko về 0V, bác xem với mạch của em thì điều khiển với tần số tối đa là bao nhiêu, em đã thay 1N4007 bằng diode schotky 1N5819, chương trình em sửa của bác
Code:
#include	<p30f4011.h>

	_FOSC(CSW_FSCM_OFF & FRC_PLL4);
	_FWDT(WDT_OFF);
	_FBORPOR(PBOR_OFF & MCLR_EN);
	_FGS(CODE_PROT_OFF);

//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)
#define	PWM_PORT	PORTE		//Cac tin hieu PWM nam o cong E
#define	PWM_TRIS	TRISE		//Thanh ghi 3 trang thai cho cac tin hieu PWM
#define	PWM_LAT		LATE		//Thanh ghi chot cac tin hieu PWM
#define	Fcy	20000000				//Tan so thuc thi lenh
#define	Fpwm	40000			//Tan so PWM = 40 kHz

//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);
void Init_MCPWM(void);
void Init_ADC10(void);

//Cac bien toan cuc
unsigned int ADCValue;

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
	Init_PORTS();			//Khoi tao cac cong I/O
	Init_MCPWM();			//Khoi tao module PWM
	Init_ADC10();			//Khoi tao module ADC
	while (1) Nop();
}

//Chuong trinh con khoi tao cac cong I/O, de xuat cac tin hieu PWM, va doc tin
//hieu dieu chinh cua bien tro tai AN0
void Init_PORTS(void) {
	PWM_LAT = 0;			//Xoa thanh ghi chot cac tin hieu PWM
	PWM_TRIS = 0xFFC0;		//Cac tin hieu PWM nam tai RE0..RE5
	TRISB = 0x0070;			//Chan RB0 la ngo vao analog AN0, cac chan khac
							//la ngo ra
	_LATE2 = 0;
}

//Chuong trinh con khoi tao module chuyen doi A/D, doc ngo vao AN0
void Init_ADC10(void) {
	ADPCFG = 0xFFBF;		//Cac chan khac la digital, chan AN0/RB0 la analog
	ADCON1 = 0x0060;		//Module PWM cham dut lay mau va kich hoat
							//viec chuyen doi A/D
//	ADCON1 = 0x0040;		//Timer 3 cham dut lay mau va kich hoat
							//viec chuyen doi A/D
	ADCON2 = 0;
	ADCHS = 0x06;				//Kenh 0 doc tin hieu giua AN0 va AVss
	ADCSSL = 0;				//Khong quet cac ngo vao
	ADCON3 = 0x0103;		//Dung 1 TAD cho lay mau, dung clock he thong,
							//TAD = 2xTcy = 250 ns
/*	TMR3 = 0;				//Xoa thanh ghi dem cua Timer 3
	PR3 = 0x03E8;			//Nguong delay cho TMR3 la khoang 1 ms
	T2CON = 0x8010;			//Prescale = 1:8, bat cho TMR3 chay
*/
	_ADIF = 0;				//Xoa co ngat ADC
	_ADIE = 1;				//Cho phep ngat ADC
	_ADON = 1;				//Bat module ADC
	_ASAM = 1;				//Khoi dong che do tu dong lay mau
}

//Chuong trinh con khoi tao module PWM
void Init_MCPWM(void) {
	PTPER = Fcy/Fpwm - 1;	//Dat thanh ghi chu ky voi tan so PWM = 40 kHz
	SEVTCMP = PTPER;
	PWMCON1 = 0x070F;		//Chi dung cac chan PxL, mot cach doc lap
	OVDCON = 0xFF00;		//Khong dung overdrive
	PDC1 = 0x0064;			//Khoi tao PWM1, 2, va 3 la 25%
	PDC2 = 0x0064;
	PDC3 = 0x0064;
	PWMCON2 = 0x0F00;		//Postscale = 1:16
	PTCON = 0x8000;			//Kich hoat module PWM
}

//Trinh phuc vu ngat cho ADC
void _ISR _ADCInterrupt(void)
{
	ADCValue = ADCBUF0 >> 1;		//Chi lay 9-bit cao nhat cua ket qua ADC
	PDC1 = ADCValue;		//Cap nhat cac thanh ghi dem chu ky nhiem vu

	_ADIF = 0;
}
L298 coi điện áp ngõ vào 1 V là mức '0', do đó không có vấn đề gì về logic. Bạn đã thử chạy dsPIC riêng (không nối vào L298) và đo điện áp của chân RE2 chưa?

Bạn sửa code mà không chú thích lại. Với FRC_PLL4, Fcy không thể là 20 MHz, mà chỉ có thể là 7.37 MHz (với các dsPIC30F4011 sau này, theo các phiên bản datasheet mới nhất).

Để có thể dùng phần lớn phạm vi điều chỉnh của biến trở ngõ vào ADC, bạn cần tính toán đôi chút, và có thể cần phải điều chỉnh thiết kế ở phần ngõ vào ADC dùng để đặt duty cycle. Với ví dụ của tôi, tôi đã dùng Fcy = 8 MHz, với tần số ngõ ra là 40 kHz, do đó PTPER của tôi sẽ là 200. Độ phân giải của duty cycle gấp đôi độ phân giải của timer tạo chu kỳ. Do đó, số đếm tương ứng với duty cycle 100% sẽ là 400. Từ đó, tôi mới lấy 9 bit của kết quả ADC để đặt duty cycle, với phạm vi thay đổi là 0 .. 511. Như vậy, biến trở của tôi chạy đến khoảng 80% phạm vi của nó thì duty cycle của tôi sẽ đạt 100%. Bạn cần tính toán lại cho trường hợp của bạn.

Bạn cũng chưa cho biết đã nối biến trở đến ngõ vào ADC như thế nào.

Theo datasheet của L298 thì tần số điển hình của mạch là 25 kHz, tối đa là 40 kHz. Bạn có thể dùng 20 kHz với các thử nghiệm ban đầu.

Mỗi bài viết của một thành viên nào đó đều có nút 'Cảm ơn' để những thành viên khác sử dụng. Nếu bạn thấy bài viết nào có ích cho bạn thì bạn có thể nhấn nút đó, và không cần viết bài cảm ơn.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2008, 12:08 PM   #11
tungtuantu
Đệ tử 3 túi
 
Tham gia ngày: Apr 2006
Bài gửi: 54
:
Em đã sửa lại chương trình của em và đã điều chỉnh trên toàn dải, bác cho em hỏi là nếu mình dùng nhiều hơn 1 chân kiểu analog thì mình dùng kiểu quét để đọc giá trị về ah, và các ngắt của nó xảy ra như nào ah. con 30F4011 có 8 chân Analog thì có 16 bộ đệm ADCBUF là như nào hả bác, ví dụ như là đọc giá trị từ chân AN0, AN6 thì mình dùng bộ đếm mấy ah, em chư hiểu kiểu lấy mẫu A hoặc B như nào.
Một vấn đề nưa em muốn hỏi bác luôn là, em dùng QEI và đã được đọc số chính xác, nhưng em đọc datasheet con 30F4011 ko có chế độ VELOCITY MEASUREMENT như con 18F4331, như thế em để suy ra vận tốc, thì em dùng 1 ngắt timer trong 1s để đọc số xung rồi suy ra vận tốc, ví dụ trong 1s đó mà quay dc 5,5 vòng thì em phải dùng thêm ngắt của QEI đẻ xác định số vòng rồi cộng thêm với số vòng dư. Hoặc em chỉ dùng ngắt của QEI ví dụ số vòng đến 5 thì đọc giá trị của 1 timer chạy free run, bác xem 2 cách trên của em có khả thi ko.
Nếu em gộp ctr là điều chỉnh và hiện thị tốc độ, hiện thị cả dòng điện phản hồi nữa, như thế em phải dùng nhiều ngắt,em đang rối phần ưu tiên ngắt, bác mách nước cho em đuọc ko ah.
Thanks
tungtuantu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-11-2008, 04:14 AM   #12
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tungtuantu View Post
Em đã sửa lại chương trình của em và đã điều chỉnh trên toàn dải, bác cho em hỏi là nếu mình dùng nhiều hơn 1 chân kiểu analog thì mình dùng kiểu quét để đọc giá trị về ah, và các ngắt của nó xảy ra như nào ah. con 30F4011 có 8 chân Analog thì có 16 bộ đệm ADCBUF là như nào hả bác, ví dụ như là đọc giá trị từ chân AN0, AN6 thì mình dùng bộ đếm mấy ah, em chư hiểu kiểu lấy mẫu A hoặc B như nào.
Một vấn đề nưa em muốn hỏi bác luôn là, em dùng QEI và đã được đọc số chính xác, nhưng em đọc datasheet con 30F4011 ko có chế độ VELOCITY MEASUREMENT như con 18F4331, như thế em để suy ra vận tốc, thì em dùng 1 ngắt timer trong 1s để đọc số xung rồi suy ra vận tốc, ví dụ trong 1s đó mà quay dc 5,5 vòng thì em phải dùng thêm ngắt của QEI đẻ xác định số vòng rồi cộng thêm với số vòng dư. Hoặc em chỉ dùng ngắt của QEI ví dụ số vòng đến 5 thì đọc giá trị của 1 timer chạy free run, bác xem 2 cách trên của em có khả thi ko.
Nếu em gộp ctr là điều chỉnh và hiện thị tốc độ, hiện thị cả dòng điện phản hồi nữa, như thế em phải dùng nhiều ngắt,em đang rối phần ưu tiên ngắt, bác mách nước cho em đuọc ko ah.
Thanks
Chỉ có ngắt khi hoàn thành việc chuyển đổi A/D (A/D conversion), còn việc lấy mẫu điện áp ngõ vào thì không có ngắt. Module ADC của dsPIC chỉ có 1 bộ chuyển đổi, và ngắt có thể được thiết lập để xuất hiện sau mỗi phép chuyển đổi, hoặc sau một số lần chuyển đổi (các kết quả chuyển đổi được tạm thời lưu vào các thanh ghi đệm ADCBUF0 .. ADCBUFF). Bạn có thể lấy mẫu đồng loạt rồi chuyển đổi, hoặc lấy mẫu đến đâu thì chuyển đổi đến đó. Thông tin chi tiết có ở section 17 của tài liệu "dsPIC30F Family Reference Manual" (DS70046E), rất dài dòng để nói hết ở đây.

Đọc số xung encoder trong 1 giây để tính vận tốc chỉ thích hợp cho hiển thị, thường không đủ cho điều khiển (tốc độ cập nhật quá chậm). Cả hai cách bạn nêu đều thích hợp, nhưng áp dụng ở các dải tốc độ khác nhau.

Các ngắt thông thường có thể được thiết lập ở một trong bảy mức ưu tiên ngắt. Tôi tin rằng bạn có thể dễ dàng thiết lập mức độ ưu tiên cho vài ngắt mà bạn đang dùng. Việc bố trí các ngắt như thế nào còn tùy vào mức độ quan trọng của ngắt đang được xử lý, thời gian xử lý của một ngắt được dự định gán mức ưu tiên cao hơn ngắt đó, ... Hy vọng bạn có thể dựa vào một vài gợi ý trên để thiết lập việc ưu tiên ngắt cho hiệu quả.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-12-2008, 04:26 PM   #13
han_nang_008
Đệ tử 1 túi
 
Tham gia ngày: Nov 2008
Bài gửi: 19
:
bác namqn có thể nói rõ hơn khi mình dùng nhiều hơn 1 chân ADC, bác có thể viết 1 đoặn ví dụ cụ thể dc ko ah.
Ví dụ dùng AN0 và AN6, chân AN0 lấy tín hiệu từ triết áp để điều khiển tốc độ động cơ, còn chân AN6 lấy tín hiệu dòng phản hồi của động cơ, rồi hiện thì lên LCD chẳng han,thì cấu hình như nào, tốc độ lấy mẫu như nào thì phù hợp ah, với AN0 thì dùng PWM chấm dứt lấy mẫu, còn với AN6 mình dùng TIMER3 chấm dứt lấy mẫu có hợp lý ko anh, ADCHS mình khai báo như nào ah kết quả chuyển đổi từ 2 chân trên mình lấy ở đâu ra ah, có phải từ ADCBUF0 và ADCBUF6 ko bác
EM hỏi thêm bác đoặn này
bit 5-2 SMPI<3:0>: Sample/Convert Sequences Per Interrupt Selection bits
1111 = Interrupts at the completion of conversion for each 16th sample/convert sequence
1110 = Interrupts at the completion of conversion for each 15th sample/convert sequence
.....
0001 = Interrupts at the completion of conversion for each 2nd sample/convert sequence
0000 = Interrupts at the completion of conversion for each sample/convert sequence
cái này có phải lựa chon ngắt xảy ra sau 1 đến 16 lần chuyển đổi xong, hay ngắt khi lấy mẫu 1 đến 16 lần rồi chuyển đôi.
Em thấy cái thứ nhất có vẻ đúng hơn, có phải ko hả bác
Mong bác giúp đỡ em

thay đổi nội dung bởi: han_nang_008, 16-12-2008 lúc 06:50 PM.
han_nang_008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2008, 12:03 PM   #14
han_nang_008
Đệ tử 1 túi
 
Tham gia ngày: Nov 2008
Bài gửi: 19
:
bác namqn giúp em thêm cái này nữa, em viết đoặn chtr điều khiển tốc độ động cơ dùng triết áp, điểm đầu và chuối mắc vào 0 và 5V, điểm giữa đưa vào AN0 của 30F4011, dùng L298,
với động cơ chưa có tải, và em để PWM là kich chuyển đổi ADC thì em chỉnh chiết áp thì tốc độ thay đổi rất trươn ko có vấn đề j cả, nhung em cho thêm cái tải là em dùng dây cô doa nối sang 1 động cơ khác thôi, là tụ nhiên 2 chạy rất giật, điều chỉnh tốc độ cũng bị giật mà để em 1 vị trí tốc độ thì nó chạy dc vài vông lại giật 1 cái, ở dải tốc độ thấp cả 2 con đều ko chay, em có chuyển sang dùng timer3 kích chuyển đổi thì có vẻ chạy ko bị giật hơn và ở giải tốc đọ thấp vẫn điều khiển dc, nhung chỉ cần hơi vặn nhanh triết áp 1 tí là vdk bị đơ và dc đứng yên. anh xem hộ em vơi
đây là code của em
Code:
------------------------------------------------------------------------------*/
#include <p30f4011.h>
#include <pwm.h>
#include <adc10.h>

	_FOSC(CSW_FSCM_OFF & FRC_PLL4);
	_FWDT(WDT_OFF);
	_FBORPOR(PBOR_OFF & MCLR_EN);
	_FGS(CODE_PROT_OFF);

//------------------------------------------------------------------------------
//Cac hang so cua chuong trinh (gia tri tuc thoi dung trong chuong trinh)
#define	PWM_PORT	PORTE		//Cac tin hieu PWM nam o cong E
#define	PWM_TRIS	TRISE		//Thanh ghi 3 trang thai cho cac tin hieu PWM
#define	PWM_LAT		LATE		//Thanh ghi chot cac tin hieu PWM

//Cac prototype cho cac chuong trinh con
void Init_PORTS(void);
void INT_MCPWM(void);
void INT_ADC10BIT(void);

//Chuong trinh Khoi tao Module MCPWM
//------------------------------------------------------------------------------
void INT_MCPWM(void)
{
	unsigned int config1, config2, config3;
	unsigned int period, sptime;

	
	period = 368; 					// Oche do Free run PTPER = fcy/fpwm/PTMRprescaler - 1 
									// fcy = 7.37 Mhz, Fpwm = 20 KHz, PTMRprescaler = 1 ==> PTPER = 
	sptime = 0;						//Thiet lap thanh ghi SEVTCMP cho viec tao ngat su kien dac biet(neu can)
		
	config1 = 	PWM_EN & 			//PWM Module Enable
				PWM_IDLE_STOP&		//Idle Mode Operation
				PWM_OP_SCALE1& 		//Output post scaler 1:1
				PWM_IPCLK_SCALE1& 	//input prescaler 1:1
				PWM_MOD_FREE; 		//mode of free run
	
	config2 = 	PWM_MOD1_IND&		//Dung cac chan PWM L&H 1 cach doc lap
				PWM_MOD2_IND&
				PWM_MOD3_IND&			
				PWM_PDIS1H&			//Chi dung chuc nang PWM voi chan PWM1L
				PWM_PDIS2H&
				PWM_PDIS3H&
				PWM_PEN1L&
				PWM_PDIS2L&
				PWM_PDIS3L ;
	
	config3 = 	PWM_SEVOPS16& 		//Special event post scaler
				PWM_OSYNC_TCY& 		//output Override synchronization
				PWM_UEN; 			//PWM update enable/disable
	
	OpenMCPWM(period, sptime, config1, config2, config3);

	PDC1=0;	
	}

//Chuong trinh Khoi tao Module ADC 10bit
//------------------------------------------------------------------------------
void INT_ADC10BIT(void)
{
	unsigned int config1, config2, config3, configport, configscan;
	unsigned int channel;
	
	
	channel =  ADC_CH0_POS_SAMPLEA_AN0 ;     // A/D Chan 0 pos i/p sel for SAMPLE A is AN0
	SetChanADC10(channel);
	
	config1 = 	ADC_MODULE_ON&
				ADC_IDLE_STOP&
				ADC_FORMAT_INTG&			//dinh dang ket qua là canh phai (right justify)
				ADC_CLK_MPWM&				//Module PWM cham dut lay mau va kich hoat
				ADC_SAMPLE_INDIVIDUAL &				
				ADC_AUTO_SAMPLING_OFF&		//bat dau lay mau khi SAMP =1
				ADC_SAMP_ON;				//Khoi dong che do tu dong lay mau
	
	config2 = 	ADC_VREF_AVDD_AVSS&			//lay Vdd va Vss lam dien ap tham chieu
				ADC_SCAN_OFF&
				ADC_CONVERT_CH0&
				ADC_SAMPLES_PER_INT_1&		//co bao AIDF va bit DONE duoc set sau 1 lan lay mau (so lan lay mau tu 1 den 16 do bit  SMPI <3:0>
				ADC_ALT_BUF_OFF&
				ADC_ALT_INPUT_OFF;
			
	config3 = 	ADC_SAMPLE_TIME_1&			//Thoi gian lay mau bang 1 Tad
				ADC_CONV_CLK_SYSTEM&
				ADC_CONV_CLK_2Tcy;		
	
	configport = ENABLE_AN0_ANA;			//Enable chân AN0 la chan analog
	
	configscan = SCAN_NONE;		
	
	OpenADC10(config1, config2, config3, configport, configscan);
	_ADIF = 0;								//Xoa co ngat ADC
	_ADIE = 1;								//Cho phep ngat ADC
	_ADON = 1;								//Bat module ADC
	
}
//Trinh phuc vu ngat cho ADC
//------------------------------------------------------------------------------
void _ISR _ADCInterrupt(void)
{	
	PDC1 = ADCBUF0;		//Cap nhat cac thanh ghi dem chu ky nhiem vu	
	_ADIF = 0;
}

//------------------------------------------------------------------------------
//Chuong trinh chinh
int main(void) {
	Init_PORTS();			//Khoi tao cac cong I/O
	INT_MCPWM();			//Khoi tao module PWM
	INT_ADC10BIT();			//Khoi tao module ADC
	while (1) Nop();
}

//Chuong trinh con khoi tao cac cong I/O, de xuat cac tin hieu PWM, va doc tin
//hieu dieu chinh cua bien tro tai AN0
void Init_PORTS(void) {
	PWM_LAT = 0;			//Xoa thanh ghi chot cac tin hieu PWM
	PWM_TRIS = 0xFFC0;		//Cac tin hieu PWM nam tai RE0..RE5
	TRISB = 0x0071;			//Chan RB6 la ngo vao analog AN6, cac chan khac
							//la ngo ra
	_LATE2 = 0;
}
và em đang mong anh chỉ bảo cho em cách dùng nhiều hơn 1 chân analog như ở bài trc em đã hỏi.
han_nang_008 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2008, 09:23 PM   #15
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi han_nang_008 View Post
bác namqn có thể nói rõ hơn khi mình dùng nhiều hơn 1 chân ADC, bác có thể viết 1 đoặn ví dụ cụ thể dc ko ah.
Ví dụ dùng AN0 và AN6, chân AN0 lấy tín hiệu từ triết áp để điều khiển tốc độ động cơ, còn chân AN6 lấy tín hiệu dòng phản hồi của động cơ, rồi hiện thì lên LCD chẳng han,thì cấu hình như nào, tốc độ lấy mẫu như nào thì phù hợp ah, với AN0 thì dùng PWM chấm dứt lấy mẫu, còn với AN6 mình dùng TIMER3 chấm dứt lấy mẫu có hợp lý ko anh, ADCHS mình khai báo như nào ah kết quả chuyển đổi từ 2 chân trên mình lấy ở đâu ra ah, có phải từ ADCBUF0 và ADCBUF6 ko bác
EM hỏi thêm bác đoặn này
bit 5-2 SMPI<3:0>: Sample/Convert Sequences Per Interrupt Selection bits
1111 = Interrupts at the completion of conversion for each 16th sample/convert sequence
1110 = Interrupts at the completion of conversion for each 15th sample/convert sequence
.....
0001 = Interrupts at the completion of conversion for each 2nd sample/convert sequence
0000 = Interrupts at the completion of conversion for each sample/convert sequence
cái này có phải lựa chon ngắt xảy ra sau 1 đến 16 lần chuyển đổi xong, hay ngắt khi lấy mẫu 1 đến 16 lần rồi chuyển đôi.
Em thấy cái thứ nhất có vẻ đúng hơn, có phải ko hả bác
Mong bác giúp đỡ em
Bạn cần tham khảo hình 20-1 trong datasheet (hay hình 17-1 trong tài liệu "dsPIC30F Family Reference Manual") về cách thức kết nối các ngõ vào đến các bộ sample-and-hold (S/H), và xem thêm các khả năng sử dụng các bộ multiplexer A và B.

Tôi không có thói quen dùng hàm thư viện của MPLAB C Compiler for dsPIC, do đó tôi chỉ nêu những thay đổi đối với các thanh ghi liên quan đến module ADC, cho trường hợp ví dụ của bạn, sử dụng AN0 và AN6.

Dựa vào hình vẽ 20-1 trong datasheet, có thể thấy để lấy mẫu các ngõ vào AN0 và AN6, cần thiết lập để kênh S/H số 0 (CH0) sử dụng AN6, và kênh S/H số 1 (CH1) sử dụng AN0. Để làm việc này, thanh ghi ADCHS sẽ được thiết lập là 0x0006 (bạn xem "dsPIC30F Family Reference Manual" về ý nghĩa của các trường trong thanh ghi này). Đồng thời, các bit CHPS<1:0> trong thanh ghi ADCON2 cần được thiết lập là '01' để việc chuyển đổi được thực hiện cho CH0 và CH1. Tất nhiên, thanh ghi ADPCFG cũng cần cập nhật để các bit 6 và 0 là '0' (do đó các chân AN6 và AN0 sẽ là các chân analog).

Bạn có thể dùng chế độ tự động lấy mẫu, thay vì chọn một trong các nguồn tín hiệu chấm dứt lấy mẫu.

ADCBUF chỉ là một bộ đệm được lần lượt điền các kết quả vào, không có chuyện ánh xạ kết quả của AN0 vào ADCBUF0, và của AN6 vào ADCBUF6. Tôi chân thành đề nghị bạn đọc mục 17 của tài liệu "dsPIC30F Family Reference Manual", có rất nhiều ví dụ với hình minh họa về cách sử dụng bộ đệm ADCBUF. Câu hỏi của bạn về field SMPI<3:0> cũng được trả lời rõ trong phần này, theo như ý đầu tiên của bạn: ngắt sau 1 đến 16 chu kỳ lấy mẫu/chuyển đổi.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Tags
dspic30f adc, dspic30f pwm


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
dsPIC Tutorial 3-Đọc ngõ vào và giao tiếp LCD namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 92 19-02-2017 11:15 PM
dsPIC Tutorial 2-Các kỹ thuật cơ bản namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 33 17-10-2013 11:09 PM
dsPIC Tutorial 1-Tạo và biên dịch một project (ASM30) namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 16 22-08-2012 12:35 AM
dsPIC Tutorial 4-Module UART và I2C namqn dsPIC - Bộ điều khiển tín hiệu số 16-bit 76 09-05-2012 10:55 AM
RF module khanh_pic Tìm mua sản phẩm 22 20-08-2007 11:25 AM


Múi giờ GMT. Hiện tại là 06:51 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam