Membuat tester sel surya dengan mecrisp-stellaris sebagainya

dalam dua artikel terakhir yang muncul, saya telah mengoceh tentang bagaimana itu menakjubkan tetapi aneh, dan kemudian Anda mengatur pada sistem dasar dan berkedip beberapa LED. Dan sementara saya telah mengarahkan Anda pada multitasker, kami belum memanfaatkannya secara nyata. Memulai sistem keempat seperti ini sekitar setengah pertempuran. Bekerja di dalam mikrokontroler berbeda dari kompilasi untuk mikrokontroler, dan mencari tahu alur kerja, bagaimana cara teknik masalah, dan di mana sumber daya menguntungkan tidak selalu jelas. Plus, ada beberapa fitur hebat dari mecrisp-stellaris ke depan bahwa Anda mungkin tidak memperhatikan sampai Anda meretas sistem untuk sementara waktu.

Idealnya, Anda akan mengintip dari membawa seseorang yang melakukan hal mereka, dan Anda akan melihat beberapa cara mereka bekerja. Itulah tujuan dari bagian ini. Jika Anda sudah melintas dalam versi MECRISP-STELLARIS-PLUS-EMBELO, Anda siap untuk mengikuti. Jika tidak, kembali dan lakukan pekerjaan rumah Anda dengan sangat cepat. Kami akan tetap berada di sini setelah selesai. Banyak posting ini akan sangat pasti pada rasa mecrisp-stellaris di sebagainya, tetapi mengingat bahwa itu berjalan pada ton chip lengan di luar sana, ini bukan tempat yang buruk.

Menjadi aklimatisasi

Hal pertama yang Anda perlukan untuk terbiasa dengan sebagainya adalah tumpukan. Anda tahu bahwa kastanye tua tentang orang-orang hanya bisa menjaga lima (tujuh?) Dalam pikiran mereka pada suatu waktu? Sebagainya menempatkan itu untuk tes.

Terakhir kali, saya secara singkat menunjukkan perintah .s (“cetak stack”). Dalam edisi Hackaday, saya telah mendefinisikan kembali mecrisp konvensional. Untuk menjadi sedikit kurang verbose, dan mata saya jauh lebih mudah dibaca. Jika Anda menemukan diri Anda banyak memukul, dan Anda akan, saya juga menulis fungsi yang (sementara) menimpa “OK.” Prompt dengan menambahkan stack printout ke sana, setiap kali Anda menekan enter. Ketik print.tack dan tekan masukkan lebih banyak waktu untuk melihat cara kerjanya. Memukul tombol reset, atau mengetik reset akan menghapus semuanya dalam RAM, dan itu termasuk prompt stack-printing, jadi Anda akan kembali ke batu tulis bersih.

Sekarang mungkin saat yang tepat untuk bermain-main dengan operator tumpukan. Sudahkah Anda membaca glosarium MECRISP? Lihatlah daftar operasi tumpukan juggling di sana. Nyalakan cetak. Tepat dan mainkan sampai semuanya masuk akal.

Sudahkah Anda menjalankan kata-kata? Ini meludahi daftar tertaut dari setiap kata yang diketahui, bersama dengan lokasi memori tempat mereka tinggal, dan beberapa detail tambahan – terlalu banyak detail, kecuali Anda men-debug sistem itu sendiri. Ada kata ekstra, tidak standar, dalam mecrisp yang hanya mencetak nama fungsi: daftar. Berikan pukulan itu sekarang. Jika Anda belum mendefinisikan beberapa kata, lakukanlah.

: hw. “Halo, Dunia!” cr;
Adalah yang baik untuk dimiliki.

Lapisan dalam memori

Memori mecrisp-stellaris dibagi menjadi dua lokasi bruto: RAM dan Flash. Semua kata yang disediakan sebelum tanda “- mecrisp-stellaris -” adalah dalam RAM, dan akan hilang pada reset atau power-down. Fungsi RAM baru akan ditambahkan ke bagian depan daftar.

Setelah “- Mecrisp-Stellaris Core -” Mark datang berfungsi dalam flash. Pada bagian awal Flash, sebelum “- Flash Dictionary -” adalah inti meCrisp Forth konvensional. Dari sana sampai “<>” adalah kata-kata yang diambil dari distribusi mecrisp yang biasanya berguna, termasuk beberapa fungsi debugging dan multitasking. Preseding “<>” adalah kontribusi dari perpustakaan EMBLO, termasuk banyak definisi GPIO, dan yang sebelum “<>” ditambahkan hanya untuk seri posting ini.

