Encoder sgp 1 0196 გაყვანილობის დიაგრამა. ენკოდერის დაკავშირება PIC მიკროკონტროლერთან

საბოლოოდ მივიღე ეს მშვენიერი ირონია და ახლა მინდა გითხრათ, როგორ ვიმუშაოთ მასთან. ჩემი ენკოდერი (EC12E24204A9) დაახლოებით ასეთია:

ენკოდერს აქვს სამი პინი: Common, A და B. Common ჩვეულებრივ ყოველთვის დაკავშირებულია მიწასთან, ხოლო დანარჩენი ორი მიკროკონტროლერის ნებისმიერ პინთან. ქინძისთავები A და B უნდა აიწიოს პოზიტიურ ელექტრომომარაგებამდე 10 kOhm-ის რიგის რეზისტორების მეშვეობით, რათა გამოირიცხოს ცრუ სიგნალიზაცია პიკაპებიდან. მე არ გირჩევთ გამოიყენოთ შიდა მიკროკონტროლერის გამკაცრება. ის ძალიან სუსტია. იმის დემონსტრირებისთვის, თუ როგორ მუშაობს, მოდით დავკიდოთ კიდევ 8 LED. (შენიშვნა: თუ იყენებთ mega16, mega32 და უფრო ძველებს, მაშინ უნდა გამორთოთ jtag, წინააღმდეგ შემთხვევაში LED-ების ნახევარი არ ანათებს)
ასე რომ, ჩვენ მივიღეთ შემდეგი სქემა:


გადაატრიალეთ კოდირების ღილაკი მარჯვნივ - შუქი ეშვება მარჯვნივ. ირონია მარცხნივ - შუქი ეშვება მარცხნივ. როგორ მუშაობს ენკოდერი? ჩვენ გავარკვევთ. არაფერია რთული. მოდით შევხედოთ ქვემოთ მოცემულ გრაფიკებს.
როდესაც ენკოდერი ბრუნავს ერთი მიმართულებით, სიგნალი ასე გამოიყურება:

სხვას:

ჩნდება კითხვა, როგორ განასხვავებს მიკროკონტროლერს ენკოდერის ბრუნვის მიმართულება?

არსებობს ორი პოპულარული ენკოდერის გამოკითხვის ალგორითმი:

  • კენჭისყრის შეწყვეტა
  • გამოკითხვა, რომელიც ადარებს ენკოდერის წინა მდგომარეობას და ამჟამინდელ მდგომარეობას

კვლევის თითოეულ მეთოდს აქვს თავისი დადებითი და უარყოფითი მხარეები. ორივე ვცადე და მეორე მეთოდზე გადავწყვიტე. შეფერხებებით კენჭისყრის კარგი ის არის, რომ თქვენ შეგიძლიათ მყისიერი პასუხის გაცემა ენკოდერის ღილაკის როტაციაზე. მაგრამ ასევე არის სერიოზული ნაკლი. როგორიცაა კონტაქტის ახსნა. მის ჩასახშობად, რა თქმა უნდა, შეგიძლიათ გამოიყენოთ სხვადასხვა პროგრამული და აპარატურის ინსტრუმენტები, მაგრამ მე არ შევწუხდი. მოდით უფრო ახლოს მივხედოთ მეორე გამოკითხვის ალგორითმს. მუშაობის დროს მიკროკონტროლერი განუწყვეტლივ კითხულობს მონაცემებს იმ ქინძისთავებიდან, რომლებზეც დაკიდებულია ენკოდერი და ადარებს წაკითხულს წინა წაკითხვის შედეგს. მდგომარეობების შედარების შედეგიდან გამომდინარე, პროგრამა გამოაქვს დასკვნები ბრუნვის მიმართულების შესახებ. პროგრამაში არის კომენტარები, ვფიქრობ საკმარისი იქნება ალგორითმის გასაგებად. თუ თქვენ გაქვთ რაიმე შეკითხვები, შეგიძლიათ დასვათ, როგორც ყოველთვის, კომენტარებში.

