Kemampuan modul EPWM
- Output epwmA epwmB dapat berfungsi sebagai:
- operasi satu sisi
- operasi simetris dua sisi
- operasi asimetris tepi ganda
- Waktu mati dapat dikonfigurasi
- Peristiwa TZ dapat dikonfigurasi dan status logis dari output HI dan LO dapat diatur.
- Acara interupsi atau acara SOC untuk ADC dapat dikonfigurasi.
Mari kita lebih dekat ke blok utama: terdiri dari apa modul ePWM dan apa yang terhubung dengannya.
Seperti yang Anda lihat dari gambar, tidak banyak blok di modul ePWM. Oleh karena itu, masuk akal untuk mempertimbangkan tanggung jawab setiap modul dan mulai dengan sinyal.
- Sinyal EPWMxA dan EPWMxB mungkin merupakan sinyal keluaran yang paling jelas. Status logika normal adalah HI atau LO, bergantung pada bagaimana tindakan keluaran dikonfigurasi
- TZ1 — TZ6 — . , , , . , EPWMxA EPWMxB . , , - , , . . , .
- EPWMxSYNCI EPWMxSYNCO — , , .
- Sinyal EPWMxSOCA dan EPWMxSOCB - di sini semuanya lebih dari jelas dari namanya. Peristiwa ini dapat mengatur peristiwa SOC untuk ADC.
- Sinyal EPWMxTZINT dan EPWMxINT - disini event interupsi pada TZ dan event yang berhubungan dengan PWM itu sendiri, misalnya, menghasilkan interupsi pada periode PWM.
Sekarang mari beralih ke
modul Time base (TB) - modul bertanggung jawab atas waktu acara setiap modul ePWM. Kami tidak akan masuk ke semua pengaturan modul ini, saya pikir itu cukup untuk memperhatikan fakta bahwa ada 3 mode operasi penghitung:
- Mode Hitung Atas-Bawah
- Mode Up-Count
- Mode Hitung Bawah
Dan ada juga pengaturan sinkronisasi timer dengan mengatur
modul bit TBCLKSYNC Counter bandingkan (CC) - melaluinya kita hanya mengatur siklus tugas kita.
Modul Action-Qualifier (AQ) - melaluinya Anda dapat mengonfigurasi status untuk suatu acara. Dan untuk keluaran, Anda dapat mengonfigurasi tindakan berikut:
- Setel ke kondisi HI
- Setel ke status LO
- Lakukan inversi status
- Tidak ada yang bisa dilakukan
Modul Dead-Band Submodule (DB) - modul ini dapat digunakan untuk mengatur dead band untuk saluran PWM. Bukan rahasia lagi bagi siapa pun bahwa kunci transistor tidak langsung beralih, dan untuk menghindari situasi ketika kunci setengah jembatan atas tidak punya waktu untuk menutup, dan yang lebih rendah sudah terbuka, mereka mengatur penundaan untuk beralih ke status HI dan sebelumnya beralih ke status LO.
Modul Trip-Zone Submodule (TZ) - seperti disebutkan di atas, modul ini terkait dengan penanganan kondisi darurat. Di sini kita dapat memilih 1 dari 4 tindakan.
- Setel ke kondisi HI
- Setel ke status LO
- Setel status impedansi tinggi
- Tidak ada yang bisa dilakukan
Peristiwa yang memicu aksi modul TZ dapat dipicu baik oleh perangkat lunak maupun perangkat keras. Selain itu, panggilan interupsi juga disediakan.
Sekarang mari beralih dari kata-kata ke latihan.
Pertama, Anda perlu mengkonfigurasi GPIO untuk fungsi epwm alternatif
EALLOW;
// pull-up
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0x000;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0x000;
// GPIO EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0x001;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0x001;
EDIS;
Selanjutnya, setelah kami mengonfigurasi GPIO, kami dapat melanjutkan dengan pengaturan yang berbeda. Untuk mengkonfigurasi operasi PWM, Anda perlu memutuskan apa yang ingin kita dapatkan. Mari kita mulai dengan frekuensi TBCLK. Itu ditentukan oleh rumus:
Di sini Anda perlu memperhatikan fakta bahwa CLKDIV adalah 1 secara default, dengan HSPCLKDIV semuanya berbeda, secara default 2. Ini harus diingat, karena ada kalanya orang melupakannya. Saat memuat program ke dalam RAM, seringkali HSPCLKDIV = 1, masing-masing, masalah ini tidak segera diperhatikan.
Kami telah memutuskan frekuensi clock TBCLK. Tapi kita harus memilih bagaimana penghitung akan bekerja untuk kita. Dengan resesi, dengan meningkatkan, dan mungkin ini dan itu, untuk ini Anda perlu mengkonfigurasi register yang sesuai, misalnya:
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
Ke depan, agar tidak ada yang terintimidasi oleh makro, kami akan menentukan dari mana asalnya sama sekali. Definisi ini didefinisikan dalam file bernama DSP2833x_EPwm_defines.h.
Kemudian Anda perlu memutuskan bagaimana GPIO kami akan bereaksi untuk mencapai nilai TBCTR tertentu. Ada lebih dari cukup opsi. Mereka ditunjukkan pada tabel di bawah ini:
Kemudian Anda perlu memutuskan perilaku apa yang kita inginkan dari port A dan B, yaitu, kita ingin mereka terhubung satu sama lain atau dapat bekerja secara mandiri. Jika kita ingin port A menjadi master, maka kita cukup menuliskan tindakan untuk itu, misalnya (kasus untuk menghitung):
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
jika kita menginginkan kemerdekaan untuk port kedua, maka tambahkan:
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
Untuk detail lebih lanjut tentang pengaturan, Anda perlu merujuk ke gambar di atas hanya untuk satu tambahan, ada register AQCTLA sedikit lebih banyak daripada yang ditunjukkan pada tabel, ini tidak banyak mengubah gambar, tetapi hanya secara spesifik yang diperkenalkan mengenai di mana penghitung mencapai nilai yang diinginkan, misalnya, saat menghitung dalam atas atau hitung mundur. Lebih singkat tentang bit dapat ditemukan di potongan dari file .h sistem
struct AQCTL_BITS { // bits description
Uint16 ZRO:2; // 1:0 Action Counter = Zero
Uint16 PRD:2; // 3:2 Action Counter = Period
Uint16 CAU:2; // 5:4 Action Counter = Compare A up
Uint16 CAD:2; // 7:6 Action Counter = Compare A down
Uint16 CBU:2; // 9:8 Action Counter = Compare B up
Uint16 CBD:2; // 11:10 Action Counter = Compare B down
Uint16 rsvd:4; // 15:12 reserved
};
Jika kita memiliki 2 port ePWM yang bekerja secara mandiri dan kita ingin mengatur waktu mati, maka kita perlu mengatur register ke keadaan yang diinginkan, misalnya:
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
Sekarang setelah kami memutuskan deskripsi pinggiran, kami dapat melanjutkan ke contoh spesifik.
Mengonfigurasi ePWM dalam Mode Penghitungan
Berikut adalah contoh tanpa waktu mati dan port A dan port B bekerja secara independen. Saat A aktif, B tidak aktif.
EPwm1Regs.TBPRD = 150000 / 5; // . 150 / 5000
// 50%
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;
EPwm1Regs.TBPHS.half.TBPHS = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
Pada osilogram Anda dapat melihat hasil yang diperoleh:
Sekarang Anda dapat mencoba menambahkan waktu mati, untuk ini kami menambahkan:
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.all = BP_ENABLE + POLSEL_ACTIVE_HI_CMP; // db
EPwm1Regs.DBFED = 300; // = 150 * 2 = 300
EPwm1Regs.DBRED = 300;
Penghitungan waktu mati dengan cara yang sama seperti frekuensi, dengan rumus:
Dan sekarang kita punya waktu mati seperti yang kita inginkan
Bagaimana jika kita perlu melepaskan port A dan port B. Ini juga terjadi. Semuanya sederhana di sini. Kami kembali ke contoh pertama dan menghapus 4 baris terakhir, dan menulis setiap siklus tugas di register berikut.
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2; // 50%
EPwm1Regs.CMPB = EPwm1Regs.TBPRD / 3; // 33%
Sekarang kami memiliki gambaran seperti itu. Anda dapat mengatur siklus kerja untuk setiap saluran secara terpisah.
Untuk mode decay, semuanya kurang lebih sama. Ada perbedaan dengan hitungan mundur dalam mode naik-turun. Di sini frekuensi shim dihitung menggunakan rumus:
Hal yang sama berlaku untuk Waktu mati.
Mungkin satu-satunya hal penting yang tidak dipertimbangkan adalah pengaturan TZ, nah, sekarang mari kita bahas modul ini lebih detail.
Untuk memicu peristiwa alarm secara terprogram, cukup dengan mengkonfigurasi register berikut:
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
Alarm PWM dapat dipanggil dan disetel ulang menggunakan perintah berikut:
//
EALLOW;
EPwm1Regs.TZFRC.bit.OST = 0x001;
EDIS;
//
EALLOW;
EPwm1Regs.TZCLR.bit.OST = 0x0001;
EDIS;
Jika kita ingin memanggil sinyal TZ di perangkat keras, maka semuanya menjadi lebih mudah, melalui register TZSEL kita mengatur TZ yang kita butuhkan, tetapi selain itu, kita perlu mengkonfigurasi GPIO ke TZ.
Kesimpulan
Jika seseorang menganggap artikel ini menarik, maka saya dapat menulis beberapa artikel lagi dengan cara yang lebih atau kurang cepat. Saya berencana untuk mempertimbangkan modul can, saya ingin dma, dan mungkin saya juga akan menulis artikel kecil tentang IQMath dari ti dengan perpustakaan mereka.