Yang tidak jelas adalah bahwa semua penanda ini dengan tanda kurung yang mengelilinginya adalah landasan. Ini memungkinkan Anda menghapus flash hingga lokasi memori. Jadi, jika Anda telah menambahkan beberapa fungsi tambahan ke dalam flash, dan ingin menghapus kembali ke status default Edition Hackaday, Anda dapat mengetik << Hackaday-Extras >>. Fungsi ekstra akan dihapus, dan reset chip. (Perhatikan bahwa ini kehilangan apa pun yang ada di RAM!) Perintah Eraseflash akan mengembalikan Anda ke spidol “- Flash Dictionary -“.

Menimpa sejarah

Jika Anda mendefinisikan kata dua kali dengan nama yang sama, Anda akan memiliki dua versi kata dalam kamus. Ketika sebuah kata disebut atau dikompilasi, penerjemah melihat melalui memori, dari atas RAM turun, dan kemudian dari akhir flash kembali ke awal. Kata-kata dengan nama yang sama dalam RAM dengan demikian dipanggil sebelum yang ada di flash. Apa yang bisa sangat aneh tentang itu, karena itu mengkompilasi secara real-time, kata yang disebut dalam kata panggilan apa pun adalah yang ada di atas pada saat kata panggilan didefinisikan. Membuat sejarah kusut adalah cara yang pasti untuk menjadi gila.

: foo. “foo!” ;
: Bar foo. “Bar!” ;
Bar foo! batang! oke.
: foo. “Bizzle!” ; Mendefinisikan kembali foo. oke.
Foo Bizzle! oke.
Bar foo! batang! oke.

Di sisi lain, inilah cara yang bagus untuk bekerja yang memanfaatkan berbagai fitur memori ini. RAM terhapus pada setiap reset, memberi Anda batu tulis bersih, tetapi dengan menggunakan Cornerstones, Flash juga tidak dapat berubah. Tentu saja, semakin dalam flash yang harus Anda hapus,Lebih banyak kata Anda harus mendefinisikan kembali nanti, dengan asumsi bahwa beberapa dari mereka berguna. Ini menunjukkan teknik berlapis untuk pengembangan, dengan kata-kata paling “inti” terdalam dalam flash. Itu juga alami karena kata-kata perlu didefinisikan untuk dipanggil, jadi mendefinisikan dasar-dasarnya pertama-tama masuk akal.

Anda dapat mengkompilasi kata baru ke RAM (default) dengan menelepon Compiletoram atau flash dengan memohon kompiloflash. Prototipe kata-kata Anda dalam RAM. Merasa gratis untuk menimpa mereka sebanyak yang Anda inginkan, tetapi ingat bahwa Anda harus mendefinisikan kembali kata-kata dependen setelah Anda mengubah sesuatu di hulu untuk menjaga riwayat panggilan tetap utuh. Setelah Anda dibuat dengan potongan pengembangan, ketik reset dan jernih RAM. Sekarang mendefinisikan kembali kata-kata ini menjadi flash. Jika Anda mengembangkan aplikasi Anda dari bawah ke atas, Anda akan menemukan bahwa ini semua menggantung bersama dengan baik. Ketika Anda telah menemukan bug dalam sesuatu yang sudah ditulis untuk flash, landasan datang untuk menyelamatkan.

Akhirnya, sifat berlapis definisi yang berlapis-lapis ini bisa sangat berguna. Misalnya, fungsi init yang didefinisikan dalam flash akan dijalankan pada setiap reset. Ini termasuk hal-hal seperti mengatur kecepatan prosesor dan centang sistem, bahwa Anda mungkin tidak ingin main-main. Karena Anda dapat menimpa init, dan setiap kompilasi menggunakan kata-kata yang tersedia pada saat kompilasi, Anda cukup melapisi fungsionalitas Anda ke init :: init init. “Howdy!” cr;. “Init” pertama adalah nama kata baru, dan yang kedua menelepon init yang sudah ada sebelumnya, dan melakukan semua pengaturan. Sisa definisi adalah milik Anda untuk dimainkan. Pada restart, semuanya akan dilakukan dalam pembelian yang didefinisikan.

Makhluk Comforts.

Saya menulis banyak kode dalam editor (VIM) dan kemudian mengirimkannya ke chip untuk bermain. Sangat spesifik, saya menulis skrip yang disebut Forth_upload.sh yang berisi yang berikut:

