PDA

View Full Version : EPWM trong Pic18f458 !


daihang86
29-12-2006, 08:45 AM
Em dùng CCS để lập trình full-bridge với khối EPWM trong PIC, nhưng không chạy ! Đại ca nào làm chạy rồi chỉ cho em phát.
Cảm ơn.

namqn
29-12-2006, 08:42 PM
Em dùng CCS để lập trình full-bridge với khối EPWM trong PIC, nhưng không chạy ! Đại ca nào làm chạy rồi chỉ cho em phát.
Cảm ơn.
Bạn viết code như thế nào mà không chạy?

Thân,

daihang86
29-12-2006, 11:09 PM
Em dung cac ham nhu sau:

setup_timer_2();
setup_ccp1(CCP_PWM1_H_H) hoac "CCP_PWM_FULL_BRIDGE"
set_pwm1_duty(400)

Em dung cac ham nay cho pwm binh thuong thi chay ngon, nhung cho epwm thi chiu. Mong bac giup em phat, em rat khoai cai epwm cua no, do phai them mach ngoai.

namqn
30-12-2006, 08:11 AM
Em dung cac ham nhu sau:

setup_timer_2();
setup_ccp1(CCP_PWM1_H_H) hoac "CCP_PWM_FULL_BRIDGE"
set_pwm1_duty(400)

Em dung cac ham nay cho pwm binh thuong thi chay ngon, nhung cho epwm thi chiu. Mong bac giup em phat, em rat khoai cai epwm cua no, do phai them mach ngoai.
Dùng ECCP1 thì phải set up theo khuyến cáo của hãng, trình tự ở mục 16.5.8 trong datasheet của PIC18F458. Nếu dùng các hàm có sẵn của CCS thì không có gì đảm bảo thứ tự set up, hơn nữa, địa chỉ của ECCP1 ứng với CCP2 trong CCS.

Thân,

bantrang25
01-01-2007, 08:39 AM
Anh Namqn oi! anh co ctrinh mau CCS nao viet cho con AD 16bit (AD7715) ko?No co ctr mau trong CCS, em viet theo no ma ko chay?

namqn
01-01-2007, 09:38 PM
Anh Namqn oi! anh co ctrinh mau CCS nao viet cho con AD 16bit (AD7715) ko?No co ctr mau trong CCS, em viet theo no ma ko chay?
CCS C đã có driver cho AD7715 rồi, bạn chỉ cần đặt các hàm (bit banging) đó vào trong chương trình của bạn, rồi dùng chúng là được. Bạn nên post phần code mà bạn đã thử, và cả sơ đồ phần cứng của bạn nữa.

Thân,

daihang86
02-01-2007, 05:11 PM
To Namqn, em đã thử với ECCP2 vẫn chẳng thấy tín hiệu ra cả, anh có thời gian xem hộ em phát. Chứ em thử hết các kiểu trong CCS rồi, vì mỗi EPWM mà phải học thêm phần mền biên dịch khác thì cũng mệt.

namqn
02-01-2007, 08:07 PM
To Namqn, em đã thử với ECCP2 vẫn chẳng thấy tín hiệu ra cả, anh có thời gian xem hộ em phát. Chứ em thử hết các kiểu trong CCS rồi, vì mỗi EPWM mà phải học thêm phần mền biên dịch khác thì cũng mệt.
Dưới đây là đoạn chương trình thử ECCP của tôi, viết trong Basic của PIC18 Simulator, bạn chuyển thành CCS C đi nhé:

TRISD = TRISD Or 0xf0
PR2 = 0x80
ECCPR1L = 0x40
ECCP1CON = 0x4c
PIR1.TMR2IF = 0
T2CON = T2CON And 0xfc
T2CON.TMR2ON = 1
While PIR1.TMR2IF = 0
Wend
TRISD = TRISD And 0x0f
loop:
Goto loop 'loop forever

Thân,