დამატებითი შიფრატორიროგორც ჩანს პოტენციომეტრი, მაგრამ პოტენციომეტრისგან განსხვავებით, მას არ აქვს ბოლო პოზიციები, მას შეუძლია ბრუნოს ორივე მიმართულებით შეუზღუდავი რაოდენობის ბრუნებისთვის. აქვე უნდა აღინიშნოს, რომ დამატებითი ენკოდერი არ ბრუნავს ისე შეუფერხებლად, როგორც პოტენციომეტრი, არამედ ნაბიჯებით. მანქანის რადიოში ჩანს, ოსცილოსკოპი, მუსიკალური ცენტრი, სარეცხი მანქანა და სხვა აღჭურვილობა, სადაც პარამეტრის რეგულირება ხორციელდება ფართო საზღვრებში. რა თქმა უნდა, პარამეტრების შეცვლა შესაძლებელია ღილაკების გამოყენებითაც, მაგალითად, იმისთვის, რომ მუსიკა 20 მნიშვნელობით გაძლიერდეს, ღილაკის მართვისას უნდა დააჭიროთ მას 20-ჯერ, ხოლო ენკოდერის მართვისას ჩართოთ გარკვეული კუთხე, დამუშავების ალგორითმის მიხედვით.

დამატებითი შიფრატორიწარმოადგენს ორ კონტაქტს, რომლის დახურვის წესი დამოკიდებულია ბრუნვის მიმართულებაზე.


Სინამდვილეში დამატებითი ენკოდერი გარდაქმნის ლილვის ბრუნვას ელექტრულ იმპულსებადრომელიც შეიცავს ინფორმაციას ბრუნვის მიმართულების შესახებ.

ავაშენოთ სატესტო წრე, რომელიც ნაჩვენებია ზემოთ სურათზე და დავუკავშიროთ ქინძისთავები A და B ოსცილოსკოპი, ასაწევი რეზისტორები - 4.7K.
მოდი, ენკოდერი საათის ისრის მიმართულებით მოვატრიალოთ.


ახლა საათის ისრის საწინააღმდეგოდ.


ოსცილოგრამები აჩვენებს, რომ ბრუნვის მიმართულებიდან გამომდინარე, იცვლება კონტაქტის დახურვის რიგი. მაგრამ წინა ყოველთვის ასე ლამაზი არ გამოდის.


ვინაიდან კონტაქტები მექანიკურია, ისინი მიდრეკილნი არიან გადახრისკენ, ანუ მასალების ელასტიურობის გამო დახურვისას წარმოიქმნება მრავალი უკონტროლო მოკლე ჩართვა და ღიობები, რაც ჩანს ზემოთ მოცემულ ოსცილოგრამაზე.

გადახტომასთან გამკლავების ორი გზა არსებობს, პირველიმოიცავს კონდენსატორების და რეზისტორების დამატებას, როგორც ეს ნაჩვენებია ქვემოთ მოცემულ სურათზე.


მას შემდეგ, რაც bounce არის მოკლევადიანი ფენომენი, ის ადვილად ქრება კონდენსატორის მიერ.


ოსცილოგრამა გვიჩვენებს, რომ კონდენსატორების დაყენების შემდეგ, წინა მხარეები ნაკლებად ციცაბო გახდა და გაქრობა.

მეორე გზა- პროგრამული უზრუნველყოფა და ეს ყველაფერი დამოკიდებულია ენკოდერის შედეგების გამოკითხვის განხორციელებაზე. თუ შიფრატორის სტატუსის მონიტორინგი გარე შეფერხებით, შემდეგ შეფერხების გააქტიურების შემდეგ აუცილებელია 20-30 მილიწამიანი შეფერხება, რომლის დროსაც MC არ უპასუხებს გამომავალი მდგომარეობის ცვლილებას, ანუ ის არ იგრძნობს გადახტომას. თუ ენკოდერის ქინძისთავების გამოკითხვა ხორციელდება ტაიმერზე, მაშინ გამოკითხვებს შორის ინტერვალი უნდა იყოს უფრო დიდი, ვიდრე გადახტომის ხანგრძლივობა, იგივე 20-30 მილიწამი.

განვიხილოთ კოდირებიდან მიღებული მონაცემების დამუშავების მეთოდები.
პირველი მეთოდი არის ის, რომ ჩვენ ვაკავშირებთ ენკოდერის ერთ-ერთ ფეხს გარე შეფერხებების გამომავალს და ვაყენებთ მას შეფერხებისთვის ჩამოვარდნილ კიდეზე. შეფერხებისას ვამოწმებთ მეორე ფეხის მდგომარეობას და თუ ის ნულის ტოლია, მაშინ ბრუნვა ხდება ერთი მიმართულებით, წინააღმდეგ შემთხვევაში მეორეში. ქვემოთ მოცემულია კოდი, რომელიც ახორციელებს ამ მეთოდს AVR-სთვის.
#შეიცავს ISR (INT2_vect) (თუ (PINB & 0X02) (PORTB | = (1<<0); } else { PORTB &= ~(1<<0); } //антидребезг _delay_ms(20); //сбрасываем флаг прерывания вызванный дребезгом GIFR = (1<როდესაც ენკოდერი ერთ მხარეს არის გადაბრუნებული, LED ანათებს, როდესაც ენკოდერი მეორე მხარეს გადადის, ის ქრება.

