C pælingar


Höfundur
axyne
Of mikill frítími
Póstar: 1794
Skráði sig: Fim 12. Jún 2003 17:16
Reputation: 82
Staðsetning: DK
Staða: Ótengdur

C pælingar

Pósturaf axyne » Sun 23. Sep 2012 19:12

Er að búa til PWM stýringu fyrir motor með að nota ATMEGA32, forritað í C.
Ég get breytt duty cycle á milli 0-250, en málið er að ég vill ekki alla þessa upplausn heldur bara 0-100 og gerði þennan kóða til að geta kallað í function-ið með 0-100 sem parameter.

Kóði: Velja allt

void setDutyCycle(unsigned char duty){

  if(duty>100){
    duty = 100;
  }

  if(duty>0){
    duty = duty*25/10;
  }

  OCR1A = duty;
}


Kóðinn virkar eftir sem ég veit best en það sem ég er að velda mér uppúr er að parameter-inn fyrir fallið er 8 bita sem ég margfalda síðan með 25, ætti ekki að vera overflow áður en ég deili með 10 ? eða reiknar cpu alla súpuna sem 16 bita áður en útkoman er assign-uð í duty?

Er eitthvað vitlaust að gera þetta svona, er opinn fyrir hugmyndum.


Electronic and Computer Engineer


Garri
1+1=10
Póstar: 1109
Skráði sig: Lau 31. Okt 2009 21:34
Reputation: 3
Staðsetning: Akureyri
Hafðu samband:
Staða: Ótengdur

Re: C pælingar

Pósturaf Garri » Sun 23. Sep 2012 19:23

Hvers vegna í ósköpunum ertu að nota Char sem inn parameter?

Er þetta php.. þar sem breytur geta verið char eina stundina og int næstu?

Notaðu integer sem breytu og þá virkar þetta þar sem integer er væntanlega 32bita breyta (signed 31 bita) eða 4 byte!

Fer reyndar eftir þýðanda en allir nýlegri þýðendur eru komnir í 32 bita með integer, eldri eru með 16 bita.

Mundi breyta þessu í fall, sirka svona:

Kóði: Velja allt

int Calc_Duty_Cycle (int i_duty)
{
  if (i_duty > 100)
     i_duty = 100;
  if (i_duty > 0)
     i_duty = round(2.55 * i_duty);  // reikna fastlega með að sviðið sé 0..255 en ekki 250 eins og þú reiknar með
  return i_duty;
}




Höfundur
axyne
Of mikill frítími
Póstar: 1794
Skráði sig: Fim 12. Jún 2003 17:16
Reputation: 82
Staðsetning: DK
Staða: Ótengdur

Re: C pælingar

Pósturaf axyne » Sun 23. Sep 2012 19:32

Er að forrita í 8 bita microcontroller í C, þar sem int er 16 bita.
Hvort sem ég hef char eða int sem paramter breytir eingu, þetta virkar.

Pælingin er/var afhverju þetta virkar :)

Gerði smá tilraunir áðan og komst að því að reikniaðgerðin (duty*25/10) er 16 bita signed. þannig ég eiginlega búinn að svara sjálfur mér.

edit: sviðið er 0-250 og vildi komast hjá því að nota floating því var búinn að heyra að atmega32 sé hægvirkur varðandi það.

takk samt.


Electronic and Computer Engineer


starionturbo
Gúrú
Póstar: 542
Skráði sig: Mán 24. Des 2007 11:23
Reputation: 8
Staðsetning: localhost
Staða: Ótengdur

Re: C pælingar

Pósturaf starionturbo » Fim 22. Nóv 2012 20:39

langaði að benda á að arduino er í grunninn C en samt ekki 100%, hann notar avr-gcc þýðandann. Þetta er meira byggt á Wiring.

Ég býst við að þú hafir fundið út lausnina við vandamálinu þínu :)


Foobar