Სარჩევი:

საშუალო გაშვება თქვენი მიკროკონტროლის პროექტებისთვის: 6 ნაბიჯი
საშუალო გაშვება თქვენი მიკროკონტროლის პროექტებისთვის: 6 ნაბიჯი

ვიდეო: საშუალო გაშვება თქვენი მიკროკონტროლის პროექტებისთვის: 6 ნაბიჯი

ვიდეო: საშუალო გაშვება თქვენი მიკროკონტროლის პროექტებისთვის: 6 ნაბიჯი
ვიდეო: ძმამ დას iphone 6 უყიდა 2024, ნოემბერი
Anonim
საშუალო გაშვება თქვენი მიკროკონტროლის პროექტებისთვის
საშუალო გაშვება თქვენი მიკროკონტროლის პროექტებისთვის

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

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

ნაბიჯი 1: გამოიყენეთ შემთხვევა: ADC გაზომვების გასწორება

გამოყენების შემთხვევა: ADC გაზომვების გასწორება
გამოყენების შემთხვევა: ADC გაზომვების გასწორება

Arduino– ს აქვს ღირსეული 10 ბიტიანი ADC ძალიან მცირე ხმაურით. როდესაც ვზომავთ მნიშვნელობას სენსორზე, როგორიცაა პოტენომეტრი, ფოტორეზისტორი ან სხვა მაღალი ხმაურის კომპონენტები, ძნელი დასაჯერებელია, რომ გაზომვა სწორია.

ერთი გამოსავალი არის მრავალჯერადი გაზომვის გაკეთება ყოველ ჯერზე, როდესაც გსურთ თქვენი სენსორის წაკითხვა და მათი საშუალო გაანგარიშება. ზოგიერთ შემთხვევაში ეს არის სიცოცხლისუნარიანი გამოსავალი, მაგრამ არა ყოველთვის. თუ გსურთ რომ ADC წაიკითხოთ 1000 ჯერ წამში, თქვენ უნდა გქონდეთ 10 000, თუ საშუალოდ 10 გაზომვას მიიღებთ. გამოთვლის დროის უზარმაზარი დაკარგვა.

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

ზემოთ მოცემულ სურათზე მე გამოვიყენე ბოლო 32 გაზომვის საშუალო მაჩვენებელი. თქვენ დაინახავთ, რომ ეს მეთოდი არ არის 100% -ით წარუმატებელი, მაგრამ მნიშვნელოვნად აუმჯობესებს სიზუსტეს (ეს არ არის უარესი, ვიდრე ყოველ ჯერზე საშუალოდ 32 ნიმუშს). თუ თქვენ გინდათ გამოთვალოთ საშუალოდ 32 გაზომვა ყოველ ჯერზე, ეს მხოლოდ 0.25 ms დასჭირდება Arduino UNO– ს გაზომვებისთვის!

ნაბიჯი 2: გამოიყენეთ საქმე: მიკროფონის სიგნალის DC კომპონენტის გაზომვა

გამოყენების საქმე: მიკროფონის სიგნალის DC კომპონენტის გაზომვა
გამოყენების საქმე: მიკროფონის სიგნალის DC კომპონენტის გაზომვა
გამოყენების საქმე: მიკროფონის სიგნალის DC კომპონენტის გაზომვა
გამოყენების საქმე: მიკროფონის სიგნალის DC კომპონენტის გაზომვა
გამოყენების საქმე: მიკროფონის სიგნალის DC კომპონენტის გაზომვა
გამოყენების საქმე: მიკროფონის სიგნალის DC კომპონენტის გაზომვა

Arduino– ს შეუძლია გაზომოს ძაბვები 0 – დან Vcc– მდე (ჩვეულებრივ 5 V). აუდიო სიგნალი არის მთლიანად AC და თუ გსურთ გაზომოთ იგი მიკროკონტროლერზე, თქვენ უნდა შეაფასოთ იგი 1/2 Vcc– ის გარშემო. Arduino UNO– ს პროექტში, რაც ნიშნავს დაახლოებით 2.5 V (DC) + აუდიო სიგნალს (AC). 10 ბიტიანი ADC და 5 V კვების ბლოკის გამოყენებისას, 2.5 V მიკერძოება უნდა იყოს 512 -ის ტოლი. ასე რომ სიგნალის AC მნიშვნელობის მისაღებად 512 უნდა გამოვაკლოთ ADC გაზომვას და ეს არის, არა?

იდეალურ სამყაროში, ეს სიმართლე იქნებოდა. სამწუხაროდ, რეალური ცხოვრება უფრო გართულებულია და ჩვენი სიგნალის მიკერძოება მიდრეკილია მოძრაობისკენ. ძალიან ხშირია 50 Hz ხმაური (60 Hz თუ ცხოვრობთ აშშ – ში) ელექტრო ქსელიდან. როგორც წესი, ეს არ არის ძალიან პრობლემატური, მაგრამ კარგია ვიცოდეთ, რომ ის არსებობს. უფრო პრობლემატურია კომპონენტების გათბობიდან წრფივი დაშორება. თქვენ საგულდაგულოდ ადგენთ DC ოფსეტური შესწორებას დასაწყისში და ის ნელ -ნელა შორდება თქვენი აპლიკაციის მუშაობისას.

ამ პრობლემის ილუსტრაციას გავაკეთებ (მუსიკალური) სცემის დეტექტორით. თქვენ ადგენთ თქვენი მიკერძოების მოცილებას და დარტყმები ნათელია (სურათი 2). გარკვეული დროის შემდეგ, DC მიკერძოება მოძრაობს და დარტყმები ძლივს შესამჩნევია მიკროკონტროლერისთვის (სურათი 3). სცემის გამოვლენის ალგორითმი შემდგომში სიღრმისეულად იქნება შესწავლილი, რადგან ის აღემატება ამ სტატიის ფარგლებს.

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