[[$ 1]] && Term = $ 1 || Istilah = / dev / ttyusb0
Delay = 0.2.
Sambil membaca -r f; Lakukan echo “$ F”; echo “$ f”> $ istilah; Tidur $ {delay} s; selesai

Untuk mengirim file ke port serial, dan dengan demikian untuk maju, forth_upload.sh u vip: diam w! forth_upload.sh
inoremap u : diam .w! forth_upload.sh
Nnoremap U: Silent W! Forth_upload.sh

Pengaturan ini memungkinkan saya mengembangkan dan mengubah fungsi dalam editor yang saya suka, dan kemudian mengirimkannya hampir dengan cepat ke dalam sistem keempat untuk menguji. Saya tetap membuka jendela terminal yang selalu masuk ke dalam sistem keempat, jadi saya dapat menikmati kata-kata baru didefinisikan dalam, dan kemudian mulai bermain-main dengan mereka secara interaktif. Cukup manis.

Tester sel surya

Sekarang untuk contoh nyata yang cepat yang akan memanfaatkan semua hal di atas. Baru-baru ini saya membuat keputusan untuk mengkarakterisasi sekelompok panel surya kecil yang saya miliki di laci sampah saya. Ini menunjukkan penyesuaian beban pada panel dan mencatat tegangan yang dihasilkan oleh panel dan arus melalui beban. Saya menghubungkan dua multimeter dan menuliskan beberapa angka, tetapi ini tidak diragukan lagi merupakan pekerjaan untuk mikrokontroler.

Seperti yang jelas dari gambar, ini adalah lashup cepat. Bagian yang lebih besar dari copper-cleat memiliki resistor pengukuran saat ini dan sepasang resistor yang dikonfigurasi sebagai pembagi tegangan untuk menurunkan tegangan panel ke sesuatu yang dapat ditangani 3,3 V ADC.

Menggantung yang merupakan rangkaian beban variabel (perak), yang sepenuhnya sub-optimal: MOSFET menghilang panas dengan berubah setengah oleh tegangan PWM yang diangkat oleh 100 UF Capacitor. Baterai dan optoisolator 9 V ditumber untuk memastikan tegangan yang cukup tinggi untuk membuka MOSFET, yang menginginkan lebih dari 3,3 V. Sirkuit beban yang mengerikan ini, tetapi fungsional ini adalah tambahan kemudian – versi pertama baru saja memiliki a Potensiometer di sini, sampai itu dihisap dengan berlari terlalu banyak saat ini.

Pushbuttons digunakan untuk memulai dan menghentikan rekaman dari perangkat di balkon tanpa harus berlari kembali ke dalam. Prosedurnya adalah untuk klip buaya di panel baru, dan tahan tombol putih saat membuat rekaman. Tombol hitam kecil ditekan satu kali untuk membatasi data sel baru. Data kembali ke laptop saya atas serial UART melalui ESP8266 menjalankan ESP-LINK sebagai jembatan serial wifi transparan, terlihat di kiri atas, ideal di sebelah baterai laptop daur ulang. lem panas dan kardus melengkapi bangunan yang canggih.

Ke lembar data!

Jenis alat yang cepat dan praktis ini adalah tempat bersinar. Perpustakaan Jeelabs Forth sudah memiliki beberapa fungsi yang menyederhanakan pengaturan ADC, tetapi mereka sebenarnya tidak bekerja untuk saya, jadi saya melihat ke lembar data.Minimum minimum yang diperlukan untuk mendapatkan ADC bekerja adalah dengan mengaktifkan jam perifer ADC, memungkinkan unit ADC, dan kemudian memilih waktu pengambilan sampel ADC. Kami mungkin juga ingin menjalankan prosedur kalibrasi ADC untuk memastikan bacaan kami benar. Ini semua semacam detail tingkat rendah yang harus Anda buat dengan mikrokontroler apa pun – atau bersandar di perpustakaan yang melakukannya untuk Anda.

Membaca lembar data, untuk menghidupkan jam sistem ADC, kita perlu mengatur bit ADC1EN dalam register memori RCC-APB2ENR. Apa pun. MECRISP-STELLARIS memiliki beberapa kode dukungan yang membaca nilai-nilai ini dari file yang dipasok oleh pabrikan. Saya sudah memasukkannya di inti / register / direktori. File peta memori memiliki mnemonik besar untuk semua register, tetapi saya tidak senang dengan cara nama bit individu ditangani. Itu yak untuk bercukur pada hari lain, saya mencoba menyelesaikan barang.

