এভিআরের জন্য দক্ষ বিপরীত (1 / x)


12

আমি একটি এভিআর (বা এটির কাছাকাছি) এর বিপরীত গণনা করার একটি কার্যকর উপায় খুঁজতে চেষ্টা করছি to

আমি স্টিপার মোটরের জন্য নাড়ির সময় গণনা করার চেষ্টা করছি যাতে আমি গতি রৈখিকভাবে পরিবর্তিত করতে পারি। পিরিয়ডটি গতির বিপরীত ( p = K/v) এর সাথে সমানুপাতিক , তবে আমি ফ্লাইতে এটি গণনার কোনও ভাল উপায়ের কথা ভাবতে পারি না।

আমার সূত্রটি হ'ল

p = 202/v + 298; // p in us; v varies from 1->100

আরডুইনোতে পরীক্ষা করা, বিভাগটি pস্থির রেখে পুরোপুরি উপেক্ষা করা হবে বলে মনে হচ্ছে 298(যদিও এটি এভিআর-জিসিএসিতে পৃথক হতে পারে)। vলুপটি ছাড়িয়ে যাওয়া 202এবং লুপগুলি গণনা করা পর্যন্ত আমি চেষ্টা করেছি , তবে এটি বেশ ধীর।

আমি একটি অনুসন্ধানের টেবিল তৈরি করতে এবং এটি ফ্ল্যাশ রাখতে পারি, তবে আমি ভাবছিলাম যে অন্য কোনও উপায় আছে কিনা।

সম্পাদনা করুন : শিরোনামটি "দক্ষ বিভাজন" হওয়া উচিত ...

আপডেট : পিংসওয়েপ্ট পয়েন্ট হিসাবে উল্লেখ করেছে যে, গতিবেগের সময়কালকে ম্যাপ করার জন্য আমার সূত্রটি ভুল। তবে মূল সমস্যাটি বিভাজন অপারেশন।

সম্পাদনা 2 : আরও তদন্তের সময়, বিভাজনটি আরডুইনোতে কাজ করছে, সমস্যাটি উপরের ভুল সূত্র এবং অন্যত্র কোনও প্রচ্ছন্ন ওভারফ্লো উভয়ের কারণেই হয়েছিল।


2
V একটি পূর্ণসংখ্যা বা ভাসমান পয়েন্ট?
mjh2007

একটি পূর্ণসংখ্যা, তবে এটি আমাদের মধ্যে একটি সময় দেয়, এখানে পূর্ণসংখ্যা বিভাগ যথেষ্ট সঠিক।
পিটার গিবসন

আপনি 100 পূর্ণসংখ্যার মানগুলিকে সংক্ষেপণ করতে এবং গুণটির জন্য প্রাক স্কেলারের একটি সারণী তৈরি করতে পারেন যদি আপনি গতির সাথে সত্যিই উদ্বিগ্ন হন। অবশ্যই একটি স্মৃতি বাণিজ্য বন্ধ আছে।
আরওয়াইএস

উত্তর:


7

বিভাগ সম্পর্কে একটি সুন্দর জিনিস হ'ল কমবেশি সবাই এটি করছে। এটি সি ভাষার একটি দুর্দান্ত বৈশিষ্ট্য এবং এভিআর-জিসিসির মতো সংকলক (আরডুইনো আইডিই বলে ডাকা) মাইক্রোকন্ট্রোলারের একটি হার্ডওয়্যার বিভাগ নির্দেশনা না থাকলেও উপলব্ধ সেরা বিভাগ অ্যালগরিদমকে বেছে নেবে।

অন্য কথায়, আপনার যদি খুব অদ্ভুত বিশেষ কেস না থাকে তবে বিভাগ কীভাবে কার্যকর করা হয় সে সম্পর্কে আপনাকে চিন্তা করার দরকার নেই।


আপনি যদি উদ্বিগ্ন হন, তবে আপনি আটমেলের আধিকারিকের প্রস্তাবিত বিভাগ অ্যালগরিদমগুলি পড়তে উপভোগ করতে পারেন (একটি কোড আকারের জন্য অনুকূলিত, এবং একটি কার্যকর করার গতির জন্য অনুকূলিত; কোনও ডেটা মেমরি গ্রহণ করবেন না) take তারা ভিতরে আছে:

