Სარჩევი:
- ნაბიჯი 1: ძველი სკოლის სიხშირის დათვლა
- ნაბიჯი 2: საპასუხო გზა
- ნაბიჯი 3: აპარატურა და მისი სქემა
- ნაბიჯი 4: კოდი
- ნაბიჯი 5: სიზუსტე და სიზუსტე
ვიდეო: მაღალი რეზოლუციის სიხშირის მრიცხველი: 5 ნაბიჯი (სურათებით)
2024 ავტორი: John Day | [email protected]. ბოლოს შეცვლილი: 2024-01-30 10:15
ეს ინსტრუქცია გვიჩვენებს საპასუხო სიხშირის მრიცხველს, რომელსაც შეუძლია გაზომოთ სიხშირეები სწრაფად და გონივრული სიზუსტით. ის დამზადებულია სტანდარტული კომპონენტებით და შეიძლება გაკეთდეს შაბათ-კვირას (ცოტა მეტი დამჭირდა:-))
შეცვლა: კოდი უკვე ხელმისაწვდომია GitLab– ზე:
gitlab.com/WilkoL/high-resolution-frequency-counter
ნაბიჯი 1: ძველი სკოლის სიხშირის დათვლა
სიგნალის სიხშირის გასაზომად ძველი სკოლის მეთოდია ლოგიკური AND კარიბჭის გამოყენება, სიგნალის გაზომვა ერთ პორტში და სიგნალი ზუსტად 1 წამით მეორე პორტში და გამოთვლა გამომავალი. ეს საკმაოდ კარგად მუშაობს სიგნალებზე რამდენიმე kHz კარგად GHz. რა მოხდება, თუ გსურთ გაზომოთ დაბალი სიხშირის სიგნალი კარგი გარჩევადობით? თქვით, რომ გსურთ გაზომოთ ქსელის სიხშირე (აქ 50 ჰერცი). ძველი სკოლის მეთოდით თქვენ იხილავთ მუდმივ 50 -ს თქვენს ეკრანზე, თუ გაგიმართლათ, მაგრამ უფრო სავარაუდოა, რომ თქვენ დაინახავთ ეკრანის შეცვლას 49 -დან 50 -მდე ან 50 -დან 51 -მდე. გარჩევადობა არის 1 ჰერცი, და ეს არის ის. თქვენ არასოდეს ნახავთ 50.002 ჰერცს, თუ არ გსურთ კარიბჭის დრო 1000 წამამდე გაზარდოთ. ეს 16 წუთზე მეტია, ერთი გაზომვისთვის!
დაბალი სიხშირის სიგნალების გაზომვის უკეთესი გზაა მისი პერიოდის გაზომვა. მაგისტრალის აღებას კვლავ აქვს პერიოდი 20 მილიწამი. მიიღეთ იგივე ლოგიკური AND კარიბჭე, მიაწოდეთ მას, ვთქვათ 10 MHz (0.1 us pulses) და თქვენი სიგნალი სხვა პორტზე და გამოდის 200000 pulses, ასე რომ პერიოდი არის 20000.0 uS და ეს ითარგმნება უკან 50Hz. როდესაც თქვენ გაზომავთ მხოლოდ 199650 პულსს, სიხშირეა 50.087 ჰერცი, ეს ბევრად უკეთესია და ეს ხდება მხოლოდ ერთ წამში. სამწუხაროდ, ეს არ მუშაობს კარგად მაღალი სიხშირეებით. მაგალითად, ახლა ჩვენ გვინდა გავზომოთ 40 kHz. იგივე 10 MHz შეყვანის სიხშირით, როგორც მითითება, ჩვენ ახლა ვზომავთ მხოლოდ 250 იმპულსს. როდესაც ჩვენ ვითვლით მხოლოდ 249 იმპულსს, გამოთვლა იძლევა 40161 ჰერცს და 251 -ით შედეგი არის 39840 ჰერცი. ეს არ არის მისაღები რეზოლუცია. რა თქმა უნდა, საცნობარო სიხშირის გაზრდა აუმჯობესებს შედეგებს, მაგრამ არსებობს შეზღუდვა იმისა, თუ რისი გამოყენება შეგიძლიათ მიკრო კონტროლერში.
ნაბიჯი 2: საპასუხო გზა
გამოსავალი, რომელიც მუშაობს როგორც დაბალი, ისე მაღალი სიხშირეებისთვის, არის საპასუხო სიხშირის მრიცხველი. შევეცდები ავხსნა მისი პრინციპი. თქვენ იწყებთ გაზომვის დროს, რომელიც არის დაახლოებით 1 წამი, ის არ უნდა იყოს ძალიან ზუსტი, მაგრამ ეს არის გაზომვის გონივრული დრო. მიაწოდეთ ეს 1 Hz სიგნალი D- ფლიპფლოპში D- შეყვანისას. ჯერ არაფერი ხდება გამომავალ (ებ) ზე. შეაერთეთ სიგნალი, რომლის გაზომვაც გსურთ D-flipflop– ის CLOCK შეყვანასთან.
როგორც კი ეს სიგნალი გადადის LOW- დან HIGH- ში, D-flipflop- ის გამომავალი გადააქვს D- შეყვანის მდგომარეობა გამომავალზე (Q). ეს ამომავალი სიგნალი გამოიყენება შესასვლელი სიგნალის დასათვლელად, ასევე საცნობარო საათის სიგნალის დასაწყებად.
ასე რომ თქვენ ითვლით ორ სიგნალს ზუსტად ერთსა და იმავე დროს, სიგნალს, რომლის გაზომვაც გსურთ და საცნობარო საათს. ამ საცნობარო საათს უნდა ჰქონდეს ზუსტი მნიშვნელობა და იყოს სტაბილური, ნორმალური ბროლის ოსცილატორი კარგად არის. მნიშვნელობა არ არის ძალიან მნიშვნელოვანი, სანამ ის მაღალი სიხშირეა და მისი მნიშვნელობა კარგად არის ცნობილი.
გარკვეული დროის შემდეგ, თქვით რამდენიმე მილიწამში, თქვენ კვლავ დაბალ მნიშვნელობას ანიჭებთ D- ფლიპფლოპის D- შეყვანას. მომდევნო CLOCK- შეყვანისას გამომავალი Q მიჰყვება შეყვანის მდგომარეობას, მაგრამ სხვა არაფერი ხდება, რადგან მიკრო კონტროლერი არის რეაგირებული მხოლოდ ამომავალი სიგნალის მიმართ. შემდეგ, მას შემდეგ, რაც გაზომვის დრო დასრულდება (დაახლ. 1 წამი) თქვენ D- შეყვანის მაღალი.
კვლავ მომდევნო საათის შეყვანისას Q გამომავალი მოდის და ეს ამომავალი სიგნალი იწვევს მიკრო კონტროლერს, ამჯერად ორივე მრიცხველის დათვლის დასრულების მიზნით.
შედეგი არის ორი რიცხვი. პირველი რიცხვი არის იმპულსების რიცხვი, რომელიც ითვლება მითითებიდან. როგორც ვიცით საცნობარო სიხშირე, ასევე ვიცით რა დრო დასჭირდა იმ იმპულსების დათვლას.
მეორე რიცხვი არის იმპულსების რაოდენობა იმ სიგნალიდან, რომელსაც ჩვენ ვზომავთ. როგორც დავიწყეთ ზუსტად ამ სიგნალის ამომავალი კიდეებიდან, ჩვენ ძალიან დარწმუნებული ვართ ამ შეყვანის სიგნალის იმპულსების რაოდენობაში.
ახლა ეს არის მხოლოდ გაანგარიშება, რათა დადგინდეს შეყვანის სიგნალის სიხშირე.
მაგალითი, ვთქვათ, გვაქვს ეს სიგნალები და გვინდა გავზომოთ f- შეყვანა. მითითება არის 10 MHz, გენერირებული კვარცის ბროლის ოსცილატორის მიერ. f_input = 31.416 Hz f_reference = 10000000 Hz (10 MHz), გაზომვის დრო დაახლ. 1 წამი
ამ დროს ჩვენ დავთვალეთ 32 პულსი. ახლა, ამ სიგნალის ერთ პერიოდს სჭირდება 1 / 31.416 = 31830.9 uS. ასე რომ, 32 პერიოდს დაგვჭირდა 1.0185892 წამი, რაც 1 წამზე ოდნავ მეტია.
ამ 1.0186 წამში ჩვენ ასევე დავთვლით საცნობარო სიგნალის 10185892 იმპულსს.
ეს გვაძლევს შემდეგ ინფორმაციას: input_count = 32 reference_count = 10185892 f_reference = 10000000 Hz
მიღებული სიხშირის გამოსათვლელი ფორმულა არის ეს: freq = (input_count * f_reference) / ref_count
ჩვენს მაგალითში არის: f-input = (32 * 10000000) / 10185892 = 31.416 Hz
და ეს კარგად მუშაობს როგორც დაბალი სიხშირეებისთვის, ასევე მაღალი სიხშირეებისთვის, მხოლოდ მაშინ, როდესაც შეყვანის სიგნალი ახლოვდება (ან თუნდაც უფრო მაღალია) საცნობარო სიხშირეზე უმჯობესია გამოვიყენოთ სტანდარტული "დახურული" საზომი მეთოდი. მაგრამ შემდეგ ჩვენ შეგვიძლია უბრალოდ დავამატოთ სიხშირის გამყოფი შესასვლელ სიგნალს, რადგან ამ საპასუხო მეთოდს აქვს ერთი და იგივე გარჩევადობა ნებისმიერი სიხშირისთვის (ისევ მითითებამდე). ასე რომ თქვენ გაზომავთ 100 კჰჰცს პირდაპირ იყოფა გარე 1000x გამყოფით, გარჩევადობა იგივეა.
ნაბიჯი 3: აპარატურა და მისი სქემა
მე გავაკეთე რამდენიმე ამ ტიპის სიხშირის მრიცხველი. დიდი ხნის წინ გავაკეთე ერთი ATMEGA328– ით (იგივე კონტროლერი რაც არის Arduino– ში), მოგვიანებით ST– დან ARM მიკრო კონტროლერებით. უახლესი დამზადებულია STM32F407 168 MHz სიხშირით. მაგრამ ახლა დავინტერესდი, თუ იგივე გავაკეთებ * ბევრად * პატარაზე. მე ავირჩიე ATTINY2313, რომელსაც აქვს მხოლოდ 2 კბაიტი FLASH მეხსიერება და 128 ბაიტი ოპერატიული მეხსიერება. ჩვენება მაქვს MAX7219, რომელსაც აქვს 8 შვიდ სეგმენტიანი ეკრანი, ეს ჩვენებები ხელმისაწვდომია Ebay– ზე მხოლოდ 2 ევროდ. ATTINY2313 შეგიძლიათ შეიძინოთ დაახლოებით 1.5 ევროდ, დანარჩენი ნაწილები, რომლებიც მე გამოვიყენე, ცენტია. ყველაზე ძვირი ალბათ პლასტიკური პროექტის ყუთი იყო. მოგვიანებით გადავწყვიტე ლითიუმ-იონური ბატარეის დამუშავება, ამიტომ დამჭირდა (LDO) 3.3V ძაბვის სტაბილიზატორის დამატება ბატარეის დატენვის მოდული და თავად ბატარეა. ეს გარკვეულწილად ზრდის ფასს, მაგრამ ვფიქრობ, რომ მისი აშენება შესაძლებელია 20 ევროზე ნაკლები.
ნაბიჯი 4: კოდი
კოდი დაწერილია C- ში Atmel (Microchip) Studio 7 -ით და დაპროგრამებულია ATTINY2313- ში OLIMEX AVR_ISP (კლონი?) გამოყენებით. გახსენით (main.c) ქვემოთ მოცემულ zip ფაილში, თუ გსურთ აღწერილობას მიჰყევით აქ.
ინიციალიზაცია
პირველად ATTINY2313 შეიქმნა გარე ბროლის გამოსაყენებლად, ვინაიდან შიდა RC- ოსცილატორი არაფრის გაზომვისთვის უსარგებლოა. მე ვიყენებ 10 მჰც კრისტალს, რომელიც ვარეგულირებ 10 000 000 ჰც სიზუსტეს მცირე ცვლადი კონდენსატორის საშუალებით. ინიციალიზაცია ზრუნავს პორტების შესასვლელებზე და გამოსავლებზე, ტაიმერების დაყენებაზე და MAX7219– ის შეფერხებებისა და ინიციალიზაციის საშუალებას. TIMER0 არის დაყენებული გარე საათის დასათვლელად, TIMER1 შიდა საათის და ასევე მრიცხველის მნიშვნელობის დასაფიქსირებლად ICP– ის მზარდ ზღვარზე, რომელიც მოდის D-flipflop– დან.
მე განვიხილავ მთავარ პროგრამას ბოლო, ასე რომ შემდეგი არის შეწყვეტის რუტინები.
TIMER0_OVF
როგორც TIMER0 ითვლის 255 -მდე (8 ბიტი) და შემდეგ გადადის 0 -ზე, ჩვენ გვჭირდება შეფერხება, რათა გამოვთვალოთ გადავსების რაოდენობა. სულ ეს არის TIMER0_OVF, უბრალოდ დაითვალეთ გადავსების რაოდენობა. მოგვიანებით ეს რიცხვი შერწყმულია მრიცხველის ღირებულებასთან.
TIMER1_OVF
TIMER1- ს შეუძლია დაითვალოს 65536 -მდე (16 ბიტი), ამიტომ შეწყვეტა TIMER1_OVF ასევე ითვლის გადავსების რაოდენობას. მაგრამ მეტს აკეთებს. ის ასევე მცირდება 152-დან 0-მდე, რასაც დაახლოებით 1 წამი სჭირდება და შემდეგ ადგენს გამომავალ პინს, მიდის ფლიპფლოპის D- შესასვლელთან. და ბოლო რაც კეთდება ამ შეწყვეტის რუტინაში არის დროის შემცირების მრიცხველის შემცირება, 765 – დან 0 – მდე, რასაც დაახლოებით 5 წამი სჭირდება.
TIMER1_CAPT
ეს არის TIMER1_CAPT შეფერხება, რომელიც იწყება ყოველ ჯერზე, როდესაც D-flipflop აგზავნის მას სიგნალს, შეყვანის სიგნალის მზარდ ზღვარზე (როგორც ზემოთ განმარტებულია). გადაღების ლოგიკა ზრუნავს გადაღების მომენტში TIMER1 მრიცხველის ღირებულების შენახვაზე, ის ინახება ისევე როგორც გადავსების მრიცხველი. სამწუხაროდ TIMER0– ს არ აქვს შეყვანის გადაღების ფუნქცია, ასე რომ აქ იკითხება მისი ამჟამინდელი მნიშვნელობა და მისი ამჟამინდელი მნიშვნელობა გადავსების მრიცხველისთვის. შეტყობინების ცვლადი არის მითითებული ერთზე, მისი ძირითადი პროგრამისთვის, რომ ეს ახალი მონაცემები იყოს.
შემდეგი არის ორი ფუნქცია MAX7219– ის გასაკონტროლებლად
SPI
მიუხედავად იმისა, რომ ჩიპში არის უნივერსალური სერიული ინტერფეისი (USI), მე ავირჩიე არ გამოვიყენო. MAX7219 ეკრანის კონტროლი საჭიროა SPI– ით და ეს შესაძლებელია USI– ით. მაგრამ bitbanging SPI იმდენად მარტივია, რომ მე დრო არ დამჭირდა ამის გაკეთება USI– ით.
MAX7219
MAX7219– ის დაყენების ოქმი ასევე საკმაოდ მარტივია მას შემდეგ რაც წაიკითხავთ მის სახელმძღვანელოს. მას სჭირდება 16 ბიტიანი მნიშვნელობა თითოეული ციფრისთვის, რომელიც შედგება 8 ბიტიანი ციფრული რიცხვისთვის (1 -დან 8 -მდე), რასაც მოყვება 8 ბიტი იმ რიცხვისთვის, რომელიც მას სჭირდება ჩვენებისთვის.
MAIN-PROG
ბოლო არის ძირითადი პროგრამის ახსნა. ის მუშაობს უსასრულო მარყუჟში (ხოლო (1)), მაგრამ რეალურად აკეთებს რაღაცას, როდესაც არის შეტყობინება (1) შეწყვეტის რუტინიდან ან როდესაც დროის გასვლის მრიცხველი ნულამდე დაეცა (შეყვანის სიგნალი არ არის).
პირველი, რაც უნდა გააკეთოთ, როდესაც ცვლადი შეტყობინება დაყენებულია ერთზე, არის გადატვირთვა დროის გასვლის მრიცხველი, ყოველივე ამის შემდეგ ჩვენ ვიცით, რომ არსებობს სიგნალი. D-flipflop გადატვირთულია იმისათვის, რომ მზად იყოს შემდეგი გამომწვევისთვის, რომელიც მოვა გაზომვის დროის შემდეგ (დაელოდეთ წამს).
გადაღების შეწყვეტაში რეგისტრირებული რიცხვები ემატება მითითების რაოდენობას და შეყვანის სიხშირის რაოდენობას. (ჩვენ უნდა დავრწმუნდეთ, რომ მითითება არასოდეს შეიძლება იყოს ნული, რადგან ჩვენ მას მოგვიანებით გავყოფთ)
შემდეგი არის რეალური სიხშირის გაანგარიშება. მე ნამდვილად არ მინდა გამოვიყენო მცურავი რიცხვები მიკროკონტროლერზე მხოლოდ 2 კბაიტიანი ციმციმით და მხოლოდ 128 ბაიტიანი ოპერატიული მეხსიერებით ვიყენებ მთელ რიცხვს. მაგრამ სიხშირე შეიძლება იყოს 314.159 ჰერცი, რამდენიმე ათწილადის მქონე. ამიტომ გავამრავლებ შეყვანის სიხშირეს არა მხოლოდ საცნობარო სიხშირით, არამედ მულტიპლიკატორითაც და შემდეგ რიცხვს ვამატებ იქ, სადაც უნდა წავიდეს ათობითი წერტილი. ეს რიცხვები ძალიან დიდი გახდება, როდესაც ამას გააკეთებთ. Მაგალითად. 500 kHz შეყვანისას, 10 MHz- ის მითითებით და 100 -ის გამრავლებით, ეს იძლევა 5 x 10^14, ეს მართლაც უზარმაზარია! ისინი არ ჯდება 32 ბიტიან რიცხვში, ასე რომ მე ვიყენებ 64 ბიტიან ციფრებს, რომლებიც გაივლის 1,8 x 10^19 -მდე (ეს მშვენივრად მუშაობს ATTINY2313- ზე)
და ბოლო რაც უნდა გააკეთოთ არის შედეგის გაგზავნა MAX7219 ეკრანზე.
კოდი შედგენილია 1600 ბაიტში, ასე რომ, ის ჯდება 2048 ბაიტიან ფლეშში, რომელიც ხელმისაწვდომია ATTINY2313– ში.
დაუკრავენ რეგისტრებს უნდა იკითხებოდეს ასე:
გაფართოვდა 0xFF
მაღალი 0xDF
დაბალი 0xBF
ნაბიჯი 5: სიზუსტე და სიზუსტე
სიზუსტე და სიზუსტე ორი ცალკეული მხეცია. სიზუსტე აქ არის შვიდი ციფრი, რაც არის ფაქტობრივი სიზუსტე დამოკიდებულია ტექნიკასა და კალიბრაციაზე. მე დაკალიბრებული 10 MHz (5 MHz on ტესტი წერტილი) სხვა სიხშირის მრიცხველი, რომელსაც აქვს GPS დისციპლინირებული oscillator.
და ის საკმაოდ კარგად მუშაობს, ყველაზე დაბალი სიხშირე ვცადე არის 0.2 ჰერცი, ყველაზე მაღალი 2 მჰც. ის ადგილზეა 2 MHz– ზე მაღლა კონტროლერი იწყებს წყვეტის შეწყვეტას, გასაკვირი არ არის, როდესაც იცით, რომ 2 MHz შეყვანის სიგნალზე TIMER0 წარმოქმნის 7800 – ზე მეტ შეწყვეტას წამში. და ATTINY2313- მა უნდა გააკეთოს სხვა საქმეებიც, წყვეტები TIMER1– დან, კიდევ 150 შეფერხება წამში და რა თქმა უნდა გააკეთოს გათვლები, აკონტროლოს ჩვენება და D-flipflop. როდესაც უყურებთ რეალურ მოწყობილობას დაინახავთ, რომ მე ვიყენებ ეკრანის რვა ციფრიდან მხოლოდ შვიდს. ამას ვაკეთებ რამდენიმე მიზეზის გამო.
პირველი ის არის, რომ შეყვანის სიხშირის გაანგარიშება არის გაყოფა, მას თითქმის ყოველთვის ექნება დანარჩენი, რასაც თქვენ ვერ ხედავთ, როგორც ეს არის მთელი გაყოფა. მეორე ის არის, რომ კვარცის ბროლის ოსცილატორი არ არის სტაბილიზირებული ტემპერატურაზე.
კონდენსატორები, რომლებიც აკორექტირებენ მას 10 მჰც სიზუსტეზე, არის კერამიკული, ძალიან მგრძნობიარე ტემპერატურის ცვლილებებზე. შემდეგ არის ის ფაქტი, რომ TIMER0– ს არ გააჩნია ჩამონტაჟებული ლოგიკა და ყველა ფუნქციის შეწყვეტას გარკვეული დრო სჭირდება. მე ვფიქრობ, რომ შვიდი ციფრი მაინც კარგია.
გირჩევთ:
სიხშირის მრიცხველი არდუინოსთან ერთად: 8 ნაბიჯი (სურათებით)
სიხშირის მრიცხველი არდუინოსთან ერთად: ეს არის მარტივი და იაფი არდუინოზე დაფუძნებული სიხშირის მრიცხველი 4 დოლარზე ნაკლები, ძალიან სასარგებლო იყო მცირე ზომის სქემების გაზომვა
მაღალი რეზოლუციის ვებკამერა: 9 ნაბიჯი (სურათებით)
მაღალი რეზოლუციის ვებკამერა: რამდენიმე წლის განმავლობაში ვიყენებდი RPi დაფუძნებულ ვებკამერას (PiCam მოდულთან ერთად). წარმოებული სურათები იყო ყველა უფლება, მაგრამ შემდეგ, იყო მომენტი, როდესაც მე აღარ ვარ კმაყოფილი ხარისხით. მე გადავწყვიტე მაღალი რეზოლუციის ვებკამერის გაკეთება. შემდეგი ნაწილები
მაღალი რეზოლუციის PWM სიგნალის გენერაცია RC სერვისებისთვის STM32 მოწყობილობებით: 3 ნაბიჯი
მაღალი რეზოლუციის PWM სიგნალის გენერაცია RC სერვისებისთვის STM32 მოწყობილობებით: ამჟამად, მე ვაშენებ RC გადამცემს/მიმღებს SX1280 RF ჩიპის საფუძველზე. პროექტის ერთ -ერთი მიზანი ის არის, რომ მე მინდა 12 ბიტიანი სერვო რეზოლუცია ჩხირებიდან ყველა სერვისამდე. ნაწილობრივ იმიტომ, რომ თანამედროვე ციფრულ სერვისებს აქვთ 12 ბიტიანი ხელახალი
როგორ გავზომოთ მაღალი სიხშირის და სამუშაო ციკლი, ერთდროულად, მიკროკონტროლერის გამოყენებით .: 4 ნაბიჯი
როგორ გავზომოთ მაღალი სიხშირის და სამუშაო ციკლი, ერთდროულად, მიკროკონტროლის გამოყენებით .: მე ვიცი რას ფიქრობთ: " ჰა? არსებობს მრავალი ინსტრუქცია იმის შესახებ, თუ როგორ გამოიყენოთ მიკროკონტროლერები სიგნალის სიხშირის გასაზომად. ქვითინი. &Quot; დაელოდეთ, ამაში არის სიახლე: მე აღვწერ სიხშირეების გაზომვის მეთოდს, რომელიც გაცილებით მაღალია ვიდრე მიკრო
როგორ მივიღოთ მაღალი რეზოლუციის სურათები ინსტრუქციიდან: 4 ნაბიჯი
როგორ მივიღოთ მაღალი რეზოლუციის სურათები ინსტრუქციიდან: ნამდვილად მოგეწონათ ეს სასწავლო სურათი და გინდათ მისი მაღალი გარჩევადობის ასლის შენახვა? ეს დიდი პატარა თვისება ადვილად შეუმჩნეველი რჩება