Inilah serangkaian kata-kata ADC bit-level yang saya hasilkan:

\ Pasang
\ PB0 – AIN8 terhubung ke tegangan panel
\ PB1 – AIN9 terhubung ke resistor indra saat ini

: ADC.RCC-Aktifkan 9 bit RCC-APB2ENR BIS! ; \ set ADC1EN.
: ADC.SET-ADON 0 BIT ADC1-CR2 BIS! ; \ Atur Adon untuk mengaktifkan ADC
: ADC.SET-CAL-BIT 2 BIT ADC1-CR2 BIS! ;

: adc.cal-selesai? 2 bit ADC1-CR2 bit @ 0 =;
: adc.isdone? 1 bit ADC1-SR bit @;

9 bit membuat nomor dengan set bit kesembilan dan semua yang lain nol, dan RCC-APB2ENR BIS! Mengatur bit yang diinginkan dalam Daftar Kontrol ADC yang relevan. Semua dalam semua, cukup buram, tetapi juga satu-untuk-satu dengan instruksi lembar data. Penamaan yang baik dari kata-kata lapisan bawah ini membuat segalanya sedikit lebih baik satu lapisan atas. Misalnya, kata yang bertanggung jawab untuk menjalankan kalibrasi (mengatur satu bit, tunggu sampai yang lain jelas) relatif dapat dibaca :: adc.cal adc.set-cal-bit mulai adc.cal-dilakukan? sampai ;.

Dan di sini kita melihat kontrol aliran pertama kita, dimulai … sampai membangun. Buy itu aneh, bukan? Mulailah memulai loop, fungsi uji ADC-CAL-DIREB? mengeksekusi, meninggalkan nilai yang benar atau salah pada tumpukan, dan kemudian sampai membaca nilai dan loop ini kembali untuk memulai sampai nilainya benar. Ini sama dengan C sementara (! ADC-CAL-DIREB ()) {;} Busy-wait loop. Dan itu adalah pengantar untuk IDIOM lain: menggunakan? untuk apa pun yang mengembalikan boolean.

Tes, perbaiki, dan uji lagi

Jadi mari kita uji kata-kata ini. Menginisialisasi ADC dan membaca itu mudah: Sekarang mari kita ambil untuk menjalankan dan memastikan bahwa nilainya adalah apa yang kita harapkan. Memperbaiki fixture uji cepat ke luarnya adalah salah satu kekuatan utamanya. : Test-ADC Mulai ADC @. CR 10 MS Key? sampai ; Menentukan kata yang membaca ADC, mencetak nilai, dan mengulangi setiap sepuluh milidetik sampai Anda menekan enter. Jika Anda melakukan ini dengan panel surya di bawah lampu neon, misalnya, Anda akan mengambil riak frekuensi listrik saat mereka menekan panel Anda, yang merupakan sesuatu yang mungkin tidak Anda pikirkan. Kemampuan untuk bermain-main dengan kata-kata baru Anda segera setelah Anda mendefinisikannya membuat aliran pengkodean investigasi semacam ini secara alami.

Waktu kisah nyata. Ketika saya menulis kode ini, saya telah menetapkan waktu sampel yang terlalu pendek pada input ADC. Ini menyebabkan nilai dari satu bacaan untuk mempengaruhi selanjutnya karena kapasitor internal ADC tidak memiliki waktu untuk mengisi atau melepaskan sepenuhnya. Saya mendapatkan bacaan yang terlalu tinggi untuk saat ini ketika voltase tinggi, dan bacaan yang terlalu rendah untuk saat ini ketika tegangan rendah. Saya men-debug ini dengan cukup cepat dengan menulis rutinitas yang membaca setiap saluran beberapa kali berturut-turut dan mencetak nilai-nilai, dan saya meninggalkan kata-kata itu untuk anak cucu.

(Ambil 8 sampel masing-masing, untuk debugging)
: baca-keduanya 8 0 lakukan baca-v. Loop 8 0 lakukan baca-i. lingkaran ;
: readloop mulai baca – kedua Key 100 ms? sampai ;

Umpan balik dari latihan pengujian ini membuat saya mengalihkan waktu sampel pada ADC ke nilai maksimum mereka, karena tidak ada di sini adalah waktu yang vital dan saya menggunakan sumber impedansi yang cukup tinggi. (Standarnya adalah untuk sampel secepat P

Leave a Reply

Your email address will not be published. Required fields are marked *