會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客



« 1 (2) 3 »


Re: C32除法的問題
資深會員
註冊日期:
2006/02/28 15:27
來自 星星的你
所屬群組:
註冊會員
文章: 740
等級: 24; EXP: 62
HP : 0 / 590
MP : 246 / 21495
離線
引用:

Beee 寫道:


[b] +1[/b]

     
WORD dw = 1.0 / 0.001 ;    //[color=ff0000] 故意用WORD去裝float的資料[/color]

  
...   追殺 biko 好好玩



Be^3
想釘偶~~~
小心…你屁股上的刺我會把它釘在二魚的蛋蛋上

2011/11/15 19:51
轉換PDF檔 列印


Re: C32除法的問題
資深會員
註冊日期:
2004/05/19 03:43
來自 台灣
所屬群組:
註冊會員
文章: 1749
等級: 35; EXP: 10
HP : 0 / 852
MP : 583 / 35470
離線

什麼二魚
? 是鱷魚啦 .....

  
你不怕 懶羊羊 被生]活吃的話 , 趕快去ㄚ



  你很奇怪ㄟ
,  明知是很`用的 轉換]子, 直接給它]一個`數就好了, 幹嘛還要搞這有的沒的

2011/11/15 20:12
轉換PDF檔 列印


Re: C32除法的問題
資深會員
註冊日期:
2006/02/28 15:27
來自 星星的你
所屬群組:
註冊會員
文章: 740
等級: 24; EXP: 62
HP : 0 / 590
MP : 246 / 21495
離線
引用:

Beee 寫道:

什麼二魚
? 是鱷魚啦 .....

  
你不怕 懶羊羊 被生]活吃的話 , 趕快去ㄚ



  你很奇怪ㄟ
,  明知是很`用的 轉換]子, 直接給它]一個`數就好了, 幹嘛還要搞這有的沒的 [color=990000]//<<----------疑?又釘偶= =+[/color]




沒啦…這個轉換因子會依使用者而改變,因為這個光學編碼器是抓伺服馬達控制器的Encoder訊號,如果使用者要改成每個PULSE = 0.0001mm,那麼MCU上的這個設定也要跟著變,為了讓笨笨的使用者比較好了解,我只好將這個設定描述成『每個pulse會產生多少位移量』來讓使用者設定。
使用者設定完後,我再用軟體轉成MCU內部使用的轉換因子,沒想到這樣做爽著使用者,但是堅苦到偶><"

P.S.鱷魚的鱷很難拆捏…當然要跳過咩~~

2011/11/16 15:10
轉換PDF檔 列印


Re: C32除法的問題
資深會員
註冊日期:
2004/05/19 03:43
來自 台灣
所屬群組:
註冊會員
文章: 1749
等級: 35; EXP: 10
HP : 0 / 852
MP : 583 / 35470
離線

如果結果是WORD
, 那表示@定是 整數

  那不能用 LONG LONG INT
,用個@千萬來被除 , 最後再除以 @千萬 ? ?

2011/11/16 15:32
轉換PDF檔 列印


Re: C32除法的問題
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 991
等級: 27; EXP: 89
HP : 0 / 672
MP : 330 / 21988
離線
本來只是想寫一下,大家常遇到的ADC轉換用到浮點數問題....
其實用整數運算,也可來代替"浮點數"運算的方法

沒想到....寫著寫著...最後連C code公式,都導出來了...

Vref+ = Vdd = 5V
#define adc2volt(n) ( n* 5 - (n*30+128)/256)
#define adc2volt(n) ( n* 4 - (n*226L+128)/256)


Vref+ = Vdd = 3.3V
#define adc2volt(n) ( n* 4 - (n*199L+128)/256)
#define adc2volt(n) ( n* 3 - (n*57+128)/256)

兩個公式答案都一樣(參考附圖),但記得自己選沒有L
(long型別轉換),這樣運算速度應該會比較快

註: 這堨堳e以10bits ADC為預設(n = 0 ~ 1023)
Vref- = 0V

===================================================

adc2volt轉出的值是mV
: Vref+ = 5V
    volt
= adc2volt(n);
    
adc的n值為512時,adc2volt轉出得volt = 2500 (mV)
   
如果要輸出 2.500V

則必須 整數iV
= volt /1000;
      
小數mV = volt % 1000;
  