მეორე მეთოდი არის არსებული და წინა მდგომარეობის შედარება... მოდით გამოვხატოთ პულსის მატარებლის ლოგიკური დონეები ნულებით და ერთებით.


შემდეგ ჩვენ ვიღებთ შიფრირების მდგომარეობების სასრულ რაოდენობას. პირველი ციფრი არის კოდირების პირველი გამომავალი ლოგიკური დონე, მეორე არის მეორე გამომავალი ლოგიკური დონე.

დავუშვათ, რომ ბოლო მდგომარეობა, რომელშიც იყო კოდირებული, უდრის სამს, თუ შემდეგი მდგომარეობა უდრის ერთს, მაშინ ის ბრუნავს ერთი მიმართულებით, თუ ორი, მაშინ მეორეში. გამოდის, რომ თქვენ შეგიძლიათ დააფიქსიროთ გადასვლა ერთი მდგომარეობიდან მეორეზე და განსაზღვროთ ბრუნვის მიმართულება, მაგრამ უმარტივესი განხორციელება არის 11-დან 01-მდე და 10-მდე გადასვლა. ქვემოთ მოცემულია კოდი, რომელიც ახორციელებს აღწერილ ალგორითმს AVR-სთვის.
#define F_CPU 8000000UL #include #შეიცავს uint8_t ბოლო_მდგომარეობა = 0; ISR (TIMER0_COMP_vect) (// ენკოდერის ორივე პინი დაკავშირებულია B პორტის 2 და 3 პინებთან // წაიკითხეთ მათი მდგომარეობა uint8_t current_state = (PINB & 0x06) >> 1; // გავითვალისწინოთ გადასვლა მხოლოდ იმ შემთხვევაში, თუ წინა მდგომარეობაა 11 // და თუ ის არ არის ახალის ტოლი, თუ ((ბოლო მდგომარეობა == 3) && (ბოლო მდგომარეობა! = მიმდინარე_მდგომარეობა)) (// თუ ახალი მდგომარეობა არის 01 - ჩართეთ LED, თუ (მიმდინარე_მდგომარეობა == 1) (PORTB | = 0x01;) // თუ ახალი მდგომარეობა არის 10 - გამორთეთ LED, თუ (მიმდინარე_მდგომარეობა == 2) (PORTB & = ~ 0x01;)) // შეფერხებიდან გასვლისას, მიმდინარე მდგომარეობა ხდება წინა ბოლო მდგომარეობა = current_state;) int main (void) (// ორი შეყვანა DDRB ენკოდერის დასაკავშირებლად & = ~ 0x06; // ამოიღეთ შეყვანები კვების წყაროში PORTB | = 0x06; // გამომავალი DDRB LED-ის დასაკავშირებლად | = 0x01 ; // დააყენეთ ტაიმერი გადატვირთვის დამთხვევით TCCR0 = (1<Სულ ეს არის.
შეიძინა ენკოდერი

KY-040 შიფრატორის მოდული არის მექანიკური ბრუნვის კუთხის სენსორი, ის გარდაქმნის მბრუნავი ობიექტის (მაგალითად, ლილვის) ბრუნვის კუთხეს ელექტრულ სიგნალებად, რომლებიც გადაადგილდებიან 90 გრადუსით ერთმანეთთან შედარებით. ამ მოდულს აქვს სამი პინი - CLK, DT და SW. ერთმანეთთან შედარებით 90 გრადუსით გადაადგილებული სიგნალები ზუსტად ჩნდება CLK და DT ქინძისთავებზე, როდესაც ბრუნავს საათის ისრის მიმართულებით / ისრის საწინააღმდეგოდ, SW პინი გამოიყენება კოდირების ცენტრალური ღერძის მდგომარეობის მისაღებად, რომელიც მუშაობს ღილაკის სახით.

ასე რომ, ჩართვაში არსებული შიფრატორის მოწყობილობის დეტალებში ჩასვლის გარეშე (ეს იქნება ცალკე სტატია), მოდით დავაკავშიროთ იგი Arduino Uno დაფაზე. ენკოდერის მოდულის გაყვანილობის დიაგრამა მრავალნიშნა შვიდი სეგმენტის ინდიკატორთან ერთად:

ჩვენთვის საკმარისი იქნება მხოლოდ იმ სიგნალების მდგომარეობის გაანალიზება, რომელსაც CLK და DT ქინძისთავები იძლევა, ამისათვის არის პატარა მიკროსქემის დიაგრამა, რომელიც აჩვენებს, თუ როგორ მოძრაობენ სიგნალები ამა თუ იმ მიმართულებით ბრუნვისას.

სქემიდან ჩანს, რომ ყოველთვის, როცა სიგნალი A (კოდერის CLK პინი) მიდის მაღალიდან დაბალზე, იკითხება B სიგნალის მდგომარეობა (კოდერის DT პინი). თუ სიგნალი B იძლევა სიგნალის მაღალ დონეს, ეს ნიშნავს, რომ ენკოდერის ბრუნვა ხდება საათის ისრის მიმართულებით. თუ სიგნალი B იძლევა სიგნალის დაბალ დონეს, როდესაც სიგნალი A მიდის დაბალიდან მაღალზე, მაშინ ეს ნიშნავს, რომ ენკოდერი ბრუნავს საათის ისრის საწინააღმდეგოდ. პროგრამაში ამ ორივე სიგნალის წაკითხვით შეგიძლიათ განსაზღვროთ ბრუნვის მიმართულება, ასევე B სიგნალის იმპულსების დათვლისას შეგიძლიათ გაზარდოთ ან შეამციროთ პროგრამული პულსის მრიცხველი.

A და B სიგნალების წასაკითხად, ასევე სიგნალების ენკოდერის ცენტრალური ღერძიდან (გახსოვდეთ - ის მუშაობს როგორც ღილაკი), შეგიძლიათ გამოიყენოთ ქვემოთ აღწერილი სტრუქტურა. ეს დიზაინი შეიძლება ჩაშენდეს ესკიზში, დაემატოს მას სხვადასხვა ფუნქციონირება, ყველაფერი შემოიფარგლება მხოლოდ დეველოპერის სურვილითა და ფანტაზიით. კონსტრუქციის სხეული საკმარისად კომენტირებულია; მომავალში, ესკიზის ტექსტის სიმარტივისთვის, კომენტარები შეიძლება წაიშალოს. ასე რომ, სტრუქტურა წაკითხვისა და ენკოდერის სიგნალების სასარგებლო მონაცემებად გადაქცევისთვის:

// დროებითი ცვლადები სიგნალის დონის შესანახად // მიღებული ენკოდერიდან unsigned char encoder_A, encoder_B, encoder_A_prev; // ცვლადი ღილაკზე დაწკაპუნების თვალყურის დევნებისთვის - // ენკოდერის ცენტრალური ღერძი static bool SW_State = false; void setup () (// Presets // Variable declarations // Initialize ports, etc.) void loop () (// CLK to pin 3 Arduino // DT to pin 4 Arduino // წაიკითხეთ მნიშვნელობები ენკოდერის გამოსასვლელები // და შეინახეთ ისინი ცვლადებში encoder_A = digitalRead (3); encoder_B = digitalRead (4); // თუ სიგნალის დონე A დაბალია, // და წინა ციკლში მაღალი იყო, თუ (! Encoder_A && encoder_A_prev) ( // თუ სიგნალის დონე B მაღალია, თუ (encoder_B) (// ეს ნიშნავს, რომ როტაცია არის საათის ისრის მიმართულებით // აქ შეგიძლიათ ჩასვათ ინკრეტული ოპერაცია // აქ შეგიძლიათ ჩადოთ თქვენი // მონაცემთა დამუშავების ოპერაციები საჭირო მიმართულება) // თუ სიგნალის დონე დაბალია სხვაზე (// ეს ნიშნავს, რომ ბრუნვა არის საათის ისრის საწინააღმდეგოდ // აქ შეგიძლიათ ჩასვათ შემცირების ოპერაცია // აქ შეგიძლიათ ჩადოთ ნებისმიერი თქვენი // მონაცემთა დამუშავების ოპერაცია საჭირო მიმართულებით )) // გამოსაყენებლად აუცილებლად უნდა შეინახოთ მიმდინარე სიგნალის დონე A // მდგომარეობა ამ მნიშვნელობის გამოყენება პროგრამის მომდევნო სკანირების ციკლში encoder_A_prev = encoder_A; // ჩვენ ვმუშაობთ ენკოდერის ცენტრალურ ღერძთან - ღილაკით // კოდის ეს ნაწილი ქმნის ერთგვარ გადართვის ტრიგერს // წაიკითხეთ პინი 2-ის მნიშვნელობა Arduino დაფაზე // რომელზედაც დაკავშირებულია ენკოდერის SW პინი // თუ ცენტრალურ ღერძზე დაჭერილია, მაშინ SW სიგნალი იქნება დაბალი დონე, თუ (! digitalRead (2)) (// თუ SW_State ცვლადი დაყენებულია false-ზე, მაშინ დააყენეთ იგი true-ზე, თუ (! SW_State) (// და დაიმახსოვრეთ მდგომარეობა SW_State = true;) // და პირიქით - თუ SW_State ცვლადი დაყენებულია true-ზე, // შემდეგ გადააყენეთ იგი false-ზე სხვა (// და გახსოვდეთ მდგომარეობა SW_State = false;)))

