জিরো-ক্রসিং সক্রিয় রিলে


13

আমি কীভাবে একটি সুইচ প্রোগ্রামিং সম্পর্কে যেতে পারি (সলিড-স্টেট রিলে বা ট্রাইকের উপর ভিত্তি করে) যা শূন্য-ক্রসিং পাওয়ারকে ট্রিগার করে?

এই বিষয়টির সাথে পরিচিত না হওয়ার জন্য: 230V পাওয়ারটি স্যুইচ করুন, যখন পাওয়ার লাইনের সাইন ওয়েভ শূন্যকে অতিক্রম করে - ফলস্বরূপ বর্তমানের স্পাইকের ফলে বৈদ্যুতিক চৌম্বকীয় ব্যাঘাতকে হ্রাস করা হয়।

বিশেষত, আমি যতটা সম্ভব সফটওয়্যারটিতে সর্বাধিক স্থানান্তর করতে পছন্দ করব। একটি এসি ইনপুট শক্তি ইতিবাচক অর্ধেক, "0" ইনপুট জিপিআইও পিনের সাথে সংযুক্ত থাকলে "1" সরবরাহ করে যখন একটি ছোট ট্রান্সফর্মার, একটি ডায়োড এবং একটি দম্পতি প্রতিরোধকের সমন্বয়ে সনাক্তকরণের সার্কিটটি "1" সরবরাহ করে। আউটপুটটিতে জিপিআইও পিনের সাথে আউটপুট সংযুক্ত করে কয়েকটি শক্ত স্টেট রিলে এবং খালি প্রয়োজনীয় জিনিসগুলি থাকে running

সমস্যাটি সময়সাপেক্ষ: 50Hz এসি সহ আমরা এক সেকেন্ডে 100 শূন্য-ক্রসিং পাই, একটি অর্ধ চক্রটি 10 ​​মিমি। EMI কম রাখতে শূন্য-ক্রসিং থেকে যুক্তিসঙ্গত দূরত্বে পৌঁছানোর জন্য আমাদের শূন্য-ক্রসিংয়ের ইভেন্টটি (বা তার আগে) 10% এর বেশি আউটপুট সক্রিয় করা উচিত নয়, যার অর্থ +1-1 সহিষ্ণুতা। এর অর্থ 1 এমএসের প্রতিক্রিয়া সময় নয় - আমরা যুক্তিসঙ্গতভাবে আশা করতে পারি যে পরের শূন্য-ক্রসিংটি প্রথম একের পরে ঠিক 10 মিমি বা চতুর্থ - 40 মিমি পরে ঘটবে। এটি গ্রানুলারিটির বিষয়ে - যদি আমরা প্রতিক্রিয়ার জন্য 20 মিমি ব্যবহার করি তবে এটি অবশ্যই 18 বা 22 এর মধ্যে নয়, 19 এবং 21 মিমের মধ্যে হওয়া উচিত।

আমি কীভাবে এই জাতীয় টাইমার প্রয়োগ করতে পারি - 1 মিমের মধ্যে ট্রিগার আউটপুট জিপিআইও যেহেতু ইনপুটটি একটি প্রান্ত সনাক্ত করে, বা তখন থেকে 10 মিমি স্থির একাধিকের মধ্যে - কিছুটা নেতিবাচক পক্ষপাতের জন্য অগ্রাধিকার হিসাবে (বলে, ট্রান্সফর্মার এবং রিলে 1.6 মিমি বিলম্ব প্রবর্তন করে; সুতরাং আমি চাই যে ট্রিগারটি 8.4+ (এন * 10) এমএসটি ইনপুট পালস থেকে ছাড়তে পারে, এইভাবে পক্ষপাতটি সার্কিট দ্বারা প্রবর্তিত বিলম্বকে মোকাবিলা করে)) - অবশ্যই "ব্যবহারকারীর চাহিদা অনুযায়ী", বলুন, ব্যবহারকারী লিখেছেন "1 "এ / সিএস / ক্লাস / ... ফাইল এবং নিকটস্থ (মোটামুটি) সুযোগে আউটপুট" চালু "হয়। ব্যবহারকারী "0" লিখেছেন এবং শূন্য-ক্রসিংয়ের আগমন হলে নির্দিষ্ট রিলে বিচ্ছিন্ন হয়ে যায়।

