Arduino Uno yordamida 2,8 funtlik zarba aniqlash

Men ichiga o'rnatilgan zal sensori mavjud bo'lgan shahar mexanizmini bilish uchun loyihada ishlayapman. Men Arduino Uno R3-dan foydalanib dasturlashni boshladim. Forum qidiruvi va o'z-o'zim tekshiruvlarimdan keyin bu to'siqni o'tkaza olmayman. Umid qilamanki, bu erda savollarim to'g'ri bo'lishi mumkin.

Mening muammom: shahar motorli zali sensori har bir inqilob uchun 2,8 mo'm bo'lgan 11,3V - 13V 2 ta yuqori zarba yuboradi. Mening Arduino interrupt pinim yuqori pulsatsiyani o'qimaydi, chunki u menga "motor" aylanishidan so'ng "0" sonini beradi (men 50 döngüye koşuyorum va natijalar bir xil bo'ladi).

Interupt pin asssigment with function call

Arroino pin 2 5V ga (pastki 2,5 V bo'lishi kerak) kuchayib borayotgan kuchlanishni o'qish uchun maksimal 13V dan 5Vgacha zaryadga ta'sir kuchini kamaytirish uchun kuchaytirgichdan foydalanaman.

Dvigatellar davrida qayd etilgan narsalarimning bir nechasi -

a) millis() funktsiyasi sketch ishlashi uchun 79-81 mb qaytadi

b) Analog pinga ulangan bo'lsa, shu zali sensori chiqishi 580,590,590,1001, 1012, 580, 580 .. va hokazolarni o'qiydi. Men ushbu qadriyatlardan foydalanib, vosita o'rnini o'lchash imkoniyatiga ega emas, chunki ular Vsa yo'lida barqaror emas. pastga tushish.

Quyidagi rasmda yuqoriga va pastga qarab ketayotganda analog o'qishni qo'shdim: 2 ta savol bor:

    Nima uchun pin 2 yuqori yurak urishini aniqlay olmaydi? vosita tezligi (9,5 dev/s yoki 570 rpm) sababli 2.8 ms davomiyligi o'qiy olmaydi?

  1. Quarten o'qish funksiyasidan biron narsani o'lchash mumkinmi? Men nimadir etishmayapmanmi?

Barcha javoblar uchun oldindan tashakkur. Devredeki har qanday savollar, men ularni yuborishdan xursand bo'laman.

3
"(past bo'lgan 2.5V bo'lishi kerak)" Ma'lumot sahifasini hali o'qiganmisiz?
qo'shib qo'ydi muallif Ignacio Vazquez-Abrams, manba

5 javoblar

Birinchidan, barcha manba va sxemalarni yaxshi ko'rish.

"Nima uchun pin 2 aniqlanmaydi"

Tekshirish: 1. Zalga oid sensor 2-pinga ulangan

  1. pulslar o'zgaruvchisi uchuvchi deb e'lon qilingan.

  2. Ichki zichlik sezgichini o'rnatish uchun zali sensori bilan bog'langanligini tekshiring.

  3. Hall sensori eng past signal kuchlanishining 0,3 VCK dan pastligini tekshiring (siz 5V deb aytdingiz, shuning uchun u 1,5Vdan pastga tushishi kerak), BTW 580 - siz ko'rsatgan eng past analog qiymat - 2.83V
  4. Kesintisiz foydalanib emasligingizni tekshiring ();

"Analog o'qish funktsiyasidan biron narsani o'lchash mumkinmi?"

Ha. Analog o'qish standart sozlamada taxminan 0.1 milodiy davom etadi, shuning uchun yig'ilishni olish uchun soniyada kamida 1000 o'qish kerak.

Shunday qilib, Eng oson yo'li 600 kabi ba'zi bir qiymatni tanlash, analog o'qish esa, yuqoridagi belgisi pastga tushganda Rising deb belgilash yuqorida ko'rsatilgan bo'lsa Falling. Yana murakkab usullar aniqlanishni yaxshilash uchun ba'zi treyner va histerezlarni o'z ichiga oladi.