კოდირების სიგნალების დამუშავებისა და ეკრანზე მრიცხველის მნიშვნელობის ჩვენების ესკიზი ნაჩვენებია ქვემოთ. ამ ჩანახატს აქვს ჩაშენებული სტრუქტურა ენკოდერის სიგნალების წაკითხვისა და კონვერტაციისთვის, რაც ზემოთ იყო აღწერილი.

#include "LedControl.h" / * * ჩვენ ვუკავშირდებით LedControl.h ბიბლიოთეკას * და ვქმნით LedControl კლასის * ობიექტს, ხოლო 7-სეგმენტიანი დისპლეი MAX72xx დრაივერით * უნდა იყოს დაკავშირებული Arduino დაფაზე შემდეგნაირად: * Arduino -> ჩვენების მოდული MAX72xx * Arduino -> ჩვენების მოდული MAX72xx * Arduino -> დისპლეის მოდული MAX72xx * Arduino -> ჩვენების მოდული MAX72xx * Arduino -> ჩვენების მოდული MAX72xx * Arduino -> Encoder Module * Arduino -> Encoder Module * Arduino -> Enderco Ender მოდული * / LedControl lc = LedControl (12, 11, 10, 1); // დაასახელეთ პორტის მისამართები Arduino დაფაზე const int Dir = 4; const int ნაბიჯი = 3; const int შეცვლა = 2; // Counter არის ცვლადი მრიცხველის შესანახად static long Counter = 0; // SW_State - დროშის ტრიგერი ცენტრალური ღერძის დაჭერის თვალყურის დევნებისთვის static bool SW_State = false; // ენკოდერის სიგნალების დონეების შესანახი დროებითი ცვლადები unsigned char encoder_A, encoder_B, encoder_A_prev; void setup () (// მოწყობილობა (7 სეგმენტიანი დისპლეი) ამოღებულია ძილის რეჟიმიდან lc.გამორთვა (0, false); // ეკრანის სიკაშკაშე დააყენეთ 8-ზე // სიკაშკაშის საერთო შესაძლო რეჟიმები 0-დან 15 lc-მდე. setIntensity (0 , 8); // დისპლეის გასუფთავება lc.clearDisplay (0); // პორტების კონფიგურაცია ენკოდერისთვის pinMode (Dir, INPUT); pinMode (Step, INPUT); pinMode (Switch, INPUT);) void loop () (// წაიკითხეთ ენკოდერის გამომავალი მნიშვნელობები // და შეინახეთ ისინი ცვლადებში encoder_A = digitalRead (ნაბიჯი); encoder_B = digitalRead (Dir); // თუ სიგნალის დონე A დაბალია, // და წინა ციკლი მაღალი იყო, თუ (! Encoder_A && encoder_A_prev) ( // თუ სიგნალის დონე B მაღალია, თუ (encoder_B) (// ეს ნიშნავს, რომ ბრუნვა არის საათის ისრის მიმართულებით // ჩვენი მდგომარეობა: // თუ მრიცხველის მნიშვნელობა მეტია ან მაქსიმალური რიცხვის ტოლი, თუ (მთვლელი> = 99999999) (// მრიცხველის მნიშვნელობის გადატვირთვა Counter = 0;) სხვა (// წინააღმდეგ შემთხვევაში, ყოველი დაწკაპუნებისას გაზარდეთ ერთი მრიცხველი ++;)) // თუ სიგნალის დონე B არის დაბალი სხვა (// Zn კითხულობს ბრუნვას საათის ისრის საწინააღმდეგოდ // თუ მრიცხველი არის ნულის ტოლი ან ნაკლები, თუ (მრიცხველი<= 0) { //проинициализировать значение максимальным числом Counter = 99999999; } else { //Иначе декрементировать при каждом щелчке на единицу Counter --; } } } //Обязательно нужно сохранить состояние текущего уровня сигнала А //для использования этого значения в следующем цикле сканирования программы encoder_A_prev = encoder_A; //Работаем с центральной осью энкодера - кнопкой //Этот кусок кода образует собой как бы перекидной триггер //Считываем значение пина 2 на плате Arduino //которомый проименован как Switch //Если центральная ось нажата - то сигнал Switch будет иметь низкий уровень if(!digitalRead(Switch)) { //Если переменная SW_State установлена в false то установить её в true if(!SW_State) { //И запомнить состояние SW_State = true; } //И наоборот - если переменная SW_State установлена в true, //то сбросить её в false else { //И запомнить состояние SW_State = false; } } //Часть программы которая заполняет разряды //семисегментного дисплея значением счетчика long intCounter = Counter; int divCounter; for(int i = 0; i < 8; i ++) { divCounter = intCounter % 10; intCounter = intCounter / 10; if(intCounter == 0 && SW_State) { if(divCounter == 0) { if(i == 0) { lc.setChar(0, 0, "0", false); } else { lc.setChar(0, i, " ", false); } } else { lc.setDigit(0, i, divCounter, false); } } else { lc.setDigit(0, i, divCounter, false); } } }