Sangcao
05-01-2007, 10:10 AM
Anh Nam a , day la ctr cua em, em hien thi tren led 7 doan, phan hien thi ko co gi , chan cua ad7715 em noi chan nhu trong huong dan. day la code:
#include <16f877.h>
#include <defs_16f877A.h>
//#include <AD7715.c>
//#device *=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT//HS,NOWDT,NOLVP,NOPUT, NOCPD, NOWRT, NOBROWNOUT, NOPROTECT //NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=11059200) // Su dung Fuse nay thi co nhieu , ko biet tai sao?
#use fast_io(b)
#use fast_io(d)
#use fast_io(c)

int8 const BCD2LED[]={ 0x41, 0xED, 0x54, 0xC4, 0xE8,\
0xC2, 0x42, 0xE5, 0x40, 0xC0, };
int8 COUNT1 ,COUNT2;

int16 COUNTX,T1,T2; // Bien trong ngat
int16 BUFF[4], Y0, Y1; // Bo dem de hien thi so tat hay khong
int8 BCD[4];
int16 value;
//-------------------------------------------------------------//
#define LED1 RB4 // =0 thi LED sang
#define LED2 RB5
#define LED3 RB6
#define LED4 RB7
//-----------
#define ADC_CS RC7 // Noi dat GND
#define ADC_RESET RC6 // Noi VCC
#define ADC_DRDY RC2
#define ADC_DI RC4
#define ADC_DO RC5
#define ADC_CLK RC3



Void LamTuoi()

{
if(COUNT1 >=4) {COUNT1 = 0; }
PORTB = 0xf0;
PORTD = BCD2LED[BCD[COUNT1]]; // CHOT*/

switch (COUNT1) {
case 0: LED1 =0; //bat led1
break;
case 1: LED2 =0; //bat led2
break;
case 2: LED3 =0; //bat led3
break;
case 3: LED4 =0; //bat led4
break;

}
COUNT1 ++;
}
#int_timer0
void ngat()
{
Set_timer0(0);
COUNT2 ++;
if (Count2 == 10){
Count2 = 0;
LamTuoi();
//COUNTX = read_adc();
}
}
void InBCD(int8 value4,int8 value3,int8 value2,int8 value1)
{
BCD[0]= value4;
BCD[1]= value3;
BCD[2]= value2;
BCD[3]= value1;
}


void LedView( int16 Value) // DUA SO VAO DE HIEN THI
{
BUFF[3] = Value/1000;
Y0 = Value%1000;
BUFF[2] = Y0/100;
Y1 = Y0%100;
BUFF[1] = Y1/10;
BUFF[0] = Y1%10;

InBCD(BUFF[3],BUFF[2],BUFF[1],BUFF[0]);
}

void write_adc_byte(Byte data);

adc_init()
{
ADC_RESET = 0;
ADC_CLK =1;
ADC_CS =1; //Set low to AD7715 chip select low pin
ADC_RESET =1; //Set high to AD7715 reset low pin
delay_ms(30);

write_adc_byte( 0x12 ); //Communications Register
write_adc_byte( 0x62 ); //Setup Register info here
}

void write_adc_byte(BYTE data) {
int8 i;

ADC_CS =0;
for(i=1;i<=8;++i) {
ADC_CLK =0;
output_bit(PIN_C4,shift_left(&data,1,0)); // Output the MSB of data to

// DI and at the same time shift 0 into the LSB of data

ADC_CLK =1;
}
ADC_CS =1;
}


int16 read_adc_word() {
int8 i;
BYTE data;

ADC_CS =0;
for(i=1;i<=16;++i) {
ADC_CLK =0;
ADC_CLK =1;
shift_left(&data,2,input(PIN_C5));
}
ADC_CS =1;
return data;
}



int16 read_adc_value() {
int16 value; //long mac dinh kieu int16

while ( input(PIN_C2) );
while ( !input(PIN_C2) );
while ( input(PIN_C2) );

write_adc_byte(0x3a);
value=read_adc_word();

// return value;
}