Bundan tashqari, kuchlanishni ajratuvchi o'rniga kuchlanish cheklovchisini ishlatishni tavsiya qilaman. Bu yaxshi aniqlash imkonini beradi.

5
qo'shib qo'ydi
Eng yaxshi usuli, bu yerdagi vazifalarni tugma bilan Hall sensorini o'zgartirish o'rnini sinash.
qo'shib qo'ydi muallif Touko, manba
tugma bilan arduino bilan pulslar o'zgaruvchilari bo'lmasa, muammo arduino ichida (sketch kodi, portni o'rnatish yoki ichki diagramma), aks holda u tashqarida. Yaxshiyamki, ikkala Nik bilan ham rozi bo'ldim, butun eskiz kodini taqdim etish foydali bo'lardi.
qo'shib qo'ydi muallif Touko, manba
1,2, 5 belgilanadi. Qolganlarini tekshiraman.
qo'shib qo'ydi muallif sds, manba
@ all: Lab shukronalar uchun yopiq. Dushanba kuniga kod va boshqa narsalarga javob beradi
qo'shib qo'ydi muallif sds, manba

Hammasi,

Kodi:

int flag = 1;
int speedo = 255;
          int counter =0; //counts the number of revolutions
          int timeu=0;
          int timed=0;
          int Voltmeasure=0;
          int times=0;
          volatile unsigned int pulses=0; //pulse counter
          bool upcount=false;
          bool downcount=false;
          unsigned int timeold=0;
          int difference=0;

          void count()
          {
            if(upcount==true)
              pulses++;
              else if (downcount==true)
               pulses--;
          }

          void setup() 
          {
           //initialize serial communication:
            Serial.begin(9600);
            pinMode(11,OUTPUT);
            pinMode(12,OUTPUT);
            pinMode(13,OUTPUT);
            pinMode(2, INPUT);
            pinMode(3, INPUT);
            attachInterrupt(digitalPinToInterrupt(2),count, RISING);
          }
          void stopmotor()
          {
            digitalWrite(12,HIGH);
            digitalWrite(13,HIGH);
          }
          void motorCCW()
          {
            analogWrite(11,speedo);
            digitalWrite(12,HIGH);
            digitalWrite(13,LOW); 
          }
          void motorCW()
          {
            analogWrite(11,speedo); 
            digitalWrite(12,LOW);
            digitalWrite(13,HIGH);
          }

          void loop() 
          {  
              if(flag==1)
              {
                delay(2000); //wait for 2 seconds to start motor
                flag=2;
              }

            //first run motor moves down
                if (counter<16 && flag==2)
                {
                  motorCW(); //moving up

                  //Reading Hall-sensor pulses- using analog signal
                  Voltmeasure = analogRead(A3);
                  Serial.print("CW Voltmeasure = ");
                  Serial.print(Voltmeasure);
                  Serial.println();

                  //Reading Hall-sensor pulses - using interuppt signal
                  upcount=true;

                  //counting the number of high pulse
                  if (Voltmeasure>700 && times==0)
                  {
                    counter++; times=1;
                  }
                  else if (Voltmeasure<610)
                    times=0;  

                  //timer for number of loops
                  timeu++;
                  Voltmeasure=0;

                  if (timeu==70||counter==16) //move by 70 cycles or until counter is 16
                  {
                    stopmotor();
                    upcount=false;
                    timeu=0;
                    times=0;
                    Serial.print("High-point is reached - Travel complete");
                    Serial.println();
                    delay(2000); //delay by 2 seconds
                    flag=3;
                  }
                }

                if (counter>0 && flag==3)
                {
                  delay(2000); //pause before next run
                  motorCCW();

                  //Reading Hall-sensor pulses - using analog signal
                  Voltmeasure = analogRead(A3);
                  Serial.print("CCW Voltmeasure = ");
                  Serial.print(Voltmeasure);
                  Serial.println();

                  //Reading Hall-sensor pulses - using interuppt signal
                  downcount=true; 

                 //counting the number of high pulse
                  if (Voltmeasure>700)
                  {
                    counter--; times=1;
                  }
                  else if (Voltmeasure<610)
                    times=0;   
                  timed++;
                  Voltmeasure=0;

                  if (timed==70||counter==0) //move by 70 cycles or until counter is 0
                  {
                    stopmotor();
                    downcount=false;
                    timed=0;
                    times=0;
                    Serial.print("Lowest point is reached - Travel complete");
                    Serial.println();
                    flag=3;//stop motor 
                  }
                 }

         // difference=millis()-timeold;
         // timeold = millis();
         // 
         // //Printing information after line complete
         // Serial.print("time for one sketch = ");
         // Serial.print(difference);
         // Serial.println();

            Serial.print("Counter = ");
            Serial.print(counter);
            Serial.println();

            Serial.print("pulses = ");
            Serial.print(pulses);
            Serial.println();


          }

Umumiy blok diagrammasi

enter image description here

Zalni sensori bilan motor, Va 13V, Ue 13,5V:

enter image description here

Hisoblagichni (Analog pin) va pulslarni (interrupt pin) ushbu dastur kodini ishlatish bilan chop qilaman.

Analog pin quyidagilarni o'qiydi:

CW Voltmeasure = 574

CW Voltmeasure = 588

CW Voltmeasure = 1000

CW Voltmeasure = 999

CW Voltmeasure = 998

CW Voltmeasure = 1002

CW Voltmeasure = 1002

CW Voltmeasure = 589

CW Voltmeasure = 588

CW Voltmeasure = 590

CW Voltmeasure = 588

CW Voltmeasure = 1000 ...... Bu vaqtga kelib vosita aylanishi 6,5 rev (o'tgan vaqtga qarab), lekin taymer faqat @ 3 (3 yuqori)

Pulslar 0 .......

This is where i am at. Not able to understand Analog readings dont match the number of revs with the highs & why interupt pin reads 0......

0
qo'shib qo'ydi
Pim 2 ga ulanishni to'xtatish uchun 1,5V dan past bo'lishi kerak
qo'shib qo'ydi muallif Touko, manba
Ha, to'g'ri ko'rinadi. step = 0 ni stopMotor ga qo'yishni unutmang.
qo'shib qo'ydi muallif Touko, manba
Tugmasi haqida. Pleyt 2 va GND o'rtasidagi qarshilik bilan parallel ravishda tugmani qo'yganingizdan so'ng, siz Hall sensorini to'g'ri bog'langan kabi taqlid qilishingiz mumkin.
qo'shib qo'ydi muallif Touko, manba
upcount/downcount hajmida qoldirilgan voliatile ISR ishlamaydi. Bundan tashqari, quyidagilarni yozing: 1. upcount/downcount o'zgaruvchi int8_t step = 0; 2. void count() {pulslar + = qadam; } 3. MotorCW/motorCCW ichida qadam = 1 va qadam = -1 harakatlantiring
qo'shib qo'ydi muallif Touko, manba
Tushunarli. Siz tugma bilan test qildingizmi?
qo'shib qo'ydi muallif Touko, manba
Zalni past bo'lishiga qaramay, 5V bo'linmasida kuchlanishni so'ragan edim
qo'shib qo'ydi muallif Touko, manba
Va bu uzilishni boshlash uchun etarli emas.
qo'shib qo'ydi muallif Touko, manba
2. Sensor yoqilganida qaysi 5.01 voltmetr ko'rsatiladi? Jurnallarga ko'ra, bu taxminan 2,8 V bo'lishi kerak
qo'shib qo'ydi muallif Touko, manba
1. ketma-ket bosib chiqarish biroz vaqt talab qiladi. Sizning tezligingizga ko'ra, 1 belgisi taxminan 1 milodiyni tashkil qiladi, shuning uchun ketma-ket "CW Voltmeasure =" yuborilishi 16 ms ga (ketma-ket tampon to'ldirilganda) bir zarba missiyasini o'tkazib yuborishi mumkin.
qo'shib qo'ydi muallif Touko, manba
MotorCW() va motorCCW() ga qo'shildim va siz aytganidek, hisoblash funktsiyasini o'zgartirdi. Men to'g'rimi?
qo'shib qo'ydi muallif sds, manba
Yordamchi bolalarmi? Har qanday savol?
qo'shib qo'ydi muallif sds, manba
Andrey, hali o'qimaydi. Men 1,456 V balandlikda va kamida 1.07V kuchlanishli bo'luvchi orqali olaman ... pulslar 0 turadi ....
qo'shib qo'ydi muallif sds, manba
Yaxshilaydi ... Ha, men vositani to'xtatish uchun qo'shildim. Buni ishlatib, fikr bildiraman
qo'shib qo'ydi muallif sds, manba
Interrupt pin uchun yana nimalar talab qilinadi?
qo'shib qo'ydi muallif sds, manba
uchuvchi int8_t qadamlar = 0; void count() {pulslar + = qadamlar; } void setup() {// ketma-ket aloqa o'rnatish: Serial.begin (9600); pinMode (11, OUTPUT); pinMode (12, OUTPUT); pinMode (13, OUTPUT); pinMode (2, INPUT); attachInterrupt (0, hisoblash, RISING); } void stopmotor() {DigitalWrite (12, past); digitalWrite (13, past); } void motorCCW() {analogWrite (11, speedo); digitalWrite (12, yuqori); digitalWrite (13, past); qadamlar = -1; } void motorCW() {analogWrite (11, speedo); digitalWrite (12, past); digitalWrite (13, yuqori); qadamlar = 1; }
qo'shib qo'ydi muallif sds, manba
OK, OK .. Menga boshqa kuchlanishni taqsimlovchi qismni 1,5 V ga etkazish kerak. Rahmat!
qo'shib qo'ydi muallif sds, manba
Hali emas. Lekin bu qanday yordam berishiga amin emasman.
qo'shib qo'ydi muallif sds, manba
past darajada 2.82 V o'lchaganini ko'radi
qo'shib qo'ydi muallif sds, manba
Andrey, siz sensorli sensor va 5.01V nuqtalar o'rtasidagi bog'lanishni almashtirishni so'raysizmi?
qo'shib qo'ydi muallif sds, manba
Bundan tashqari, men CW voltmaasures-ni faqat muammoni tushuntirish uchun chop etyapman, boshqacha usulda ularni sharhlayman.
qo'shib qo'ydi muallif sds, manba

Ignabargichlarni to'xtatish uchun kuchlanishlarni o'zgartirmoqchi bo'ldim

Endilikda ixtiyoriy keskinliklarni o'qing: Oliy: 1.456V Kam: 1.07V

Eslatma: Arduino 12V tashqi manbada ishlaydi.

Mening "zarbalarim" hisoblagichi to'xtatish uchun 0 o'qiydi. Har qanday fikr nima uchun?

0
qo'shib qo'ydi

Hammasi,

Mening Arduino interrupt pinidagi interruptlarni o'qimaydi:

Men 1 456V va 1.07V pastligi bilan chiqib ketish pinini 2 ga tushiraman ... Biroq, pulslar hisoblagichi hali ham qoladi ....

Har qanday fikr nima uchun?

  volatile unsigned int pulses=0; //pulse counter
  volatile int8_t steps=0;
  int timeu=0;
  int flag=2;

  void count()
  {
    pulses++;
  }

  void setup() 
  {
   //initialize serial communication:
    Serial.begin(9600);
    pinMode(11,OUTPUT);
    pinMode(12,OUTPUT);
    pinMode(13,OUTPUT);
    pinMode(2,INPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(2),count,RISING);

  }

  void stopmotor()
  {
    digitalWrite(12,LOW);
    digitalWrite(13,LOW);
    steps=0;
  }
  void motorCCW()
  {
    analogWrite(11,255);
    digitalWrite(12,HIGH);
    digitalWrite(13,LOW); 
    steps=-1;
  }
  void motorCW()
  {
    analogWrite(11,255); 
    digitalWrite(12,LOW);
    digitalWrite(13,HIGH);
    steps=1;
  }

  void loop() 
  {  

    if (timeu<=1000)//First time - Going up
    { 
        sei();
        motorCW(); //moving up
        flag=8;
        timeu++;
      } 
    else if (timeu==1000)
      {
          flag=10;
          stopmotor();
          cli();
          //Serial.print("Completed time cycle of 50");

      }



  if (flag==10)
  {
    Serial.print("pulses = ");
    Serial.print(pulses);
    Serial.println();


  }



  }
0
qo'shib qo'ydi
Uzatish raqamli kirish pinining ko'tarilgan tomoni bilan boshlanadi, bu erda 0V LOW va 5V yuqori. Bo'shliq voltaji 2,5V atrofida bo'ladi. Bu ko'tarilayotgan analog signalni qidirishni emas, balki butunlay to'la-to'kis davlatga o'tishni ko'zda tutmaydi. Agar siz Hall Effect sensorining chiqishini Raqamli LOW/HIGH signaliga aylantirmoqchi bo'lsangiz, siz taqqoslash vositasidan foydalanishingiz mumkin (OpAmps bularning barchasi yaxshi.)
qo'shib qo'ydi muallif Tarski, manba
Ha, men ushbu kuchlanish oralig'ida taqqoslash vositasidan yaxshi foydalanish uchun rozilik beraman. Dvigatel va sensor uchun ma'lumotlar varaqchasi bormi?
qo'shib qo'ydi muallif Touko, manba
Ma'lumki, siz Hall sensori chiqishi magnit va boshqa vaqtlarda (yoki aksincha) 0V yaqinligini tekshiring. Buni tekshiring: http://arduino.stackexchange.com/questions/13126/best-way-to-protect raqamli PIN-kodni ortiqcha kuchlanishdan qanday himoya qilishni ko'rish uchun "-A-raqamli yoki analog-kiritish-dan-12volts"> javob bering.
qo'shib qo'ydi muallif Touko, manba
Menimcha, muammolar Hall sensor aloqasi noto'g'ri yoki sizning kuchlanish bo'linmalari bir-biriga aralashadi.
qo'shib qo'ydi muallif Touko, manba
ha, Xose to'g'ri, 5V manbai uchun, atmel belgilarga ko'ra, past kuchlanish 3.5V dan yuqori bo'lgan paytda past kuchlanish darajasiga o'tadi va kuchlanish 1,5 V
qo'shib qo'ydi muallif Touko, manba
Zal sezgichidagi chiqish quyidagicha: past zarba uchun: 7.7V - 8.8V, yuqori zarba uchun: 11.3V - 13.3V. Andreyning fikr-mulohazasidan mening tushunishim 1,5Vdan past bo'lishi kerak edi. Mening kuchlanishli bo'linmanim yaxshi ishlaydi, chunki men zarur kuchlanishni moslash uchun rezistorlarni o'zgartirdim. Xulosa qilib aytganda, Xosening ishni bajarish uchun taqqoslash bo'yicha tavsiyasi bilan borish yaxshiroq deb o'ylayman.
qo'shib qo'ydi muallif sds, manba

Hammasi,

Oxir-oqibat kuchlanish taqqoslagichiga ehtiyoj sezmadim, kodning sekinroq ishlayotgani va datchikning vaqtini hisobga olgan holda vosita berayotgan barcha sensorli signal signallarini olmaganligi. Men ifs ni boshqasiga o'zgartirdim va keyinchalik tezroq pastadir vaqtini topdim.

Yordam uchun barchangizga rahmat.

Qurilma mo'ljallangan joyda ishlaydi.

0
qo'shib qo'ydi