MicroPython内核开发笔记书内软件用例 :第五章-基本PIN输入输出功能

简 介: 本文给出了 MicroPython内核开发笔记:书内嵌入实验任务 中的关于单片机端口软件用例部分内容。

关键词 输入输出MicroPythonPinMM32F3277

书稿内容
目 录
Contents
PIN输出实验
PIN输入实验
总 结
改进建议

软件用例: PIN模块提供的基本端口输入输出功能。
这部分书稿内容包括有:

  1. 输出实验:
  2. 输入实验:
  • 书稿内位置:

§01 稿内容


利用模块 Pin 可以将单片机的 IO 端口配置成输入、输出、附加功能等模式。基本使用语法为:

led = Pin('PB2', mode=Pin.OUT_PUSHPULL)

上面语句将单片机 PB2 管脚配置成推挽输出管脚,并定义为变量 led 。其中 Pin 的第一个参数为单片机管脚命名字符串,第二个参数为管脚模式。可以使用的管脚输出模式包括:

【表1-1 管脚模式一栏表格】

序号 模式名称 功能描述
1 IN_ANALOG 作为 AD 模拟量输入端口
2 IN_FLOATING 高阻输入端口
3 IN_PULLDOWN 带有下拉电阻输入端口
4 IN_PULLUP 带有上拉电阻输入端口
5 OUT_OPENDRAIN 漏极开路输出端口
6 OUT_PUSHPULL 推挽输出端口
7 AF_OPENDRAIN 漏极开路附加功能端口
8 AF_PUSHPULL 推挽输出附加功能端口

设置输出管脚高低电平有以下几种方法,以 led 端口为例。

  • 设置高电平:led(1),led.on(),led.value(1)
  • 设置低电平:led(0),led.off(),led.value(1)

读取端口逻辑电平的方法有以下几种,以 led 端口为例。

扫描二维码关注公众号,回复: 14342355 查看本文章
key = Pin("PC1", Pin.IN_PULLUP)
print(key.value())
print(key())

一、PIN输出实验

1、LED闪烁实验

单片机的 IO 端口驱动外部 LED 有两种模式:

  • 输出电流驱动模式;
  • 输入电流驱动模式;

在下面实验中使用的是输出电流驱动模式完成对外部LED驱动。
▲ 图1.1.1 单片机驱动LED两种模式左:输出电流驱动模式;右:输入电流驱动模式

▲ 图1.1.1 单片机驱动LED两种模式
左:输出电流驱动模式;右:输入电流驱动模式

利用 Pin 控制单片机管脚高低电平,驱动外部 LED 闪烁。实验硬件平台是简易实验板,其中 PB2 连接外部 LED。 高电平点亮,低电平熄灭。

实验软件代码如下:

from machine        import Pin

def delay(loop=10000):
    for _ in range(loop):
        pass

led = Pin('PB2', mode=Pin.OUT_PUSHPULL)

print('Test LED.')

while True:
    led(1)
    delay(50000)
    led(0)
    delay(50000)

软件中,首先将 PB2 定义成 输出管脚,模式为推挽输出。当它为高电平时,可以输出电流点亮LED。 管脚输出包括两种模式:

  • OUT_PUSHPULL:推挽模式;
  • OUT_OPENDRAIN:漏极开路模式;

采用输出电流驱动LED,只能选择 PUSHPULL模式;采用输入电流驱动LED,则上述两种模式都是可以使用的。

请注意,在这个软件例子中,编写了 delay 实现软件延时。在本书后面,将会介绍内部定时器模块 time,将来 delay 子程序可以使用 time 模块中的 sleep 相关函数替代。

▲ 图1.1.2  LED闪烁运行情况

▲ 图1.1.2 LED闪烁运行情况

2、单个管脚控制两个LED

这个实验的目的是展示单片机输出管脚配置成两种不同的输出模式(推挽模式和漏极开路模式)的区别。单片机输出管脚为低电平时,两种模式都可以从外部吸收电流;单片机输出管脚为高电平是,推挽模式可以输出电流,但漏极开路模式则相当于高阻状态。

在特殊情况下,需要单片机 一个 IO 口可以同时独立控制两个 LED 的状态。下面实验就是利用 LED 的单向导电特性以及导通电压阈值特性来实现单个 IO 口独立控制两个 LED 状态。实验电路原理图如下:

▲ 图1.1.3 单个IO口控制两个LED实验电路