void KhoiTao()
{
set_tris_b(0b00001111); // 1 Dau vao =0 la dau ra
set_tris_d(0); // ra
set_tris_c(0b11111111);
enable_interrupts(global);
//enable_interrupts(int_ext);
enable_interrupts(int_timer0);
Setup_timer_0(RTCC_INTERNAL| RTCC_DIV_4);
Set_timer0(0) ; //vao
Value=0;
Delay_ms(10);

}
//-------------------------------------------------------------


void main()
{ Khoitao();
adc_init();
ledview(Value);
Lamtuoi();

while (1) {

read_adc_value() ;

ledview(Value);
Lamtuoi();

}


}

Sangcao
05-01-2007, 10:20 AM
Anh xem cho em tai sao lai ko chay nhe! Em nghi chi can trong ctr chinh goi ham Read_adc_value(), sau do hien thi kq value la ok, em lam the sao no ko chay? anh xem ho em nhe! thank!

namqn
05-01-2007, 09:33 PM
Anh xem cho em tai sao lai ko chay nhe! Em nghi chi can trong ctr chinh goi ham Read_adc_value(), sau do hien thi kq value la ok, em lam the sao no ko chay? anh xem ho em nhe! thank!
Lệnh gọi hàm read_adc_value() trả về giá trị 16-bit, nhưng trong main lại không ghi giá trị trả về đó vào biến value. Trong C, hai biến 'Value' và 'value' có phải là 1 biến hay không?

Chương trình con read_adc_value() dùng biến cục bộ value để lưu giá trị trả về, sau đó trả về bằng lệnh return. Bạn lại chú thích lệnh return đó, do đó chương trình không thực hiện đúng ý đồ là lẽ đương nhiên.

Thân,

Sangcao
08-01-2007, 12:55 PM
Cam on anh Nam nhieu! Ve nha em se thu lai! co gi em hoi anh tiep nhe

moihocpic1985
09-01-2007, 09:56 AM
Lệnh gọi hàm read_adc_value() trả về giá trị 16-bit, nhưng trong main lại không ghi giá trị trả về đó vào biến value. Trong C, hai biến 'Value' và 'value' có phải là 1 biến hay không?

Chương trình con read_adc_value() dùng biến cục bộ value để lưu giá trị trả về, sau đó trả về bằng lệnh return. Bạn lại chú thích lệnh return đó, do đó chương trình không thực hiện đúng ý đồ là lẽ đương nhiên.

Thân,

Em dung assemly tren 16f877a thi co the chuyen doi adc va hien thi ra led tot nhung khi dung CCSC thi khong chay gi ca. Anh xem doan code sau co sai cho nao khong gium em nha:
#include <16f877a.h>
#device *=16 ADC=8
#use delay(clock=4000000)
#byte portb=0x06

#fuses nolvp,nowdt,hs,noprotect

int8 ADC_delay;

void hienthi()
{
set_adc_channel(0);
delay_ms(5);
ADC_delay=read_adc();
portb=0x00;
delay_ms(ADC_delay);

portb=0xff;
delay_ms(ADC_delay);
}

void main()
{
setup_adc_ports(AN0_AN1_AN3);
setup_adc(adc_clock_internal);
set_adc_channel(0);
while(1);
{
hienthi();

}
}

Sangcao
09-01-2007, 01:23 PM
Ban thu ctrinh nay, da co trong Pic viet Nam: Tu do phat trien len nhe!
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP //Ðây là 1 ví du nho ve ADC,chân RA0 lay tín hieu Analog tu bien tro
#device 16F877*=16 ADC=8 //và xuat giá tri se bien doi tuong ung qua tám led noi o portB
#use delay(clock=10000000)
Int8 adc;
main()
{
setup_adc(adc_clock_internal);
setup_adc_ports(AN0);
set_adc_channel(0);
delay_ms(10);
while(true)
{
adc=read_adc();
output_B(adc);
}
}