http://www.atmel.com/dyn/resources/prod_documents/doc0936.pdf

এটি আবেদনের নোট "AVR200: গুণিত এবং ভাগ বিভক্ত রুটিনগুলি" এটির (যুক্তিসঙ্গতভাবে বড়) আটমেগা প্রসেসরের মতো আটমেগা প্রসেসরের জন্য স্ট্যান্ডার্ড আরডুইনোস-এ ব্যবহৃত At ডেটা-শিট এবং অ্যাপ্লিকেশন নোটগুলির তালিকাটি এখানে রয়েছে:

http://www.atmel.com/dyn/products/product_card.asp?part_id=4720


4

আপনার কাছে যা দরকার তা হ'ল 100-এন্ট্রি দেখার সারণী। এর চেয়ে বেশি দ্রুত পায় না।

#define VALUE_FOR_V_EQUALS_ZERO 0
uint16_t formula_lookup[100] = {VALUE_FOR_V_EQUALS_ZERO, 500, 399, 365, 348, ..., 300};

...

//"calculate" formula
p = formula_lookup[v > 67 ? 67 : v];

সম্পাদনা আপনি আসলে শুধুমাত্র একটি 68 মান লুকআপ টেবিল বনাম বৃহত্তর মান চেয়ে 67 সবসময় 300 মূল্যায়নের গেছে।


আমি যেমন প্রশ্নে বলেছিলাম, আমি ভাবছিলাম যে অন্য কোনও উপায় আছে কিনা
পিটার গিবসন

3

কিছু খুব ভাল বই উল্লেখ কৌশল আছে "হ্যাকাররা কল্লোল হেনরি ওয়ারেন দ্বারা এবং তার ওয়েবসাইটে hackersdelight.org । একটি পন্থা যা ক্ষুদ্রতর মাইক্রোকন্ট্রোলারের ভাল কাজ করে এর যখন কটাক্ষপাত ধ্রুবক দ্বারা ভাগ করেছেন এই ফাইলটি


এগুলি যেমন আপনি বলছেন তেমন ধ্রুবক দ্বারা ভাগ করার জন্য ভাল দেখাচ্ছে তবে সত্যই আমার সমস্যার জন্য প্রয়োগ করবেন না। তিনি ইনভার্সকে প্রাক্ক্যালকুলেট করার মতো কৌশল ব্যবহার করেন - এর দ্বারা গুণিত করুন, তারপরে শিফট করুন।
পিটার গিবসন

এটি একটি দুর্দান্ত বই!
উইন্ডেল ওসকে

3

আপনার ফাংশনটি মনে হচ্ছে না যে এটি আপনার পছন্দমতো ফলাফল দেবে। উদাহরণস্বরূপ, মান 50 মোটামুটি 302 প্রদান করে, যখন 100 মোটামুটি 300 ফিরিয়ে দেয় Those এই দুটি ফলাফল মোটরের গতিতে প্রায় কোনও পরিবর্তন আনবে না।

যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি সত্যিই 1-100 নম্বরগুলিকে 300-500 (আনুমানিক) পরিসরের মানচিত্রের দ্রুত উপায় খুঁজছেন, যেমন 1 ম্যাপ 500 এবং 100 থেকে 300 এর মানচিত্র।

সম্ভবত চেষ্টা করুন: পি = 500 - (2 * ভি)

তবে আমার ভুল বোঝাবুঝি হতে পারে - আপনি কি ধ্রুবক ফ্রিকোয়েন্সি বর্গাকার তরঙ্গের সময় গণনা করার চেষ্টা করছেন? 298 কি?


হ্যাঁ ধন্যবাদ, সূত্রটি ভুল। বিন্দুটি হ'ল স্টেপারের আউটপুট থেকে রৈখিক ত্বরণ পাওয়ার জন্য, প্রতিটি সময়ের ব্যবধানের সাথে ধীরে ধীরে লক্ষ্য গতি আলাদা করে (গতি ++ বলুন)। এটিকে স্টিপার মোটর নিয়ামকের কাছে একটি + প্রান্ত প্রেরণ করা সময়ের (ফ্রিকোয়েন্সি) ম্যাপ করতে হবে - সুতরাং বিপরীত সম্পর্ক (পি = 1 / ভি)।
পিটার গিবসন