ვიდეო როგორ მუშაობს:


ვიმედოვნებთ, რომ მოგეწონათ ამ სტატიის მასალა, დატოვეთ თქვენი შეკითხვები, სურვილები და კრიტიკა ქვემოთ მოცემულ კომენტარებში.

  • სამრეწველო ოპტიკური კოდირების გამოყენება Arduino-ში
გთხოვთ, ჩართოთ javascript, რომ კომენტარები იმუშაოს.

დემო პროექტის განსახორციელებლად ჩვენ გვჭირდება:

  • 24 პოზიციის შიფრატორი;
  • 16 LED (3 მმ);
  • LED დრაივერი A6276;
  • მიკროკონტროლერი PIC18F2550.

ენკოდერი არის ციფრული მოწყობილობების მართვის თანამედროვე და ორიგინალური ელემენტი და გარეგნულად მსგავსია ცვლადი რეზისტორის (იხ. სურათი ქვემოთ). ამ კონტროლის კიდევ ერთი სახელია კუთხის სენსორი, ბრუნვის სენსორი. ლილვის ბრუნვას თან ახლავს დაწკაპუნება, მაგალითად 24 დაწკაპუნება რევოლუციაზე. ენკოდერს აქვს 3 გამომავალი - A, B, C და გამოიყენება ციფრულ მოწყობილობებში მონაცემთა სწრაფი შეყვანისთვის. ზოგიერთ მოდელს აქვს ჩაშენებული ღილაკი, რომელიც მოქმედებს ენკოდერის ლილვის დაჭერით (დამატებულია კიდევ ერთი გამომავალი).

შიფრატორის მუშაობის პრინციპი

ერთი დაწკაპუნებით მობრუნებისას, მაგალითად, მარჯვნივ, კონტაქტი A + C დახურულია ჯერ, შემდეგ B + C. როდესაც ლილვი ბრუნავს ამ დაწკაპუნებით, კონტაქტები იხსნება იმავე თანმიმდევრობით. ლილვის სხვა მიმართულებით მობრუნებისას იცვლება C კონტაქტით დახურვის თანმიმდევრობა, ე.ი. მარცხნივ მობრუნებისას ჯერ B + C იკეტება, შემდეგ A + C.

მიკროკონტროლერების პროექტებში ენკოდერის გამოყენება, შესაძლოა ერთი და იგივე ენკოდერის გამოყენებით, განახორციელოს რამდენიმე სხვადასხვა ტიპის მონაცემთა შეყვანა, თუმცა ამას გარკვეული გამოხმაურება და ვიზუალიზაცია სჭირდება, რათა მომხმარებელმა იცოდეს, რა ინფორმაციას შეაქვს და რომელ პოზიციაზეა კოდირებული.

სქემატური დიაგრამა