ჩვენ ვიცით, რომ ნებისმიერი AC სიგნალის საშუალო მნიშვნელობა არის 0. ამ ცოდნის გამოყენებით შეგვიძლია გამოვაკლოთ AC+DC სიგნალის საშუალო მნიშვნელობა არის DC მიკერძოება. მისი ამოღების მიზნით, ჩვენ შეგვიძლია ავიღოთ ბოლო რამდენიმე მნიშვნელობის საშუალო მაჩვენებელი და გამოვაკლოთ ADC– ს მიმდინარე კითხვისგან. გაითვალისწინეთ, რომ თქვენ უნდა გამოიყენოთ საკმარისად გრძელი საშუალო მაჩვენებელი. აუდიოსთვის, წამის მეათედი (ნიმუშების რაოდენობა დამოკიდებულია თქვენს შერჩევის მაჩვენებელზე) საკმარისი იქნება, მაგრამ იცოდეთ, რომ საშუალო საშუალო მაჩვენებლები უკეთესად მუშაობს. პირველ სურათზე თქვენ ხედავთ რეალური DC მიკერძოების გაანგარიშების მაგალითს გაშვებული საშუალო მაჩვენებლით 64 ელემენტით 1 kHz ნიმუშის სიხშირით (იმაზე ნაკლები ვიდრე ვურჩევდი მაგრამ მაინც მუშაობს).

ნაბიჯი 3: გაანგარიშება

Გაანგარიშება
Გაანგარიშება

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

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

თქვენ ალბათ ფიქრობთ: "ეს არ ჩანს ძალიან ეფექტურად … უნდა არსებობდეს ამის უკეთესი გზა." და მართალი იქნებით.

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

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

ნაბიჯი 4: კოდი

Კოდი
Კოდი

იმისათვის, რომ გამოთვალოთ გაშვებული საშუალო, თქვენ ჯერ გჭირდებათ გზა შეინახოთ ბოლო N მნიშვნელობები. თქვენ შეგიძლიათ გქონდეთ მასივი N ელემენტებით და გადაიტანოთ მთელი შინაარსი ერთ ადგილას ყოველ ჯერზე, როდესაც დაამატებთ ელემენტს (გთხოვთ, ნუ გააკეთებთ ამას), ან შეგიძლიათ გადაწეროთ ერთი ძველი ელემენტი და მომართოთ მომდევნო ელემენტის მაჩვენებელი:)

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

ელემენტის დამატება ხაზის დაგვიანებით ისეთივე ადვილია, როგორც უახლესი ელემენტის ინდექსის 1 -ით შემცირება, დარწმუნდით, რომ იგი არ მიუთითებს დაგვიანების ხაზის მასივის მხარეს. ინდექსის შემცირების შემდეგ, როდესაც ის 0 -ია, ის მარყუჟდება 255 -მდე (რადგან ეს არის 8 ბიტიანი ხელმოუწერელი მთელი რიცხვი). მოდულოს (%) ოპერატორი ზომით მასივის დაგვიანებით უზრუნველყოფს ინდექსის მითითებას მოქმედ ელემენტზე.

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

ადვილია, არა?

გთხოვთ, მოგერიდოთ ექსპერიმენტი თანდართული კოდის გამოყენებით, რათა უკეთ გაიგოთ როგორ მუშაობს ეს ყველაფერი. დღევანდელი მდგომარეობით, arduino კითხულობს ანალოგურ მნიშვნელობას ანალოგურ pin A0- ზე და ბეჭდავს "[ADC მნიშვნელობა], [გაშვებული საშუალო]" სერიულ პორტზე 115200 baud სიჩქარით. თუ თქვენ გახსნით arduino– ს სერიულ პლოტერს ბოდის სწორ სიჩქარეზე, ნახავთ ორ ხაზს: ADC მნიშვნელობა (ლურჯი) და გათლილი მნიშვნელობა (წითელი).

ნაბიჯი 5: დამატებითი

დამატებები
დამატებები

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

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

მოძრაობს.

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

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

ხრიკი: გრძელი დაგვიანების ხაზები დიდ მეხსიერებას იკავებს. ეს შეიძლება სწრაფად გახდეს პრობლემა. თუ მეხსიერება ძალიან შეზღუდული გაქვთ და დიდად არ გაინტერესებთ სიზუსტე, შეგიძლიათ მიახლოებითი გაანგარიშება, თუ გამოტოვებთ მთლიანად დაგვიანებას და ამის ნაცვლად გააკეთებთ: აკუმულატორიდან გამოაკლეთ 1/N * აკუმულატორი და დაამატეთ ახალი მნიშვნელობა (8 გრძელვადიანი საშუალო მაგალითის მაგალითზე: აკუმულატორი = აკუმულატორი * 7/8 + newValue). ეს მეთოდი იძლევა არასწორ შედეგს, მაგრამ ეს არის ღირსეული მეთოდი გაანგარიშების საშუალო, როდესაც თქვენ გაქვთ დაბალი მეხსიერება.

ენათმეცნიერება: "გაშვებული საშუალო/საშუალო" ჩვეულებრივ გამოიყენება რეალურ დროში საშუალოს მიმართებისას, ხოლო "მოძრავი საშუალო/საშუალო" ჩვეულებრივ ნიშნავს ალგორითმის მუშაობას სტატიკურ მონაცემთა ნაკრებზე, როგორიცაა Excel ცხრილები.

ნაბიჯი 6: დასკვნა

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

გირჩევთ: