在Arduino中选择一个随机的pwm引脚

时间:2016-09-15 04:58:53

标签: c++ c arduino

每次循环重复时,我想选择一个随机的PWM引脚。在Arduino UNO中具有PWM功能的引脚是引脚:3,5,6,11,10,9。我尝试了rnd()但它给了我一个范围的线性值,与TrueRandom.Random(1,9)相同。

2 个答案:

答案 0 :(得分:3)

嗯,至少有两种方法可以做到。

第一种(可能是最好的)方法是将这些值加载到大小为6的数组中,生成0到5范围内的数字,并从数组中的该位置获取值。

换句话说,psedo-code如:

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)];
}

还有一种天真的方式,即在一个范围内生成数字,然后丢弃那些不符合您规范的数字(即,返回并获得另一个)。这实际上是一种较差的方法,因为在某些情况下获得合适的数字可能需要更长的时间。从技术上讲,如果没有出现合适的值,它甚至可以长时间无限地(a)

这将是(psedo-code):

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;
}

如前所述,前一种解决方案可能是最好的解决方案。我将后者仅用于提供信息。

(a)是的,我知道。在足够长的时间框架内,统计数据几乎可以保证您获得有用的价值。不要再说我的夸张了: - )

答案 1 :(得分: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以获取范围内的数字