View Single Post
Old 14-11-2008, 08:15 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 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