আমি বিশ্বাস করি এটির জন্য কার্নেল মডিউলটি লেখার বা হ্যাকিংয়ের প্রয়োজন হবে। আপনি কী আমাকে কর্ণেলটিতে রাস্পবেরি পাই এর জিপিআইও পিনগুলি পরিচালনা করেন এবং এই জাতীয় কার্যকারিতা পেতে আমি এর সাথে কোন ধরণের টাইমার সংযুক্ত করতে পারি (ইতিমধ্যে কিছু জায়গায় ইতিমধ্যে উপস্থিত না থাকলে)?


আপনি আকর্ষণীয় প্রকল্প সম্পর্কে কথা বলতে! কেবল একটি মোটামুটি অনুমান দেওয়ার জন্য: আমি প্রথমে জিপিআইওতে কিছু স্কিমিট ট্রিগার যুক্তির মাধ্যমে 50Hz মূল সংকেত থেকে সাইন ওয়েভটি ইন্টারফেস করব। সেখান থেকে সিগন্যালের উত্থিত বা পড়ন্ত প্রান্তে একটি বাধা তৈরি করে You আপনি এখন 50Hz এসিতে লক হয়ে আছেন এবং পরবর্তী শূন্য ক্রসিংটি কখন ঘটবে তা 'পূর্বাভাস' দিতে পারেন। অবশ্যই এটিতে কিছু কার্নেল ড্রাইভার প্রোগ্রামিং জড়িত। গুগল আপনার বন্ধু :-)
স্পার্কি

কটাক্ষপাত Inmojo এর এসি অপেক্ষারত গাড়ির ছোটো আলো মডিউল । আমি ওপেন সোর্স ডকুমেন্টেশনগুলি ব্যবহার করে কোনও প্রকল্পের জন্য এটি সফলভাবে ক্লোন করেছি। এছাড়াও কিছু আরডুইনো স্যাম্পল কোড রয়েছে যা আপনাকে আপনার কোডের লজিকের মাধ্যমে সহায়তা করতে পারে।
বাটার

@ বাটার্স: আমি ভয় করি যে প্রোগ্রামিং আরডুইনো এবং প্রোগ্রামিং লিনাক্স কার্নেল মডিউলটির মধ্যে ব্যবধানটি আমার জন্য সফ্টওয়্যারটির পক্ষে অকেজো করে তুলবে, তবে হার্ডওয়্যার স্কিমেটিকস আমার যা প্রয়োজন তার ১০০% কভার করেছে - ধন্যবাদ, আপনি আমার কাজটির বেশ কিছুটা সংরক্ষণ করেছেন - দুটি প্রকল্পের মধ্যে পার্থক্য কেবলমাত্র সফ্টওয়্যারেই রয়েছে (ডিমারটি অবশ্যই চক্রাকারে ট্রায়াককে স্যুইচ করতে হবে যখন সুইচটি টগলিংয়ের পরে একবারে স্যুইচটি চালু / বন্ধ করে দেয়))
এসএফ।

... অবশ্যই হার্ডওয়্যার সাইডের 100%।
এসএফ

উত্তর:


6

আপনার কার্নেলটি হ্যাক করার দরকার নেই। আপনাকে কেবল প্রক্রিয়াটি শিডিয়ুলারের সারি থেকে সরিয়ে নেওয়া দরকার।

    #include<sched.h>

    struct sched_param param;               
    param.sched_priority = sched_get_priority_max(SCHED_FIFO);
    if( sched_setscheduler( 0, SCHED_FIFO, &param ) == -1 )
    {
            perror("sched_setscheduler");
            return -1;
    }