ენკოდერის პინები A და B დაკავშირებულია მიკროკონტროლერის RB4 და RB5 პორტებთან, ენკოდერის პინი C დაკავშირებულია მიწასთან. აღსანიშნავია, რომ ასაწევი რეზისტორები უნდა იყოს დაკავშირებული A და B ქინძისთავების სიგნალის ხაზებთან. ენკოდერი შემთხვევით არ არის დაკავშირებული მიკროკონტროლერის მითითებულ I/O ხაზებთან: ჯერ ერთი, B პორტს აქვს ჩაშენებული ასაწევი რეზისტორები და არ გვიწევს გარე შეერთება, მეორეც, მიკროკონტროლერის B პორტს აქვს ძალიან სასარგებლო ფუნქცია - "interrupt-on-change" - შეფერხების დონის ცვლილება, რომელიც საშუალებას მოგვცემს დავაკვირდეთ ენკოდერის სტატუსს.

16 ჩვეულებრივი 3 მმ LED-ები გამოიყენება შეყვანის მონაცემების ვიზუალიზაციისთვის და განთავსდება PCB-ზე დაყენებული ენკოდერის გარშემო. LED-ები დაკავშირებულია A6276 ჩიპთან.

A6276 არის 16-ბიტიანი სერიული LED დრაივერი. დრაივერი შეიცავს 16-ბიტიან CMOS ცვლის რეგისტრს, ასოცირებულ ჩამკეტებს და დრაივერებს LED-ების მართვისთვის და შეუძლია მართოს მეტი LED-ები, ვიდრე მიკროკონტროლერი იძლევა საშუალებას. გარდა ამისა, დრაივერის კონტროლი შესაძლებელია SPI ინტერფეისის საშუალებით, რაც კიდევ უფრო ამცირებს გამოყენებული I/O ხაზების რაოდენობას და ხდის პროექტს მასშტაბურს.

მიკროკონტროლერის პროგრამა ჩვენი პრობლემის გადასაჭრელად შედარებით მარტივია. არსებობს მუშაობის 3 რეჟიმი (ინფორმაციის შეყვანა) და გამოხმაურება:

  • 360 ° პოზიციონირების რეჟიმი - ამ რეჟიმში, LED-ები მიუთითებენ ენკოდერის მიმდინარე „პოზიციაზე“, მომხმარებელს შეუძლია ნებისმიერი კუთხით მოაბრუნოს ენკოდერის ლილვი მარცხნივ და მარჯვნივ;
  • რეჟიმი "მოცულობა / დონე" - ამ რეჟიმში LED-ები მიუთითებენ მიმდინარე მნიშვნელობას შეყვანის დიაპაზონის მინიმალურ და მაქსიმალურ დონეებს შორის (როგორც ხმის დონე აუდიო მოწყობილობებში);
  • 3-პოზიციური მბრუნავი გადართვის რეჟიმი - ამ რეჟიმში არის მხოლოდ სამი ასარჩევი პოზიცია, რომელსაც მომხმარებელი ირჩევს ენკოდერის ლილვის მარცხნივ/მარჯვნივ შებრუნებით.

პროექტის დემონსტრირება

ჩამოტვირთვები

განლაგებულია ZIP-არქივი პროექტით MPLAB გარემოში და წყარო კოდი Hitech C-ში, ასევე ბეჭდური მიკროსქემის დაფის სქემატური დიაგრამა და ტოპოლოგია.

ამ დემო პროექტში ჩვენ განვიხილავთ მართვის დაწყვილებას, რომელსაც ეწოდება ენკოდერი PIC მიკროკონტროლერთან.

დემო პროექტის განსახორციელებლად ჩვენ გვჭირდება:

  • 24 პოზიციის შიფრატორი;
  • 16 LED (3 მმ);
  • LED დრაივერი;
  • მიკროკონტროლერი.

ენკოდერი არის ციფრული მოწყობილობების მართვის თანამედროვე და ორიგინალური ელემენტი და გარეგნულად მსგავსია ცვლადი რეზისტორის (იხ. სურათი ქვემოთ). ამ კონტროლის კიდევ ერთი სახელია კუთხის სენსორი, ბრუნვის სენსორი. ლილვის როტაციას თან ახლავს დაწკაპუნება, მაგალითად 24 დაწკაპუნება რევოლუციაზე. ენკოდერს აქვს 3 გამომავალი - A, B, C და გამოიყენება ციფრულ მოწყობილობებში მონაცემთა სწრაფი შეყვანისთვის. ზოგიერთ მოდელს აქვს ჩაშენებული ღილაკი, რომელიც მოქმედებს ენკოდერის ლილვის დაჭერით (დამატებულია კიდევ ერთი გამომავალი).

