You are on page 1of 4

//ADE

//Khai báo Địa chỉ các thanh ghi trong ADE7753


Tên thanh ghi Địa chỉ Ý nghĩa

#define WAVEFORM 0x01 Thanh ghi dạng sóng điện áp, 24k mẫu/s
#define AENERGY 0x02
#define RAENERGY 0x03
#define LAENERGY 0x04
#define VAENERGY 0x05
#define RVAENERGY 0x06
#define LVAENERGY 0x07
#define LVARENERGY 0x08
#define MODE 0x09
#define IRQEN 0x0A
#define STATUS 0x0B
#define RSTSTATUS 0x0C
#define CH1OS 0x0D
#define CH2OS 0x0E
#define GAIN 0x0F
#define PHCAL 0x10
#define APOS 0x11
#define WGAIN 0x12
#define WDIV 0x13
#define CFNUM 0x14
#define CFDEN 0x15
#define IRMS 0x16 Thanh ghi giá trị hiệu dụng dòng
#define VRMS 0x17 Thanh ghi giá trị hiệu dụng áp
#define IRMSOS 0x18
#define VRMSOS 0x19
#define VAGAIN 0x1A
#define VADIV 0x1B
#define LINECYC 0x1C
#define ZXTOUT 0x1D
#define SAGCYC 0x1E
#define SAGLVL 0x1F
#define IPKLVL 0x20
#define VPKLVL 0x21
#define IPEAK 0x22
#define RSTIPEAK 0x23
#define VPEAK 0x24
#define RSTVPEAK 0x25
#define TEMP 0x26
#define PERIOD 0x27
#define TMODE 0x3D
#define CHKSUM 0x3E
#define DIEREV 0x3F
Khai báo chân ghép nối phần cứng VĐK-ADE
#define RESE_ADE1 PORTB.0
#define MOSI_ADE1 PORTB.1
#define MISO_ADE1 PINB.2
#define SCLK_ADE1 PORTB.3
#define CS_ADE1 PORTB.4

Hàm truyền 8bit VĐK  ADE


void Send_8bit_ADE1(unsigned char Valin){
unsigned char i;
for(i=0;i<8;i++){
delay_us(10);
SCLK_ADE1=1;
delay_us(10);
if((Valin&0x80)==0x80)MOSI_ADE1=1;
else MOSI_ADE1=0;
delay_us(10);
SCLK_ADE1=0;//CKL có sườn xuống thì data dịch
Valin<<=1;
}
}

Hàm ghi dữ liệu vào 1 thanh ghi:


Các tham số của hàm: Giá trị cần ghi, Địa chỉ cần ghi, Độ dài byte của thanh ghi được ghi (độ dài của mỗi
thanh ghi xem trong data sheet).

void WriteADE1(unsigned long value, unsigned char address, unsigned char length){
address=address|0x80; //định dạng địa chỉ ghi luôn có bit 1 ở đầu: 1 A6 A5 A4 A3 A2 A1 A0
CS_ADE1=0;
Send_8bit_ADE1(address);
switch(length){
case 1:
Send_8bit_ADE1(value);
break;
case 2:
Send_8bit_ADE1(value>>8);
Send_8bit_ADE1(value);
break;
case 3:
Send_8bit_ADE1(value>>24);
Send_8bit_ADE1(value>>16);
Send_8bit_ADE1(value);
break;
}
CS_ADE1=1;
}
Hàm đọc dữ liệu từ 1 thanh ghi:
Các tham số của hàm: Địa chỉ cần đọc, Độ dài byte của thanh ghi được đọc (độ dài của mỗi thanh ghi xem
trong data sheet).
Kết quả trả về là giá trị của 1 thanh ghi:
Ví dụ:
X=ReadADE1(VRMS,3);  X sẽ chứa giá trị của thanh ghi VRMS có
địa chỉ là 0x17 (17hexa – 23decac), thanh ghi này có độ dài 3 byte.

long ReadADE1(unsigned char address,unsigned char length){


long kq;
char i;
//---chuẩn bị------
length=length<<3;
address=address&0x3F;// định dạng địa chỉ đọc luôn có bit 0 ở đầu: 0 A6 A5 A4 A3 A2 A1 A0

CS_ADE1=0;
Send_8bit_ADE1(address);
SCLK_ADE1=0;
delay_us(10);
kq=0;
SCLK_ADE1=1;//CLK co suon len thi data o chan DO dich
delay_us(10);
if(MISO_ADE1==1)kq=0xFFFFFFFF;
SCLK_ADE1=0;
delay_us(10);
//---Doc cac bit gia tri--------
for(i=0;i<(length-1);i++){
SCLK_ADE1=1;//CLK co suon len thi data o chan DO dich
kq<<=1;
delay_us(10);
kq|=MISO_ADE1;
SCLK_ADE1=0;
delay_us(10);
}
CS_ADE1=1;
return(kq);
}

Hàm khởi tạo ADE

void ADE_init1(void){
WriteADE1(50,LINECYC,2);//5 chu kỳ lưới (100ms) cập nhật thanh ghi công suất 1 lần.
WriteADE1(0x8C,MODE,2);
}
Sử dụng các hàm giao tiếp ADE
1. Khởi tạo ADE ở hàm MAIN

void main(void){
delay_ms(10);
Init_ports(); // Khởi tạo chiều vào ra cho các cổng
// Timer/Counter 1 initialization
TCCR1B=0x05;
TCNT1=0xEAE8;//Timer1 ->tạo interval 500ms
TIMSK=0x04;// Enable Timer1-Interrupt
delay_ms(100);
ADE_init1();
#asm("sei")// Global enable interrupts
while(1){};// vòng lặp vô tận
}
2. Đọc giá trị thanh ghi từ ADE 500ms/1 lần, để trong hàm phục vụ ngắt của Timer1 (timer này 500ms
ngắt 1 lần)
// Timer 1 overflow interrupt service routine

interrupt [TIM1_OVF] void timer1_ovf_isr(void){


unsigned char Temp_char;
TCNT1=0xEAE8;// Reinitialize Timer1 ->500ms
//Doc ADE
Ptt1 =ReadADE1(LAENERGY,3);
Qtt1 =ReadADE1(LVARENERGY,3);

Urms1=ReadADE1(VRMS,3);
Irms1=ReadADE1(IRMS,3);

You might also like