Bagaimana saya bisa memprogram saklar (berdasarkan pada solid-state relay atau triac) yang memicu pada zero-crossing power?
Untuk yang tidak terbiasa dengan subjek: Nyalakan daya 230V, ketika gelombang sinus dari kabel listrik melintasi nol - hasilnya adalah meminimalkan gangguan elektromagnetik yang dihasilkan dari lonjakan arus yang cepat.
Secara khusus, saya lebih suka pindah ke perangkat lunak sebanyak mungkin. Sirkuit deteksi yang terdiri dari transformator kecil, dioda, dan beberapa pasangan untuk menjaga level dan arus tetap memberikan "1" ketika daya input AC berada di setengah positif, "0" negatif, melekat pada pin GPIO input. Output terdiri dari beberapa relay solid state dan bare esensial agar tetap berjalan (pull-up dll), melekat pada pin GPIO keluaran.
Masalahnya adalah waktu: dengan 50Hz AC kita mendapatkan 100 zero-crossing dalam satu detik, satu setengah siklus adalah 10 ms. Untuk mendapatkan dalam jarak yang wajar dari zero-crossing untuk menjaga kata EMI rendah kita tidak harus mengaktifkan output lebih dari 10% melewati (atau sebelumnya) peristiwa zero-crossing, yang berarti toleransi -1 -1ms. Itu tidak berarti waktu reaksi 1 ms - kita dapat berharap bahwa zero-crossing berikutnya terjadi tepat 10 ms setelah yang pertama, atau yang keempat - 40 ms. Ini tentang granularitas - jika kita membiarkan 20 ms untuk bereaksi, itu harus antara 19 dan 21 ms, bukan 18 atau 22.
Bagaimana saya dapat mengimplementasikan timer seperti itu - memicu keluaran GPIO baik dalam 1ms karena input mendeteksi suatu sisi, atau dalam kelipatan tetap 10ms sejak itu - lebih disukai dengan penyisihan untuk beberapa bias negatif (katakanlah, transformator dan relai memperkenalkan penundaan 1,6ms; jadi saya ingin pemicu mati 8,4+ (n * 10) ms sejak pulsa input, dengan cara itu bias melawan penundaan yang diperkenalkan oleh rangkaian.) - semua tentu saja "sesuai permintaan pengguna", katakanlah, pengguna menulis "1 "ke file / sys / class / ... dan pada kesempatan terdekat (secara kasar) hasilnya berjalan" pada ". Pengguna menulis "0", dan ketika zero-crossing tiba, relay spesifik dilepaskan.
Saya percaya ini membutuhkan penulisan atau peretasan modul kernel. Bisakah Anda mengarahkan saya ke apa yang menangani pin GPIO Raspberry Pi di kernel, dan timer seperti apa yang bisa saya lampirkan (kecuali ada beberapa yang sudah ada) untuk mendapatkan fungsionalitas seperti ini?
Jawaban:
Anda tidak perlu meretas kernel. Anda hanya perlu memindahkan proses dari antrian scheduler.
Mulai sekarang, proses kami menerima
cat /proc/sys/kernel/sched_rt_runtime_us
milidetik dari setiapcat /proc/sys/kernel/sched_rt_period_us
segmen waktu milidetik, dari eksekusi tanpa gangguan tanpa risiko tidak dapat digunakan selama waktu tersebut (dalam praktiknya, secara default di BerryBoot: keluar 0,95 detik dari setiap detik). Jika Anda membutuhkan lebih banyak, berantakan dengan nilai-nilai ini, tetapi saya tidak perlu lagi untuk tujuan saya di sini.Saya menggunakan fungsi timer dalam milidetik (itu tentang presisi yang saya butuhkan) berdasarkan
clock_gettime()
jam saya penundaan.Memanggil
timer(1)
menyetel ulang, memanggiltimer(0)
waktu mengembalikan sejak reset.Anda perlu menautkan ke
rt
perpustakaan untuk dikompilasi - tambahkan-lrt
ke perintah gcc Anda.Sekarang, untuk loop utama. Saya menggunakan input sakelar untuk "permintaan pengguna" tetapi Anda dapat menggunakan jaringan, penghitung waktu atau apa pun. Yang Anda butuhkan hanyalah mendapatkan nilai boolean
in
.sumber
TRIAC_PIN
untukin
, saya harus mengaturTRIAC_PIN
untuk 1, menunggu jumlah waktu yang ditentukan (dalam proporsi tingkat redup yang diinginkan), lalu aturTRIAC_PIN
kembali ke 0. Apakah ini berfungsi?if(in==out) continue;
keif(out==0) continue;
, kan? Sebenarnya, saya benar-benar baru dalam pemrograman untuk pi, jadi mungkin itu tidak perlu - Saya kira ini semua terjadi secara serempak (yaitu kita tidak perlu khawatir tentang loop utama dipanggil sementara loop bersarang masih mengeksekusi)