2016-09-15 56 views
0

我想在每次循環重複時選擇一個隨機的PWM引腳。 Arduino UNO中具有PWM功能的引腳是引腳:3,5,6,11,10,9。我試過rnd(),但它給了我一個範圍的線性值,和TrueRandom.Random(1,9)一樣。在Arduino中隨機選擇一個pwm引腳

回答

3

那麼,有至少兩種方式做到這一點。

第一種(也許是最好的)方式是將這些值加載到大小爲6的數組中,生成一個從零到五的數字,並從數組中的該位置獲取值。

換句話說,psedo代碼,例如:

values = [3, 5, 6, 9, 10, 11] 
num = values[randomInclusive(0..5)] 

在實際執行的是僞代碼方面,我想看看這樣的:

int getRandomPwmPin() { 
    static const int candidate[] = {3, 5, 6, 9, 10, 11}; 
    static const int count = sizeof(candidate)/sizeof(*candidate); 
    return candidate[TrueRandom.random(0, count)]; 
} 

有也是一種天真的做法,即在一定範圍內生成數字,並簡單地丟棄那些不符合規範的數字(即返回並獲得另一個數字)。這實際上是一種較差的方法,因爲在某些情況下可能需要更長時間才能獲得合適的號碼。從技術上講,如果沒有出現合適的值,它甚至可能會長時間地無限制地運行。

這將是沿(psedo碼)的行:

num = -1 // force entry into loop 
while num is not one of 3, 5, 6, 9, 10, 11: 
    num = randomInclusive(3..11) 

成爲:

int getRandomPwmPin() { 
    int value; 
    do { 
     value = TrueRandom.random(3, 12); 
    } while ((value == 4) || (value == 7) || (value == 8)); 
    return value; 
} 

如上所述,前一溶液可能是最好的一個。我僅包含後者僅供參考。


(一)是的,我知道。在足夠長的時間範圍內,統計數據幾乎可以確保您獲得有用的價值。不要成爲一個關於我的誇張的學者:-)

2

訣竅就是讓腳的列表,然後從列表中挑選隨機

入口
int pins[]={3,5,6,11,10,9} 

int choice = rnd() //in range 0-5 

pin = pins[choice] 

看到Generating random integer from a range得到的範圍內數