然後自己再[ "." (小數點)輸出至LCD或RS232

附加檔案:



jpg  adc2volt_3.3V.jpg (204.80 KB)
3491_4ec3d6548cd18.jpg 770X657 px

jpg  adc2volt_5V.jpg (202.29 KB)
3491_4ec3d69345651.jpg 775X649 px

2011/11/16 23:30
轉換PDF檔 列印


Re: C32除法的問題
資深會員
註冊日期:
2004/05/19 03:43
來自 台灣
所屬群組:
註冊會員
文章: 1749
等級: 35; EXP: 10
HP : 0 / 852
MP : 583 / 35470
離線

J大
, 謝啦 ....  很簡易又明暸的 巨集(MACRO) 示範

   不好意思
, 把你的美意扯到別的地方去了 ...   :-D


2011/11/17 03:34
轉換PDF檔 列印


Re: C32除法的問題
資深會員
註冊日期:
2004/07/23 16:25
所屬群組:
註冊會員
文章: 1180
等級: 29; EXP: 96
HP : 0 / 724
MP : 393 / 29770
離線
常數定義,讓數值具有可讀性並沒有錯

有問題的應該是常數的處理,你是在 compiler 還是 preprocessor 處理

如果你用

#define pulse_const (1.0/0.001)

#define pulse_const 1000 ;(1.0/0.001)

之後再
WORD dw =pulse_const

結果應該就會不一樣 另一點,1000 和 999 ,相差也才 0.1% ,你會覺得差很大是因為 1.0/0.001 心算就知道是整數

如果今天是 ( 2.57/0.021) 出來的是 121 122 或 123
你怎麼解讀對或錯?

重點在於數值的合理範圍 及單位大小

(1.0/0.001) 這是一般人單位受限於 整數、小數的習慣

如果我來寫,會變成 1000/1 ,整個思考單位變成 0.001 為一個單位而不是 1 整數 ,思考單位的不一樣,反應出來的就是數值的合理性及程式的大小及操作速度。

數值範圍反應在 這個例子更是顯著
Vref+ = Vdd = 5V
#define adc2volt(n) ( n* 5 - (n*30+128)/256)
#define adc2volt(n) ( n* 4 - (n*226L+128)/256)

Vref+ = Vdd = 3.3V
#define adc2volt(n) ( n* 4 - (n*199L+128)/256)
#define adc2volt(n) ( n* 3 - (n*57+128)/256)

這種寫法上更是常見
一般的 adc2volt
#define adc2volt(adc) (adc /1024*5.0*100)
#define adc2volt(adc) (adc /1024*3.3*100)

我來寫會變成
#define adc2volt(adc) ((adc*0x7d) >>8)
#define adc2volt(adc) ((adc*0xA5) >>9)

單單float 乘除法和 char 乘法+位移,速度和空間兩者相差數千倍

當然,系統loading 不大,不會被 code review,你要怎麼寫是沒差

但是追求卓越時,換個思考方式,過程會大大的不同(雖然結果會很接近)

(正確的計算應該是/1023 而不是/1024,但是如果你用 excle 驗證,

你會發現兩者顯示到小數後兩位,結果是一樣的)

有心,我會建議去讀讀 misra C 的規範,一百多條不會很多

2011/11/17 08:41

Eigen 於 2011年11月17日 09:22:34
轉換PDF檔 列印


Re: C32除法的問題
資深會員
註冊日期:
2007/08/17 11:15
所屬群組:
註冊會員
文章: 495
等級: 20; EXP: 56
HP : 0 / 489
MP : 165 / 15710
離線
大家好:
我不懂J大的公式?
//
Vref+ = Vdd = 5V
#define adc2volt(n) ( n* 5 - (n*30+128)/256)
#define adc2volt(n) ( n* 4 - (n*226L+128)/256)
//
n*5及n*4的意義?
n*30及n*226L的意義?
//
#define adc2volt(n) ( n* 5 - (n*30+128)/256)
設n=1
step 1:
w=(n*30+128)=158
step 2:
x=w/256=158/256=0.6171875
step 3:
y=(n*5-x)=5-0.6171875=4.3828125(不等於4.882813)
//
煩請解說.
Thank you.

2011/11/17 10:17
轉換PDF檔 列印


Re: C32除法的問題
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 991
等級: 27; EXP: 89
HP : 0 / 672
MP : 330 / 21988
離線
引用:

jlian 寫道:
大家好:
我不懂J大的公式?
...
x=w/256=158/256=0.6171875
...
//
煩請解說.
Thank you.


jlian 你跳tone了...

這婸〞漪O"整數"運算也.....你又把浮點數拿出來....

那就!@#$%^&*()....

回頭看一下附圖吧!!!

註: +128是為了四捨五入....

2011/11/17 10:30
轉換PDF檔 列印


Re: C32除法的問題
資深會員
註冊日期:
2004/05/19 03:43
來自 台灣
所屬群組:
註冊會員
文章: 1749
等級: 35; EXP: 10
HP : 0 / 852
MP : 583 / 35470
離線

To
: jlian

  C 如果未事先定義為float
, 或在 數字後[小數點, 基本上都是以整數來運算 :

  
而 這些式子 :
    
#define adc2volt(n) ( n* 5 - (n*30+128)/256)
    #define adc2volt(n) ( n* 4 - (n*226L+128)/256)
           //  運算中,如有小數位產生, 要先 無條件捨去


  
是為了在 5V 的 MCU系統裡, 將A/D 所取得的值0~1023(0 ~ 0x3ff),轉成電壓值0~5000mV

  就是要取代  V
= ( n * ( 5000 / 1023 ))  //  mV 單位(浮點運算,很浪費MCU運算時間)

2011/11/17 11:28
轉換PDF檔 列印



« 1 (2) 3 »



無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project