এখন থেকে আমাদের প্রক্রিয়াটি cat /proc/sys/kernel/sched_rt_runtime_usপ্রতিটি cat /proc/sys/kernel/sched_rt_period_usমিলিসেকেন্ড সময় বিভাগের মধ্যে থেকে মিলিসেকেন্ডগুলি গ্রহণ করে, সেই সময়ে প্রাক-শূন্য হওয়ার ঝুঁকি ছাড়াই নিরবচ্ছিন্ন কার্যকরকরণের (বাস্তবে, বেরি বুটে ডিফল্টরূপে: প্রতিটি সেকেন্ডের বাইরে 0.95s)) যদি আপনার আরও প্রয়োজন হয়, গণ্ডগোল এই মানগুলি সহ, তবে এখানে আমার উদ্দেশ্যটির জন্য আমার বেশি প্রয়োজন নেই।

clock_gettime()আমার বিলম্বকে ঘড়ির ভিত্তিতে আমি মিলি সেকেন্ডে টাইমার ফাংশনটি ব্যবহার করছি (এটি আমার প্রয়োজনীয় যথার্থতা সম্পর্কে) ।

কলিং timer(1)এটিকে পুনরায় সেট করে, রিসেটের timer(0)পর থেকে কলিং রিটার্ন করে।

    #include<time.h>
    typedef unsigned long long ulong64;

    ulong64 timer(unsigned char reset)
    {
            struct timespec t;
            static struct timespec lt={0,0};
            clock_gettime(CLOCK_REALTIME, &t);
            if(reset)
            {
                    lt.tv_sec = t.tv_sec;
                    lt.tv_nsec = t.tv_nsec;
            }

            int r = ((ulong64)(t.tv_sec - lt.tv_sec))*1000 + (t.tv_nsec - lt.tv_nsec)/1000000;

            return r;
    }

rtএটি সঙ্কলনের জন্য আপনাকে লাইব্রেরির সাথে লিঙ্ক করতে হবে - -lrtআপনার জিসিসি কমান্ডটিতে যুক্ত করুন।

এখন, মূল লুপের জন্য। আমি "ব্যবহারকারীর অনুরোধ" এর জন্য একটি স্যুইচ ইনপুট ব্যবহার করছি তবে আপনি নেটওয়ার্ক, টাইমার বা যা কিছু ব্যবহার করতে পারেন। আপনার কেবলমাত্র বুলিয়ান মানটি প্রবেশ করা দরকার in

    while(1)
    {
            //when idle, return a lot of CPU time back to the system. 
            //A call every 100ms is perfectly sufficient for responsive reaction.
            usleep(100000); 

            in  = bcm2835_gpio_lev(SWITCH_PIN);
            out = bcm2835_gpio_lev(TRIAC_PIN);

            if(in==out) continue;   //nothing to do; wait user input, return control to system.

            //The output needs to be changed.
            //First, let's wait for zero-crossing event.
            timer(TIMER_RESET);
            zx = bcm2835_gpio_lev(ZEROXING_PIN);

            //We don't want to freeze the system if the zero-xing input is broken.
            //If we don't get the event within reasonable time, 
            // (like three half-sines of the power; ZEROXING_TIMEOUT = 70)
            // we're going to bail.
            while(timer(TIMER_READ) < ZEROXING_TIMEOUT)
            {
                    if(zx != bcm2835_gpio_lev(ZEROXING_PIN))
                    {
                            //Event detected.                  
                            timer(TIMER_RESET);
                            break;
                    }
            }
            if(timer(TIMER_READ) >= ZEROXING_TIMEOUT) continue;     //Zero-crossing detection is broken, try again soon.

            //Now we are mere milliseconds after zero-crossing event arrived
            // (but it could have taken some time to arrive) so let's wait for the next one, making adjustments for the system delay.
            // This is to be worked out using an oscilloscope and trial and error.
            // In my case BIASED_DELAY = 19.

            while(timer(TIMER_READ)<BIASED_DELAY) ;

            //We can reasonably expect if we perform this right now:
            bcm2835_gpio_set_pud(TRIAC_PIN, in);
            //the signal will reach the output right on time.

            // The 100ms delay on return to start of the loop should be enough 
            // for the signals to stabilize, so no need for extra debouncing.
    }

এটি কি এক / সি'র জন্য পাই-নিয়ন্ত্রিত ডিমার সুইচ বাস্তবায়নের জন্য কাজ করবে? আমি শুধু স্থাপনের) আমি 1 করতে হবে) অনেক ছোট কিছু (প্রতি 100 মিঃসে পরিবর্তে) এবং 2 রেজল্যুশন পরিবর্তন কল্পনা পরিবর্তে TRIAC_PINকরার in, আমি সেট করতে হবে TRIAC_PIN, 1 থেকে (সময় একটি নির্ধারিত পরিমাণ অনুপাতে অপেক্ষা করুন কাঙ্ক্ষিত ম্লানির স্তর), এবং তারপরে TRIAC_PIN0 এ সেট করুন this এটি কি কাজ করবে?
রিনোগো

আমি প্রধান লুপ অনুমান আমিও লাইন পরিবর্তন করতে চান সেটি if(in==out) continue;থেকে if(out==0) continue;, ডান? আসলে, পাই এর জন্য প্রোগ্রামিংয়ে আমি সম্পূর্ণ নতুন, সুতরাং এটি সম্ভবত প্রয়োজন নয় - আমি অনুমান করছি যে এটি সব ঘটনাক্রমে ঘটছে (যেমন নেস্টেড লুপগুলি চালানো চলাকালীন আমাদের মূল লুপটি ডাকা হবে তা নিয়ে চিন্তা করতে হবে না)
রিনোগো

(এগুলি সবই উপরে বর্ণিত ইনমজো ডিমার মডিউলটি ব্যবহার করছে অবশ্যই: inmojo.com/store/inmojo-market/item/… )
রিনোগো

2
তাতে সমস্যা আছে is স্থিতিশীল সিস্টেমের ক্রিয়াকলাপের জন্য আপনি নিয়মিত সিস্টেমে নিয়ন্ত্রণ অর্জন করতে হবে এবং আমি সন্দেহ করি যে আপনি এটি 20 মিমি হিসাবে কম সময়ের মধ্যে পুনরুদ্ধার করতে পারবেন। সুতরাং, এই ফলনগুলি মিস করা ডালগুলিতে এবং ফলস্বরূপ, বাল্ব জ্বলবে। আমি সে সম্পর্কে একটি প্রশ্ন জিজ্ঞাসা করেছি কিন্তু কোন উত্তর পাইনি। সিস্টেম প্রাক-উত্সাহ সম্পূর্ণরূপে নিষ্ক্রিয় করতে আপনি সময়সূচি_আর্ট_রুনটাইম_স এবং সময়সূচি_আর্টি_পিওরওড_ইস উভয়ই সেট করতে পারেন, তবে আপনি যদি শিডিউলইয়েল্ড () বা ইউএসপ () মোটেও না করেন, তবে সমস্যা তৈরি হতে বাধ্য।
এসএফ

2
হয় যে: SCHED_FIFO সঙ্গে একবার আপনি একটি সময় ফালি শুরু, এটা নিরবচ্ছিন্নভাবে স্থায়ী হয় যতক্ষণ না আপনি স্বেচ্ছায় উত্পাদ (অথবা sched_rt_runtime_us অতিবাহিত হয়) কিন্তু সিস্টেম নিশ্চয়তা দেয় না যখন আপনি সেই সময় ফালি পেতে। আমার ক্ষেত্রে আমি সাধারণ ক্রিয়াকলাপে লক্ষ্য করেছি যে কলগুলির মধ্যে (সময়কে টুকরো টুকরো টুকরো দেওয়া) সর্বোচ্চ সিপিইউ লোড সহ 0.1 টি পর্যন্ত প্রসারিত হতে পারে। সম্ভবত সেই সময়টি সূক্ষ্ম সুরে এবং জোর করে খাটো করা যেতে পারে তবে কীভাবে তা আমি জানি না।
এসএফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.