Professional Documents
Culture Documents
Giao tiếp VDK-ADE C
Giao tiếp VDK-ADE C
#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
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.
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);
}
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
Urms1=ReadADE1(VRMS,3);
Irms1=ReadADE1(IRMS,3);