আপনি কি বলতে চান ধ্রুবক ত্বরণ, অর্থাত্ একটি রৈখিক বর্ধমান বেগ?
পিংসওয়েপ করেছে

হ্যাঁ, ক্রমাগত ত্বরণ, আমি মূলত প্রশ্নটি লেখার সময় এটি আপ করি এবং এটিও ঠিক করে ফেলার কথা মনে করি
পিটার গিবসন

3

আনুমানিক বিভাজনের একটি কার্যকর উপায় শিফট দ্বারা। যেমন যদি x = y / 103; 103 দ্বারা বিভাজকটি 0.0097087 দ্বারা গুণ করার সমান, সুতরাং আনুমানিকভাবে এটি প্রথমে একটি 'ভাল' শিফট নম্বর নির্বাচন করুন (যেমন একটি বেস -২ সংখ্যা, 2,4,8,16,32 এবং আরও)

এই উদাহরণের জন্য 1024 একটি ভাল ফিট কারণ আমরা বলতে পারি যে 10/1024 = 0.009765 কোডের পরে এটি সম্ভব:

x = (y * 10) >> 10;

ভেরিয়েবল y নিশ্চিত করার জন্য অবশ্যই মনে রাখবেন গুণিতকালে এর প্রকারটি উপচে পড়বে না। এটি সঠিক নয়, তবে দ্রুত।


এটি যে লিঙ্কগুলির মধ্যে টিমরার সরবরাহ করেছিল এবং ধ্রুবক দ্বারা ভাগ করার জন্য ভাল কাজ করে তার কৌশলগুলির মতো, তবে সংকলনের সময় অজানা এমন কোনও মান দিয়ে ভাগ করার সময় নয়।
পিটার গিবসন

3

অন্য নোটে আপনি যদি এমন সিপিইউতে কোনও বিভাজন করার চেষ্টা করছেন যা বিভাজনকে সমর্থন করে না তবে এই উইকি নিবন্ধে এটি করার একটি দুর্দান্ত উপায় আছে।

http://en.wikipedia.org/wiki/Multiplicative_inverse

এক্স এর পারস্পরিক ক্রিয়াকলাপটি আনতে, কেবলমাত্র গুণ এবং বিয়োগফল ব্যবহার করে, কেউ একটি সংখ্যা y অনুমান করতে পারে এবং তারপরে বার বার y কে 2y - xy2 দিয়ে প্রতিস্থাপন করতে পারে। একবার y এর পরিবর্তনটি পর্যাপ্ত পরিমাণে ছোট হয়ে যায়, y হ'ল এক্স এর পারস্পরিক পরিমাণ।


আকর্ষণীয়, আমি আশ্চর্য হয়েছি কীভাবে এটি উল্লিখিত অন্যান্য পদ্ধতির সাথে তুলনা করে
পিটার গিবসন

1

এই প্রক্রিয়াটি এখানে এমকিউ-বান্ধব দেখায়, যদিও এটির জন্য কিছুটা পোর্টিংয়ের প্রয়োজন হতে পারে।

যদিও মনে হচ্ছে LUT আরও সহজ হবে। আপনার কেবলমাত্র 100 বাইটের প্রয়োজন হবে, যদি আপনি কিছু অন্তরবিচ্ছিন্নতা ব্যবহার করেন তবে LUT যেহেতু ধ্রুবক দ্বারা ভরাট থাকে তাই সংকলক এমনকি ডেটা অঞ্চলটির পরিবর্তে কোড অঞ্চলে এটি সনাক্ত করতে পারে।


আমি ডিভাইডারের সংমিশ্রণের ক্ষেত্রে অনুরূপ কিছু চেষ্টা করেছি যতক্ষণ না এটি ডিভিডেন্ডের সমতুল্য বা অতিক্রম করে, তবে এটি বেশ ধীর হয়ে গেছে। দেখে মনে হচ্ছে এলটিউটি যাওয়ার উপায় হবে - অ্যাভিআর-জিসিসি ব্যবহার করে আপনার এটি <ফ্ল্যাশ স্ট্রোক করার জন্য <avr / progmem.h> তে বিশেষ ম্যাক্রো দরকার।
পিটার গিবসন

