Mündəricat:
- Addım 1: İnteqrasiya edilmiş İnkişaf Platforması Atmel Studio 7 -dən istifadə edərək CR -də AVR Mikrokontrolör Tətbiqinin Yazılması və Qurulması
- Addım 2: Proqramın HEX faylını çipin flash yaddaşına köçürmək
- Addım 3: Hardware Switch Debouncing
- Addım 4: Elektrik dövrəsi
Video: AVR mikro nəzarətçisi. Bir düyməni istifadə edərək LED -i dəyişdirin. Push Button Debouncing .: 4 Addım
2024 Müəllif: John Day | [email protected]. Son dəyişdirildi: 2024-01-30 07:46
Bu bölmədə, ATMega328PU üçün üç LED -in vəziyyətini bir düymə açarının girişinə görə dəyişmək üçün C proqramının necə hazırlanacağını öyrənəcəyik. Ayrıca, 'Switch Bounce' probleminin həllini araşdırdıq. Həmişə olduğu kimi, proqram kodunun işini yoxlamaq üçün AVR ATmega328 əsasında elektrik dövrəsini yığacağıq.
Addım 1: İnteqrasiya edilmiş İnkişaf Platforması Atmel Studio 7 -dən istifadə edərək CR -də AVR Mikrokontrolör Tətbiqinin Yazılması və Qurulması
Atmel Studio yoxdursa, yükləməli və quraşdırmalısınız.
www.microchip.com/mplab/avr-support/atmel-studio-7
Bəzi tərtibçilərin müəyyən etdiyi ilk bir neçə sətir.
F_CPU, Hertz-də saat tezliyini təyin edir və avr-libc kitabxanasından istifadə edən proqramlarda çox yayılmışdır. Bu vəziyyətdə, gecikmələrin necə hesablanacağını təyin etmək üçün gecikmə qaydaları istifadə olunur.
#ifndef F_CPU
#define F_CPU 16000000UL // nəzarətçi kristal tezliyini izah edir (16 MHz AVR ATMega328P) #endif
Sancaqlar üzərində məlumat axını nəzarətini təmin etmək üçün #include // header. Sancaqlar, portlar və s.
Birincisi, avr-libc-in bir hissəsidir və üzərində işlədiyiniz hər hansı bir AVR layihəsində istifadə ediləcəkdir. io.h istifadə etdiyiniz CPU -nu təyin edəcək (bu səbəbdən tərtib edərkən hissəni qeyd edirsiniz) və öz növbəsində istifadə etdiyimiz çip üçün uyğun IO tərif başlığını da daxil edəcək. Bütün pinləriniz, portlarınız, xüsusi qeydləriniz və s. Üçün sabitləri təyin edir.
Proqramda gecikmə funksiyasını aktivləşdirmək üçün #include // header
Kitabxana util/delay.h qısa gecikmələr üçün bəzi qaydalar ehtiva edir. İstifadə edəcəyimiz funksiya _delay_ms () dir.
Düymələrimizi və LED -in portlarını və pinlərini elan etmək üçün təriflərdən istifadə edirik. Bu kimi təriflərin istifadə edilməsi, LED-i fərqli bir I/O pininə köçürsək və ya fərqli bir AVR istifadə etsək, tapılması asan olan 3 xətti dəyişdirməyimizə imkan verir.
#define BUTTON1 1 // B pin 1 portuna bağlı düymə açarı
#define LED1 0 // Led1 port B pin 0 -a bağlıdır #define LED2 1 // Led2 port C pin 1 -ə bağlıdır #define LED3 2 // Led3 port D pin 2 -ə bağlıdır
Son ikisi, düyməni basmağa icazə verməzdən əvvəl açarı ləğv etmək üçün gözləmə müddətini milisaniyədə təyin edir. Geri çəkilmə vaxtı, bütün sıçrayışdan sonra rəqəmsal yüksəkdən rəqəmsal aşağıya keçmək üçün keçid tələb olunan vaxta uyğunlaşdırılmalıdır. Sıçrama davranışı keçiddən keçməyə qədər dəyişəcək, ancaq 20-30 milisaniyələr ümumiyyətlə kifayət qədərdir.
#debine DEBOUNCE_TIME 25 // "de-sıçrayan" düyməsini gözləyərkən gözləmə vaxtı
#düyməsini basdıqdan sonra gözləmək üçün LOCK_INPUT_TIME 300 // vaxtını təyin edin
etibarsız init_ports_mcu ()
{
Bu funksiya, proqramımızın əvvəlində istifadə edəcəyimiz giriş çıxış pinlərini işə salmaq üçün bir dəfə çağırılır.
Düymə üçün yazmaq və oxumaq üçün PORT və PIN qeydlərindən istifadə edəcəyik. AVR ilə PINx qeydindən istifadə edərək bir pin oxuyuruq və PORTx qeydindən istifadə edərək bir pin yazırıq. Çəkmələri aktiv etmək üçün düymə qeydinə yazmalıyıq.
LED üçün yazmaq üçün yalnız PORT qeydindən istifadə etməliyik, eyni zamanda I/O pinlərinin giriş olaraq təyin edildiyi üçün məlumat istiqaməti qeydinə (DDR) də ehtiyacımız var.
Birincisi, LED -in I/O sancaqlarını məlumat istiqaməti qeydindən istifadə edərək çıxış olaraq təyin edirik.
DDRB = 0xFFu; // PORTB -in bütün sancaqlarını çıxış olaraq təyin edin.
Sonra, düymə pinini açıq olaraq giriş olaraq təyin edin.
DDRB & = ~ (1 <
Sonra, PORTB pinləri açmaq üçün yüksək (+5 volt) olaraq təyin olunur. Çıxış pinləri əvvəlcə yüksəkdir və LED-lərimiz aktiv yüksəklikdə olduğu üçün açıq şəkildə söndürməyincə açılacaq.
Və nəhayət, düyməmiz üçün istifadə etdiyimiz giriş pinindəki daxili çəkmə müqavimətini işə salırıq. Bu, sadəcə porta bir ədəd çıxarmaqla edilir. Bir giriş olaraq konfiqurasiya edildikdə, bu, çəkmələri aktivləşdirməklə nəticələnir və bir çıxış olaraq konfiqurasiya edildikdə, bunu etmək sadəcə yüksək bir gərginlik verir.
PORTB = 0xFF; // PORTB -in bütün sancaqlarını YÜKSƏK olaraq təyin edin. Led açılır, // həmçinin ilk pin PORTB -in daxili Pull Up müqaviməti aktivdir. DDRC = 0xFFu; // PORTC -nin bütün sancaqlarını çıxış olaraq təyin edin. PORTC = 0x00u; // Bütün PORTC pinlərini söndürən aşağıya endirin. DDRD = 0xFFu; // PORTD -nin bütün sancaqlarını çıxış olaraq təyin edin. PORTD = 0x00u; // Bütün PORTD pinlərini söndürən aşağı salın. }
imzasız char button_state ()
{
Bu funksiya düymənin basılıb basılmadığını göstərən boolean dəyər qaytarır. Bu kod bloku daim infinasiya döngəsində icra olunur və buna görə də düymənin vəziyyətini sorğulayır. Keçiddən imtina etdiyimiz yer də budur.
İndi unutmayın ki, düyməni basdığımız zaman giriş çıxış pimi yerə çəkilir. Beləliklə, sancağın aşağı düşməsini gözləyirik.
/ * BUTTON1 biti aydın olduqda düyməyə basılır */
əgər (! (PINB & (1 <
Bitin aydın olub olmadığını yoxlayaraq bunu edirik. Düymənin basıldığını göstərən bit aydındırsa, əvvəlcə 25 ms olan DEBOUNCE_TIME tərəfindən təyin olunan vaxtı təxirə salırıq və sonra düymənin vəziyyətini yenidən yoxlayırıq. Düymə 25 saniyədən sonra basıldığı təqdirdə, keçid ləğv edilmiş sayılır və bir hadisəni tetiklemeye hazırdır və buna görə də 1 -i zəng rejimimizə qaytarırıq. Düymə sıxılmasa, 0 -a zəng etmə rejiminə qayıdırıq.
_delay_ms (DEBOUNCE_TIME);
əgər (! (PINB & (1 <
int main (boş)
{
Əsas iş rejimimiz. Əsas funksiya unikaldır və digər funksiyalardan fərqlənir. Hər bir C proqramının tam olaraq bir main () funksiyası olmalıdır. Əsas, AVR -in ilk dəfə güc açıldıqda kodunuzu icra etməyə başladığı yerdir, buna görə də proqramın giriş nöqtəsidir.
imzasız char n_led = 1; // əvvəlcə LED nömrəsi indi yanır
İstifadə olunan I/O pinlərini işə salmaq üçün funksiyaya zəng edin:
init_ports_mcu ();
Proqramımızın işlədiyi sonsuz döngə:
vaxt (1)
{
Button_state, düymənin basıldığını və ləğv edildiyini göstərən birini geri qaytardıqda, n_led parametrinə uyğun olaraq LED -lərin cari vəziyyətini dəyişir.
if (button_state ()) // Düymə basıldıqda, LED -in vəziyyətini dəyişin və 300 ms gecikdirin (#define LOCK_INPUT_TIME)
{keçid (n_led) {hal 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); fasilə;
Bu ifadələr C bitwise operatorlarından istifadə edir. Bu dəfə eksklüziv OR operatorundan istifadə edir. Portu keçmək istədiyiniz bitin dəyəri ilə XOR etdiyiniz zaman, bir bit digər bitlərə təsir etmədən dəyişdirilir.
hal 2:
PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); fasilə; hal 3: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // LED nömrə fasiləsini sıfırlayın; } n_led ++; // növbəti LED _delay_ms (LOCK_INPUT_TIME) açılır; }} qayıt (0); }
Beləliklə, indi bu proqramı işə saldığınız zaman, LED-lərin dəyişmə düyməsini basa bilməlisiniz. LOCK_INPUT_TIME tərəfindən təyin olunan gecikməyimizə görə, LED -lərin sabit bir sürətlə sönməsinə səbəb olacaq düyməni basıb saxlayın (hər 275 ms -dən bir az çox).
Proqramlaşdırma tamamlandı.
Növbəti addım, avrdude proqramından istifadə edərək layihəni və hex faylını mikro nəzarətçiyə proqramlaşdırmaqdır.
Main.c faylını c kodu ilə proqramla yükləyə bilərsiniz:
Addım 2: Proqramın HEX faylını çipin flash yaddaşına köçürmək
AVRDUDE yükləyin və quraşdırın. Mövcud olan ən son versiya 6.3: zip faylını yükləyin
Əvvəlcə proqramın hex faylını AVRDUDE qovluğuna kopyalayın. Mənim vəziyyətimdə ButtonAVR.hex
Sonra, DOS istək pəncərəsinə əmr daxil edin: avrdude –c [proqramçının adı] –p m328p –u –U flash: w: [hex faylınızın adı].
Mənim vəziyyətimdə: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex
Bu əmr mikro nəzarətçinin yaddaşına hex fayl yazır.
Mikrodenetleyici flash yaddaşının yanmasının ətraflı təsviri ilə videoya baxın:
Mikro nəzarətçi flash yaddaşı yanır …
Tamam! İndi mikrokontrolör proqramımızın təlimatlarına uyğun işləyir. Gəlin yoxlayaq!
Addım 3: Hardware Switch Debouncing
Proqram təminatı açma ilə yanaşı, hardware açma texnikasından istifadə edə bilərik. Bu texnikanın əsas fikri, keçid siqnalındakı sürətli dəyişiklikləri süzmək üçün bir kondansatördən istifadə etməkdir.
Hansı dəyər kondansatörü seçilməlidir? Bu, nəticədə düymənin bu problemlə bağlı nə qədər zəif işləyəcəyindən asılı olacaq. Bəzi düymələr çox sıçrayan bir davranış göstərə bilər, digərlərində isə çox az olacaq. 1.0 nanofarad kimi aşağı bir kondansatör dəyəri çox tez reaksiya verəcək və sıçrayışa heç bir təsiri yoxdur. Əksinə, 220 nanofarad kimi daha yüksək bir kondansatör dəyəri (hələ də kondansatör baxımından olduqca kiçikdir) başlanğıcdan sona qədər (5 voltdan 0 volta qədər) yavaş bir keçid təmin edəcəkdir. 220 nanofarad tutumu ilə görülə bilən keçid hələ də real mənada olduqca sürətlidir və buna görə də zəif işləyən düymələrdə istifadə edilə bilər.
Addım 4: Elektrik dövrəsi
Şematik sxemə uyğun olaraq komponentləri birləşdirin.
Tövsiyə:
Atollic TrueStudio-STM32L100 istifadə edərək düyməni basaraq LED-i yandırın: 4 addım
STM32L100-dən istifadə edərək düyməni basaraq LED-i Atollic TrueStudio-Açın: STM32-nin bu dərsliyində sizə STM32L100-in GPIO pinini necə oxuyacağınızı izah edəcəyəm, buna görə də burada lövhədə Led parıltısını düzəldəcəyəm. basma düyməsini basaraq
AVR mikro nəzarətçisi. Pulse Genişliyi Modulyasiyası. DC Motor və LED İşıq Gücünün Nəzarətçisi .: 6 Addım
AVR mikro nəzarətçisi. Pulse Genişliyi Modulyasiyası. DC Motor və LED İşıq Gücünün Nəzarətçisi .: Hamıya salam! Pulse Width Modulation (PWM) telekommunikasiya və güc nəzarətində çox yayılmış bir texnikadır. bir mühərrik, bir LED, dinamiklər və s., bir elektrik cihazına verilən enerjini idarə etmək üçün ümumiyyətlə istifadə olunur. Əsasən bir modudur
AVR mikro nəzarətçisi. Zamanlayıcıdan istifadə edərək LEDlər Flaş. Taymerlər kəsir. Taymer CTC rejimi: 6 addım
AVR mikro nəzarətçisi. Zamanlayıcıdan istifadə edərək LEDlər Flaş. Taymerlər kəsir. Timer CTC Mode: Hamıya salam! Taymerlər elektronika sahəsində vacib bir anlayışdır. Hər bir elektron komponent zaman əsasında işləyir. Bu vaxt bazası bütün işlərin sinxronizasiya olunmasına kömək edir. Bütün mikrokontrollerlər əvvəlcədən təyin edilmiş bir saat tezliyində işləyir
Bir LED dimmer istifadə edərək ucuz bir şeh nəzarətçisi hazırlamaq: 3 addım
Bir LED dimmer istifadə edərək ucuz bir şeh nəzarətçisi hazırlamaq: Bir neçə ay əvvəl bir ulduz partiyasında şehin qarşısının alınması üçün istifadə etdiyim 12 voltluq bir saç qurutma maşınını qısa dövrədən keçirtdikdən sonra, əsl şeh nəzarətçisi və şeh üçün qızdırıcı almağın vaxtının gəldiyini düşündüm. Orta bir şeh nəzarətçisinin qiyməti 100 Avrodan çoxdur (və ya ABŞ D
Bir POT və ATTINY85 istifadə edərək LED rənglərini dəyişdirin: 3 addım
Bir POT və ATTINY85 istifadə edərək LED rənglərini dəyişdirin: Bu layihədə ATTINY85 istifadə edərək LED -də rəngləri dəyişdirmək üçün potensiometrdən (POT) istifadə edirik. Bəzi təriflər - Potansiyometr, kiçik bir vida / dönmə mexanizmi olan bir cihazdır ki, çevrildikdə fərqli elektrik müqavimətləri verir. Siz