შიფრატორის მუშაობის პრინციპი

ერთი დაწკაპუნებით მობრუნებისას, მაგალითად, მარჯვნივ, კონტაქტი A + C დახურულია ჯერ, შემდეგ B + C. როდესაც ლილვი ბრუნავს ამ დაწკაპუნებით, კონტაქტები იხსნება იმავე თანმიმდევრობით. ლილვის სხვა მიმართულებით მობრუნებისას იცვლება C კონტაქტით დახურვის თანმიმდევრობა, ე.ი. მარცხნივ მობრუნებისას ჯერ B + C იკეტება, შემდეგ A + C.

მიკროკონტროლერების პროექტებში ენკოდერის გამოყენება, შესაძლოა ერთი და იგივე ენკოდერის გამოყენებით, განახორციელოს რამდენიმე სხვადასხვა ტიპის მონაცემთა შეყვანა, თუმცა ამას გარკვეული გამოხმაურება და ვიზუალიზაცია სჭირდება, რათა მომხმარებელმა იცოდეს, რა ინფორმაციას შეაქვს და რომელ პოზიციაზეა კოდირებული.


სქემატური დიაგრამა: ენკოდერის დაკავშირება PIC მიკროკონტროლერთან (დააწკაპუნეთ გასადიდებლად)

ენკოდერის პინები A და B დაკავშირებულია მიკროკონტროლერის RB4 და RB5 პორტებთან, ენკოდერის პინი C დაკავშირებულია მიწასთან. აღსანიშნავია, რომ ასაწევი რეზისტორები უნდა იყოს დაკავშირებული A და B ქინძისთავების სიგნალის ხაზებთან. ენკოდერი შემთხვევით არ არის დაკავშირებული მიკროკონტროლერის მითითებულ I/O ხაზებთან: ჯერ ერთი, B პორტს აქვს ჩაშენებული ასაწევი რეზისტორები და არ გვიწევს გარე შეერთება, მეორეც, მიკროკონტროლერის B პორტს აქვს ძალიან სასარგებლო ფუნქცია - "interrupt-on-change" - შეფერხების დონის ცვლილება, რომელიც საშუალებას მოგვცემს დავაკვირდეთ ენკოდერის სტატუსს.

16 ჩვეულებრივი 3 მმ LED-ები გამოიყენება შეყვანის მონაცემების ვიზუალიზაციისთვის და განთავსდება PCB-ზე დაყენებული ენკოდერის გარშემო. LED-ები დაკავშირებულია A6276 ჩიპთან.

მიკროსქემა არის LED დრაივერი 16-ბიტიანი სერიული ინფორმაციის შეყვანით. დრაივერი შეიცავს 16-ბიტიან CMOS ცვლის რეგისტრს, ასოცირებულ ჩამკეტებს და დრაივერებს LED-ების მართვისთვის და შეუძლია მართოს მეტი LED-ები, ვიდრე მიკროკონტროლერი იძლევა საშუალებას. გარდა ამისა, დრაივერის კონტროლი შესაძლებელია SPI ინტერფეისის საშუალებით, რაც კიდევ უფრო ამცირებს გამოყენებული I/O ხაზების რაოდენობას და ხდის პროექტს მასშტაბურს.

მიკროკონტროლერის პროგრამა ჩვენი პრობლემის გადასაჭრელად შედარებით მარტივია. არსებობს მუშაობის 3 რეჟიმი (ინფორმაციის შეყვანა) და გამოხმაურება:

  • 360 ° პოზიციონირების რეჟიმი - ამ რეჟიმში, LED-ები მიუთითებენ ენკოდერის მიმდინარე „პოზიციაზე“, მომხმარებელს შეუძლია ნებისმიერი კუთხით მოაბრუნოს ენკოდერის ლილვი მარცხნივ და მარჯვნივ;
  • რეჟიმი "მოცულობა / დონე" - ამ რეჟიმში LED-ები მიუთითებენ მიმდინარე მნიშვნელობას შეყვანის დიაპაზონის მინიმალურ და მაქსიმალურ დონეებს შორის (როგორც ხმის დონე აუდიო მოწყობილობებში);
  • 3-პოზიციური მბრუნავი გადართვის რეჟიმი - ამ რეჟიმში არის მხოლოდ სამი ასარჩევი პოზიცია, რომელსაც მომხმარებელი ირჩევს ენკოდერის ლილვის მარცხნივ/მარჯვნივ შებრუნებით.

პროექტის დემონსტრირება