差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
mp_temp_gauge [2022/02/26 19:35]
gongyusu [5. 用PWM使LED衰减]
mp_temp_gauge [2022/02/26 21:29] (当前版本)
gongyusu [5. 用PWM使LED衰减]
行 191: 行 191:
  
 ### 5. 用PWM使LED衰减 ### 5. 用PWM使LED衰减
-[rpi_pico|Pico]]中的[[adc|模数转换器]]仅以一种方式工作:它将模拟信号转换为微控制器可以理解的数字信号。如果我们想通过数字微控制器得到一个模拟量输出,我们通常需要一个[[dac|数模转换器(DAC)]], 但一般的微控制器中没有内置的DAC,不过有一种方法可以“伪造”模拟信号,使用一种叫做[[pwm|脉宽调制或PWM]]的技术。+[[rpi_pico|Pico]]中的[[adc|模数转换器]]仅以一种方式工作:它将模拟信号转换为微控制器可以理解的数字信号。如果我们想通过数字微控制器得到一个模拟量输出,我们通常需要一个[[dac|数模转换器(DAC)]], 但一般的微控制器中没有内置的DAC,不过有一种方法可以“伪造”模拟信号,使用一种叫做[[pwm|脉宽调制或PWM]]的技术。
  
 [[mcu|微控制器]]的数字输出只能是0或1,打开和关闭数字输出称为脉冲,通过改变引脚打开和关闭的速度,我们可以改变或调制这些输出的脉冲宽度, 因此称之为“脉宽调制”。 [[mcu|微控制器]]的数字输出只能是0或1,打开和关闭数字输出称为脉冲,通过改变引脚打开和关闭的速度,我们可以改变或调制这些输出的脉冲宽度, 因此称之为“脉宽调制”。
  
 Pico上的每个[[GPIO]]引脚都能够进行脉宽调制,但RP2040微控制器的脉宽调制块由八个切片(slice)组成,每个切片有两个输出。看图 8-4:你会看到每个引脚都有一个字母和一个数字。数字代表连接到该引脚的PWM片;字母表示使用切片的哪个输出。 Pico上的每个[[GPIO]]引脚都能够进行脉宽调制,但RP2040微控制器的脉宽调制块由八个切片(slice)组成,每个切片有两个输出。看图 8-4:你会看到每个引脚都有一个字母和一个数字。数字代表连接到该引脚的PWM片;字母表示使用切片的哪个输出。
 +
 +{{ :​pico_pinout.png?​700 |}} <WRAP centeralign>​树莓派官方Pico模块的管脚定义 </​WRAP>​
  
 {{ :​rp2040_pwm.png |}} {{ :​rp2040_pwm.png |}}
行 202: 行 204:
 **PWM 冲突** **PWM 冲突**
  
-如果不小心使用了两次相同的PWM输出,您就会知道,因为每次更改一个引脚上的PWM值时,它也会影响冲突的引脚。 如果发生这种情况,请查看图8-4中的引脚排列图和的电路,并找到没有的PWM输出还没用+如果我们不小心使用了两次相同的PWM输出,每次更改一个引脚上的PWM值时,它也会影响冲突的引脚。 如果发生这种情况,请查看Pico管脚图中的引脚排列图和我们的电路,并找到我们还没有的PWM输出。
 </​WRAP>​ </​WRAP>​
  
-如果这听起来令人困惑,请不要担心:这意味着需要确保跟踪正在使用的PWM切片和输出,确保仅连接到带有字母和数字组合的引脚” t 已经使用。 如果在GP0针脚上使用PWM_A[0]并在针脚GP1上使用 PWM_B[0],则一切正常,如果脚GP2上添加PWM_A[1],则将继续工作; ​但是,如果尝试在引脚GP0和引脚GP16上使用PWM通道,则会遇到问题,因为它们都连接到PWM_A[0]。+是不是听起来很晕?不要担心:这意味着我们需要确保跟踪正在使用的PWM切片和输出,确保仅连接到带有字母和数字组合的引脚已经使用。如果我们在GP0针脚上使用PWM_A[0]并在针脚GP1上使用PWM_B[0],则一切正常,如果我们脚GP2上添加PWM_A[1],是没有问题的。但是,如果我们尝试在引脚GP0和引脚GP16上使用PWM通道,则会遇到问题,因为它们在芯片的内部都连接到PWM_A[0]。
  
-单击Thonny工具栏下方的选项卡,返回的第一个程序;如果已经关闭它,请单击“打开”图标并从的Pico加载Potentiometer.py。 ​在您将电位计设置为模数输入的位置下方,键入:+单击Thonny工具栏下方的选项卡,返回我们的第一个程序; 
 + 
 +如果已经关闭它,请单击“打开”图标并从我们的Pico加载Potentiometer.py。 ​ 
 + 
 +将电位计设置为模数输入的位置下方,键入:
  
 <code python> <code python>