▲ 图1.1.3 单个IO口控制两个LED实验电路

电路中采用的两个 LED 是白色或者蓝色LED,它们点亮电压都超过2.5V,所以单片机电压 VCC=3.3V 不足以直接驱动两个串联的 LED 。当单片机输出为高阻时,两个 LED db 熄灭;当单片机管脚输出为低电平时,LED1点亮;当单片机管脚输出为高电平是,LED2点亮;当单片机管脚以较高频率交替输出高、低电平时,LED1、LED2 将会同时被点亮。

from machine                import Pin
import time

led = Pin("PC0", mode=Pin.OUT_OPENDRAIN)
led(1)
ledstatus = 0

def ledout(status):
    global led

    if status == 0:
        led = Pin("PC0", mode=Pin.OUT_OPENDRAIN)
        led(1)
    else:
        led = Pin("PC0", mode=Pin.OUT_PUSHPULL)
        if status == 1:
            led(1)
        elif status == 2:
            led(0)
        else:
            led(1-led())

print("Test two LEDs.")
count = 0
while True:
    ledout(ledstatus)

    count += 1
    if count >= 200:
        count = 0
        ledstatus += 1
        if ledstatus >= 4: ledstatus = 0

    time.sleep_ms(5)

在上述程序中,主循环程序使用了 time.sleep_ms 函数进行延迟,每隔 5ms 通过函数 ledout 改动 LED 控制端口 led 的设置和状态。 在 ledout 函数中, 根据输入 status 取值 0,1,2,3, 分别设置 led 为 高阻输出、高电平、低电平以及状态切换。

主循环内,每隔 1 秒钟对 led 状态在 0、1、2、3 之间进行切换,对于外部的两个 LED 则分别处在 全灭、LED1 亮、LED2 亮、全点亮。

▲ 图1.1.4  单个IO口控制两个LED分别点亮

▲ 图1.1.4 单个IO口控制两个LED分别点亮

二、PIN输入实验

1、按钮控制LED

选取单片机 PC1 设置为按键输入端口,使用其状态控制 LED 的点亮。

▲ 图1.2.1 利用输入端口控制LED状态

▲ 图1.2.1 利用输入端口控制LED状态

实验代码如下:

from machine                import Pin

led = Pin("PC0", Pin.OUT_PUSHPULL)
key = Pin("PC1", Pin.IN_PULLUP)

while True:
    led(key())

直接使用输入端口 key() 获得输入端口状态, 将其取值改变 led 输出的电平。由于输入端口通过按键接地线,所以在初始化 key 的时候,使用的是带有上拉电阻的输入模式。

▲ 图1.2.2  通过按键改变LED的状态

▲ 图1.2.2 通过按键改变LED的状态

2、输入端口的电压特性

单片机 MM32F3277 管脚作为 IO 输入端口,输入特性相当于一个比较器,比较器阈值为工作电压的一半(3.3/2 = 1.65V)。当输入电压大于阈值时,输入逻辑电平为1,当输入电压小于阈值时,输入逻辑为 0 。

使用可编程数字直流电压施加在单片机输入端口 PC1, 仍旧运行上面按键程序,将 PC1 输入逻辑电平通过 PC0 输出。测量输入端口电压特性电路图如下图所示。

▲ 图1.2.3 测试输入端口电压特性

▲ 图1.2.3 测试输入端口电压特性

使用万用表测量输入电压与输出电平之间的关系,如下图所示。 可以看到当输入端口电压大于1.65V时,输出为高电平;小于1.65V时,输出为低电平。

▲ 图1.2.4 输入电压IN与输出电压

▲ 图1.2.4 输入电压IN与输出电压

在本章实验中安排输入端口特性,是为在下一章 utime 实验中,使用 Pin 的输入特性来测量一些物理量做准备。

  结 ※


本文给出了 MicroPython内核开发笔记:书内嵌入实验任务 中的关于单片机端口软件用例部分内容。

一、改进建议

现在这个版本, 无法允许直接通过 Pin.mode 对 Pin的属性进行修改。 比如:

led = Pin("PC0", mode=Pin.OUT_OPENDRAIN)

使用 led.mode = Pin.OUT_OPENDRAIN 则是非法的。

建议增加通过 led.mode 直接修改,可以提高程序的执行效率。


■ 相关文献链接:

● 相关图表链接:

猜你喜欢

转载自blog.csdn.net/zhuoqingjoking97298/article/details/125530103