|
發表於 2012年12月20日 11:01 AM
|
顯示全部樓層
原帖由 suvsuvsuv 於 2012年12月20日 08:35 AM 發表
v2.1跟v2.0最大的改动就是取消了直接读取adc1的值的方式,只允许通过DMA获取adc,在ADC_Init()初始阶段还是直接读取adc,但是最后会启动DMA ...
其實,原本我只是想試著從 ADC-16讀出 STM32的內部溫度值, 對照 datasheet (文件DS5792) 看是否吻合, 結果每次都讀出 "1".
我有發現這段程式碼:
//Build a RNG seed using ADC 14, 16, 17
u32 seed = 0;
for(int i = 0; i < 8; i++) {
seed = seed << 4 | ((ADC1_Read(16) & 0x03) << 2) | (ADC1_Read(17) & 0x03); //Get 2bits of RNG from Temp and Vref
seed ^= ADC1_Read(14) << i; //Get a couple more random bits from Voltage sensor
}
printf("RNG Seed: %08x\n", (int)seed);
srand(seed);
原本, 我還認為此段程式碼無用可以刪除, 但搜尋所有程式碼中的 rand()後發現, srand() "似乎"是做為亂數的 種子(seed)之用.
因此, 我猜測是: (以下(1) (2)僅是我的猜測,我還沒驗證程式碼)
(1) 先以 ADC 14, 16, 17的 noise , 讓 srand()產生一段亂數值捨棄不用, 每台DEVO遙控器每次開機捨棄數量都不固定.
(2) 自動對ID(非固定ID)時 , 再用rand() 亂數 以便隨機產生ID.
(補充) 剛才 查了程式碼.........
(3) 不是 自動對ID 之用, 應是隨機選擇 "跳頻"使用.
當然, ADC-16固定輸出"1"也不會影響 DEVO遙控器使用, 因為還有 ADC-14(電池電壓) 及 ADC-17(Vrefint, 於CD00171190文件)參與計算.
後來, 我加了 "adc_enable_temperature_sensor(ADC1);" 後確實將ADC-16通過UART1讀出並計算成攝氏溫度(就是於"超級終端"的附圖).
參考文件:
DS5792: STM32F103xC High-density performance line ARM-based 32-bit MCU with 256 to 512KB Flash, USB, CAN, 11 timers, 3 ADCs, 13 communication interfaces
CD00171190: STM32F103xx_advanced ARM-based 32-bit MCUs
=========================================================
另, 之前我拆機時還以為這個是 製程上的瑕疵(SMT soldering short), 後來對照datasheet才知道 Vref+/- 即為VDD/GND.
也因此理解: 電池電壓計算(tx_voltage.c : PWR_ReadVoltage) 會是"v = v * 324 / 100 + 421;"
Vbattery(or DC)= ADC-14 * (3.3v/4096) * (電阻分壓:1M-ohm+330K-ohm)/(330K-ohm) + Diode壓降
[ 本帖最後由 hmjack2008 於 2012年12月20日 04:48 PM 編輯 ] |
-
|