【Follow me第二季第4期】Arduino Nano RP2040 Connect之GPIO与PWM控制
[复制链接]
前言:
本文讲述了使用Arduino IDE对RP2040进行编程时,GPIO与pinMode的对应关系,和使用PWM功能时的注意点。
需注意函数pinMode的入参序号与实际GPIO不对应;需注意通过函数analogWrite最多输出16种PWM占空比,且周期均为2ms。
上一贴说到RP2040在Arduino Nano上的GPIO分布:
【Follow me第二季第4期】Arduino Nano RP2040 Connect之GPIO控制 - DigiKey得捷技术专区 - 电子工程世界-论坛
感觉没有说透,因此专门梳理了下在Arduino IDE中如何使用RP2040 datasheet中提到的30个多功能IO。
首先,Arduino IDE对RP2040的GPIO序号进行了重新编号,所以在使用时一定要小心。
直接贴答案:
char level[30];
char count[30];
char gpiopin[] = {
1, 0, 20, 24, 12, 10, 13, 11, 25, 26, 27, 28, 18, 19, 29, 3, 4, 5, 6, 7, 8, 9, 22, 23, 21, 2, 14, 15, 16, 17
};
void setup() {
// put your setup code here, to run once:
for (char i = 0; i < 30; i++) {
pinMode(i, OUTPUT);
}
memset(level, 0, sizeof(level));
memset(count, 0, sizeof(count));
}
void loop() {
// put your main code here, to run repeatedly:
delay(1);
for (int i = 0; i < 30; i++) {
count[i]++;
if (count[i] > i) {
count[i] = 0;
level[i] ^= 1;
digitalWrite(gpiopin[i], level[i]);
}
}
}
以上这一段代码,演示了RP2040的30个IO分别输出不同的波形,IO0输出1ms的高电平,IO1输出2ms高电平,以此类推,IO29输出30ms高电平,可以通过示波器实际测量,来帮助我们从硬件上区分开。
因此结合RP2040的datasheet可以整理出对应关系,如下表格:
RP2040
pin number |
PWM |
RP2040 GPIO |
Arduino IDE
pinMode |
2 |
0 |
A |
GPIO0 |
1 |
3 |
B |
GPIO1 |
0 |
4 |
1 |
A |
GPIO2 |
20 |
5 |
B |
GPIO3 |
24 |
6 |
2 |
A |
GPIO4 |
12 |
7 |
B |
GPIO5 |
10 |
8 |
3 |
A |
GPIO6 |
13 |
9 |
B |
GPIO7 |
11 |
11 |
4 |
A |
GPIO8 |
25 |
12 |
B |
GPIO9 |
26 |
13 |
5 |
A |
GPIO10 |
27 |
14 |
B |
GPIO11 |
28 |
15 |
6 |
A |
GPIO12 |
18 |
16 |
B |
GPIO13 |
19 |
17 |
7 |
A |
GPIO14 |
29 |
18 |
B |
GPIO15 |
3 |
27 |
0 |
A |
GPIO16 |
4 |
28 |
B |
GPIO17 |
5 |
29 |
1 |
A |
GPIO18 |
6 |
30 |
B |
GPIO19 |
7 |
31 |
2 |
A |
GPIO20 |
8 |
32 |
B |
GPIO21 |
9 |
34 |
3 |
A |
GPIO22 |
22 |
35 |
B |
GPIO23 |
23 |
36 |
4 |
A |
GPIO24 |
21 |
37 |
B |
GPIO25 |
2 |
38 |
5 |
A |
GPIO26 |
14 |
39 |
B |
GPIO27 |
15 |
40 |
6 |
A |
GPIO28 |
16 |
41 |
B |
GPIO29 |
17 |
所以在Arduino IDE中对IO进行控制时,一定要认准实际的index。
表格中还对应了PWM,RP2040最多支持8个PWM通道,每个通道有2个输出引脚,所以这30个引脚,同一时间只能输出16种不同占空比的PWM波,且所有输出只能对应一种周期:2ms。
所以在通过Arduino IDE使用函数analogWrite时,假设操作完GPIO0为占空比30%后,又去操作了GPIO16为80%,由于这两个IO共用0A PWM,最后的结果是GPIO0和16均输出80%。
|