membantu ade7753

K

kbbhushan

Guest
Hai,
Aku melakukan proyek menggunakan ade7753 dan atmega32.
Saya tidak mampu membangun komunikasi antara dua.
Dapatkah seseorang please help me.

Ini adalah kode spi.
int main (void)
(

/ / Menginisialisasi perpustakaan kami
/ / Inisialisasi UART (port serial)
uartInit ();
/ / Set baud rate dari UART untuk kita debug / pelaporan output
uartSetBaudRate (9600);
/ / Menginisialisasi sistem timer
timerInit ();

/ / Menginisialisasi sistem rprintf
/ / - UartSendByte gunakan sebagai output untuk semua pernyataan rprintf
/ / Ini akan menyebabkan semua fungsi perpustakaan rprintf untuk mengarahkan mereka
/ / Output ke UART
/ / - Rprintf dapat dibuat untuk output ke perangkat lain yang mengambil karakter.
/ / Anda harus menulis fungsi yang mengambil suatu unsigned char sebagai argumen
/ / Dan kemudian meneruskan ini untuk rprintfInit seperti ini: rprintfInit (YOUR_FUNCTION);
rprintfInit (uartSendByte);

/ / Menginisialisasi perpustakaan vt100
vt100Init ();

/ / Bersihkan layar terminal
vt100ClearScreen ();
SBI (DDRD, 1);
chi (DDRD, 0);

char hasil;
spi_init ();
ade7753_write_to_reg (0x13, 0x02);
hasil = ade7753_read_from_reg (0x13);
rprintf ( "Hasil adalah% d \ r \ n", (uint8_t) result);/ / Spi_tx ();
/ / Spi_rx ();/ /)

)

void ade7753_write_to_reg (char addr, char nilai) (
rprintf ( "Di ade7753_write_to_reg \ r \ n");
spi_start ();
/ / tulis alamat untuk komunikasi mendaftar terlebih dahulu
addr = (addr 0 x80);
rprintf ( "Alamat ini sedang ditulis% d \ r \ n", addr);
spi_tx (addr); / / alamat reigster untuk menulis
_delay_us (0,05);
spi_tx (nilai); / / nilai yang akan ditulis untuk mendaftarkan
spi_end ();
)

unsigned char ade7753_read_from_reg (char addr)
(
unsigned char regval;
rprintf ( "Di ade7753_read_from_reg \ r \ n");
spi_start ();
/ / menulis alamat membaca komunikasi mendaftar mendaftar untuk pertama
addr = (addr 0 x80);
rprintf ( "Ini adalah mendaftar membaca alamat% d", addr);
_delay_us (4); / / t9 = alamat 4uswait sampai setelah di-load

regval = spi_rx ();
kembali regval;
)

spi_init void (void)
(
/ * set mosi keluar; SCK keluar; SS keluar; * /
DDR_SPI = DDR_SPI | (1 <<mosi) | (1 <<SCK) | (1 <<SS);
/ * Set miso dalam * /
DDR_SPI = DDR_SPI & ~ (1 <<Miso);
/ * Aktifkan SPI; mengatur modus Master; SPI Mode = 3; f '= f/128 * /
SPCR = (1 <<SPE) | (0 <<DORD) | (1 <<MStr) | (0 <<CPOL) | (1 <<CPHA) | (0 <<SPR1) | (1 <<SPR0) ;

return;
)

void spi_tx (unsigned char data)
(
/ * Mulai transmisi * /
SPDR = data;
rprintf ( "Hal ini spi_tx data adalah% d", data);
/ * Tunggu untuk transmisi lengkap * /
while (! (SPSR & (1 <<SPIF)));

return;
)

unsigned char spi_rx (void)
(
/ * Send a dummy karakter * /
SPDR = dummy;
/ * Tunggu penerimaan lengkap * /
while (! (SPSR & (1 <<SPIF)));
/ * Kembali register data * /
rprintf ( "Hal ini spi_tx data adalah% d", SPDR);
kembali SPDR;
)

spi_start void (void)
(
/ * End, jika ada, sesi sebelumnya * /
spi_end ();
/ * Set SS rendah - memulai sesi baru * /
PORT_SPI = PORT_SPI & ~ (1 <<SS);

return;
)

spi_end void (void)
(
/ * Set SS tinggi * /
PORT_SPI = PORT_SPI | (1 <<SS);

return;
)

 
Maaf, aku tidak akrab dengan ATMEGA32 tapi aku telah melihat di datasheet dan satu-satunya hal yang mungkin
salah di sini:

Quote:

/ * Aktifkan SPI; mengatur modus Master; SPI Mode = 3; f '= f/128 * /