行 214: 行 220:
  
 这会在引脚GP15上创建一个LED对象,但有一个区别:它激活引脚上的脉宽调制输出,通道B[7]——第八个切片的第二个输出,从零开始计数。 这会在引脚GP15上创建一个LED对象,但有一个区别:它激活引脚上的脉宽调制输出,通道B[7]——第八个切片的第二个输出,从零开始计数。
-还需要设置频率,可以更改以控制或调制脉冲宽度的两个值之一。 在读数下方立即添加另一行:+ 
 +我们还需要设置PWM的频率,是我们可以更改的,用以控制或调制脉冲宽度的两个值之一。 在读数下方立即添加另一行:
  
 <code python> <code python>
行 220: 行 227:
 </​code>​ </​code>​
  
-这将设置频率为1000赫兹 - 每秒一千个周期。 接下来,转到程序的底部并在添加以下内容之前删除 print(voltage)和utime.sleep(2)行,记住将其缩进个空格,使其成为循环中嵌套代码的一部分:+这将设置频率为1000赫兹 - 每秒一千个周期。 接下来,转到程序的底部并在添加以下内容之前删除print(voltage)和utime.sleep(2)行,记住将其缩进4个空格,使其成为循环中嵌套代码的一部分:
  
 <code python> <code python>
行 226: 行 233:
 </​code>​ </​code>​
  
-这条线从连接到电位计的模拟输入中获取原始读数,然后将其用作脉宽调制的第二个方面:占空比。占空比控制引脚的输出:0%的占空比使引脚在每秒1000个脉冲时关闭,并有效地关闭引脚; 100%的占空比使引脚在每秒1000个脉冲时都处于开启状态,并且在功能上等同于仅将引脚作为固定数字输出开启;占空比为50%时,引脚打开一半脉冲,关闭一半脉冲。 +这条线从连接到电位计的模拟输入中获取原始读数,然后将其用作脉宽调制的第二个参数:占空比。占空比控制引脚的输出:0%的占空比使引脚在每秒1000个脉冲时关闭,并有效地关闭引脚; 100%的占空比使引脚在每秒1000个脉冲时都处于开启状态,并且在功能上等同于仅将引脚作为固定数字输出开启;占空比为50%时,引脚打开一半脉冲,关闭一半脉冲。
-为了能够正确控制LED的亮度,您需要将模拟输入的值映射到PWM片可以理解的范围。执行此操作的最佳方法是告诉MicroPython您将占空比值作为无符号16位整数传递,与您从Pico的模拟输入引脚接收到的数字格式相同。这是通过使用led.duty_u16实现的+
  
-您完成的程序将如下所示:+为了能够正确控制[[LED]]的亮度,我们需要将模拟输入的值映射到PWM片可以理解的范围。执行此操作的最佳方法是告诉[[MicroPython]]我们将占空比值作为无符号16位整数传递,与我们从[[rpi_pico|Pico]]的模拟输入引脚接收到的数字格式相同。这是通过使用led.duty_u16实现的。 
 + 
 +最后的程序将如下所示:
  
 <code python> <code python>
行 241: 行 249:
 </​code>​ </​code>​
  
-单击“运行”图标并尝试将电位计一直转动到一个方向,然后再转动到另一个方向。 观察LED:这一次,除非使用对数电位器,否则会看到LED的亮度从电位器旋钮限制的一端完全关闭到另一端完全点亮。 +单击“运行”图标并尝试将电位计一直转动到一个方向,然后再转动到另一个方向。 ​ 
-恭喜:您不仅掌握了模拟输入,而且现在可以使用脉宽调制创建等效于模拟输出的内容!+ 
 +观察LED:这一次,除非我们使用对数电位器,否则我们会看到LED的亮度从电位器旋钮限制的一端完全关闭到另一端完全点亮。 
 + 
 +到此,我们不仅掌握了模拟输入,而且现在可以使用脉宽调制创建等效于模拟输出的内容!
  
 <WRAP center round tip 60%> <WRAP center round tip 60%>
行 248: 行 259:
  
 您能否结合您的两个程序,并通过车载温度传感器的温度读数来控制LED的亮度? 您还记得您的Pico有多少个模拟输入吗? PWM输出呢? 尝试在Pico中添加另一个模拟传感器——比如光敏电阻器(LDR)、气体传感器或气压计——并让你的程序读取它而不是电位计。 您能否结合您的两个程序,并通过车载温度传感器的温度读数来控制LED的亮度? 您还记得您的Pico有多少个模拟输入吗? PWM输出呢? 尝试在Pico中添加另一个模拟传感器——比如光敏电阻器(LDR)、气体传感器或气压计——并让你的程序读取它而不是电位计。
 +
 </​WRAP>​ </​WRAP>​