1

বিভাগটি ভাসমান পয়েন্ট হিসাবে সম্পাদিত হচ্ছে তা নিশ্চিত হয়ে নিন। আমি মাইক্রোচিপটি এভিআর নয়, ব্যবহার করি তবে সি 18 ব্যবহার করার সময় আপনাকে আপনার লিটারালগুলিকে ভাসমান পয়েন্ট হিসাবে বিবেচনা করতে বাধ্য করা উচিত। যেমন। আপনার সূত্রটি এখানে পরিবর্তন করার চেষ্টা করুন:

p = 202.0/v + 298.0;


1

আপনি এখানে দ্রুত যেতে চান ..... যেহেতু এভিআর দক্ষতা সহকারে নরমালাইজেশন করতে পারে (যেহেতু আপনি আর শিফট না করা পর্যন্ত বাম দিকে সরে যান), কোনও সিউডো ভাসমান পয়েন্ট অ্যালগরিদমকে উপেক্ষা করুন। একটি এভিআর-তে খুব নির্ভুল এবং দ্রুততম পূর্ণসংখ্যার বিভাগের সহজতম উপায়টি একটি পারস্পরিক লুক লুক টেবিলের মাধ্যমে। টেবিলটি একটি বৃহত সংখ্যার দ্বারা পরিমাপক পুনরুদ্ধারগুলি সঞ্চয় করবে (বলুন 2 ^ 32)। তারপরে আপনি অ্যাসেম্বেলারে একটি স্বাক্ষরিত 32 x অচিহ্নযুক্ত 32 = স্বাক্ষরিত 64 গুণকে
কার্যকর করেন , সুতরাং উত্তর = (সংখ্যক * বিপরীতমুখী 32 [ডিনোমিনেটর]) >> 32. আমি ইনলাইন এসেম্ব্লার , (এসি ফাংশনটিতে আবৃত) ব্যবহার করে গুণফলটি প্রয়োগ করেছি implemented জিসিসি -৪-বিট "দীর্ঘতর দীর্ঘ" সমর্থন করে, তবে, ফলাফল পেতে আপনাকে 64৪ বিট দ্বারা bits৪ বিটকে গুণতে হবে, ৮-বিট আর্কিটেকচারে সি ভাষার সীমাবদ্ধতার কারণে 32x32 = 64 নয় ......

আপনি যদি 1 থেকে 4096 এর পূর্ণসংখ্যার দ্বারা ভাগ করতে চান তবে এই পদ্ধতির বিপরীতে আপনি 4K x 4 = 16K ফ্ল্যাশ ব্যবহার করবেন ......

খুব নির্ভুল স্বাক্ষরযুক্ত বিভাগ এখন সি প্রায় 300 300 চক্রের মধ্যে অর্জিত হয়।

আপনি আরও গতি, কম নির্ভুলতার জন্য 24 বিট বা 16 বিট স্কেলযুক্ত পূর্ণসংখ্যার ব্যবহার বিবেচনা করতে পারেন।


1
p = 202/v + 298; // p in us; v varies from 1->100

আপনার সমীকরণের রিটার্নের মানটি ইতিমধ্যে p=298যেহেতু সংকলকটি প্রথম বিভাজক হয় তারপরে সংখ্যক মালদ্বীপ রেজোলিউশন যুক্ত করুন:

p = ((202*100)/v + (298*100))/100 

এটি ব্যবহার করা a*f= একই সংখ্যার সাথে f = ভগ্নাংশের সাথে একই গুণ ।

যে ফলন r=a*fকিন্তু f=b/cতারপর r=a*b/cকিন্তু এটি এখনও কাজ করছে না কারণ অপারেটরদের অবস্থান, চূড়ান্ত উত্পাদ r=(a*b)/cবা muldiv ফাংশন, শুধুমাত্র পূর্ণসংখ্যা ব্যবহার কম্পিউট ভগ্নাংশ নম্বরে এমনভাবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.