SPCR = (1 <<SPE) | (0 <<DORD) | (1 <<MStr) | (0 <<CPOL) | (1 <<CPHA) | (0 <<SPR1) | (1 <<SPR0) ;
 
Thanks for your reply.
Sebenarnya Saya menggunakan SCK sebagai f/16.Aku lupa untuk mengubah komentar di sana.
Jika setiap hal yang baik-baik saja, aku tidak tahu di mana aku akan salah.
Dapatkah anda jelaskan jika tidak dalam kode mana saya pergi mungkin salah.

 
Ups, saya tidak melihat bahwa Anda menulis alamat ke ADE7753 di sini:

Quote:

unsigned char ade7753_read_from_reg (char addr)

(

unsigned char regval;

rprintf ( "Di ade7753_read_from_reg \ r \ n");

spi_start ();

/ / menulis alamat membaca komunikasi mendaftar mendaftar untuk pertama

addr = (addr 0 x80);

rprintf ( "Ini adalah mendaftar membaca alamat% d", addr);

_delay_us (4); / / t9 = alamat 4uswait sampai setelah di-loadregval = spi_rx ();

kembali regval;

)

 
Terima kasih banyak.
Saya pikir setiap hal yang baik-baik saja.Kesalahan pernyataan sederhana yang tidak noticable.Now aku akan benar dan menjalankan program ketika pergi ke laboratorium dan membiarkan u tahu.

Dan kau mengatakan bahwa alamat tidak seharusnya 0 x80.
Alasan untuk menambahkan 0x80 adalah bahwa dalam perintah byte (baca / tulis) yang menceritakan ade7753 apakah saya melakukan operasi membaca atau menulis.Dalam menulis MSB komando operasi harus tinggal 1.Kemudian cara mengatur 1 pada MSBit.

Terima kasih banyak lagi.

 
Anda dapat melihat di sini bahwa ketika membaca dari ADE7753 pertama kali Anda mengirimkan perintah byte (alamat) tertinggi dengan dua bit 0.
Setelah itu Anda mulai mengirim bodoh byte untuk membaca byte data.<img src="http://images.elektroda.net/8_1215370714_thumb.jpg" border="0" alt="help with ade7753" title="membantu ade7753"/>
 
Hai,
Terima kasih.Kerjanya sekarang.
Satu lagi keraguan bahwa beberapa register di ade7753 ditandatangani dan ada pula yang ditandatangani.
Fungsi saya dinyatakan sebagai unsigned.
Bisakah anda jelaskan bagaimana menangani angka ditandatangani.

Terima kasih.

 
Ketika Anda membaca data dari ADE7753 Anda dapat menggunakan variabel unsigned dan kemudian menyimpannya ke dalam variabel dinyatakan dengan benar.

8 dan 16 bit nilai-nilai yang sederhana seperti peta mereka ke chars dan bilangan bulat langsung - beberapa contoh:

Untuk menandatangani 8-bit register TEMP (0x26) mendeklarasikan variabel --

char TEMP;

- Dan kemudian menyimpan data byte dari SPI --

TEMP = spi_rx ();Untuk unsigned 8-bit register GAIN (0x0f) mendeklarasikan variabel --

unsigned char GAIN;

- Dan kemudian menyimpan data byte dari SPI --

GAIN = spi_rx ();Untuk menandatangani register 16-bit Apos (0x11) mendeklarasikan variabel --

int Apos;

- Dan kemudian menyimpan integer dari sebuah serikat seperti yang kita definisikan pada thread lain --

Apos = value.Int;Untuk unsigned 16-bit register LINECYC (0x1C) mendeklarasikan variabel --

unsigned int LINECYC;

- Dan kemudian --

LINECYC = value.Int;Untuk unsigned 24-bit register IRMS (0x16) menyatakan 32-bit variabel --

unsigned long IRMS;

- Dan kemudian --

IRMS = value.Long;Sekarang, menyimpan 24-bit ditandatangani panjang sedikit rumit yang Anda butuhkan untuk memperluas tanda bit, sedikit 23.
Untuk menandatangani register 24-bit gelombang (0x01) menyatakan 32-bit variabel --

gelombang panjang;

- Dan kemudian memeriksa apakah nilai membaca negatif (sign bit = 1) dan menetapkan atas 8 bit 24-31 --

if (value.Char [1] & 0x80) value.Char [0] = 0xFF;Gelombang = value.Long;Beberapa nilai masuk adalah 12 bit sehingga kita harus melakukan hal yang sama dengan mereka.
Untuk menandatangani 12-bit register VAGAIN (0x1A) menyatakan 16-bit variabel --

int VAGAIN;

- Dan kemudian memeriksa apakah nilai membaca negatif (sign bit 11 = 1) dan menetapkan atas 4 bit 12-15 --

if (value.Char [0] & 0x08) value.Char [0] = value.Char [0] | 0xF0;VAGAIN = value.Int;Terlihat sedikit berantakan tapi saya harap Anda mendapatkan ide umum.

/ Ram

 
hai,
Terima kasih atas semua bantuan Anda.Kerjanya.

Saya tidak memiliki trafo arus dan transformator tegangan.Apakah Anda punya ide bagaimana saya bisa menguji apakah seluruh rangkaian bekerja atau tidak.

Thanks in advance.

 
Good job!

Datasheet yang ADE7753 mengatakan bahwa pengukuran input dapat mengambil ą0.5 V jadi kurasa kau bisa
tegangan yang terhubung langsung ke input.Jika Anda memeriksa angka 29 di halaman 14 Anda dapat menerapkan
"tegangan" sinyal untuk pin 7 (V2P) dan "saat ini" untuk pin 4 (V1P).Anda juga perlu tanah pin 5 (V1N)
dengan menghubungkan 100 ohm resistor pada pin ke ground.Saya pikir harus bekerja.

Mungkin anda tidak memerlukan sinyal AC jadi coba dengan sebuah ≤ 0,5 V DC tegangan.
Saya kira bahwa hasilnya akan diukur produk dari dua tegangan, seperti P = V * I, sehingga Anda
dapat menyesuaikan salah satu dari mereka dan melihat bagaimana "P" bervariasi.

/ Ram

 
Terima kasih.

Bukankah kita perlu untuk mengatur fase offset, dll hal-hal semacam itu.

 
Jika Anda menggunakan DC atau tegangan AC, dari sinyal generator, pencocokan fasa sempurna sebagai sinyal datang
dari sumber yang sama.
Tahap pencocokan hanya datang dalam bermain dalam aplikasi nyata, dengan transformer dan barang-barang dan kemudian Anda perlu kalibrasi
pengukuran.

Saya kira Anda telah melihat catatan aplikasi ini di mana fase pencocokan dan kalibrasi dibahas:
http://www.analog.com/Analog_Root/static/pdf/library/applicationNotes/an564.pdf

/ Ram

 
Hai,

Pada tabel 6 dari lembar di halaman 16 dikatakan bahwa ukuran LSB 1.61mV/LSB.Apa sebenarnya artinya?dan di suatu tempat itu juga mengatakan bahwa 2.2ms/LSB.apa artinya ini?

Terima kasih.

 
Koreksi offset mendaftar memiliki 6 bit - 1 untuk tanda dan 5 untuk besar.

Dikatakan dalam teks yang maksimum tegangan 0x1F = 31 langkah-langkah yang digunakan untuk koreksi dan sebagai yang
span koreksi adalah ą50 mV (untuk Gain = 1) Anda mendapatkan 50/31 = 1,61 mV dalam setiap langkah.
Mengubah nilai register dengan LSB (Least Significant Bit) - dengan baik meningkat atau menurun dengan 1 - akan
dalam hal ini menghasilkan langkah tegangan 1,61 mV / LSB.

Seperti yang dapat Anda lihat dari tabel langkah tegangan bervariasi sesuai dengan rentang maksimum.

/ Ram

 
Hai,

Terima kasih untuk menjelaskan padaku.

Register AENERGY ditandatangani oleh dua's melengkapi metode.Bagaimana seharusnya saya membaca nilai dari register?Jika saya membaca menggunakan variabel unsigned, bagaimana untuk mengubahnya agar aku bisa mendapatkan nilai yang tepat.

 
and is used like this:

Cara untuk memberitahu compiler yang ingin Anda menangani nilai unsigned ditandatangani disebut casting
dan jenis
digunakan seperti ini:

Kode:

nilai panjang;

unsigned long aenergy;nilai = (lama) aenergy;

 
Hai,

Terima kasih.

Saya mencoba membaca IRMS dan VRMS register.Aku semakin besar nilai-nilai hex.datasheet mengatakan bahwa itu harus diubah menjadi ampli / LSB konstan.Tapi aku tidak punya ide bagaimana untuk melakukannya.Aku telah melalui kalibrasi pdf.Please help me.

 
Quote:

Dengan ditentukan skala penuh ac sinyal input analog sebesar 0,5 V, output dari LPF1 ayunan antara 0x2518 dan 0xDAE8 di 60 Hz melihat bagian ADC Channel 2.
Setara dengan nilai rms dari skala penuh ini sinyal ac adalah sekitar 1.561.400 (0z17D338) di VRMS register.
 

Welcome to EDABoard.com

Sponsor

Back
Top