引脚
控制器管脚(PIN)
集成电路芯片是板中间的黑色芯片。。周围都是引脚。虽然引脚很多,但很多都是接地、解电等。,只用了几个。
芯片配有控制器等逻辑电路,接受引脚上的高低电平(1/0),通过内部控制器将高低电压加到外部引脚上控制外部设备。
使用板上的洞 pyb.Pin.board.Name 引脚图对应的预定义cpu name 使用 pyb.Pin.cpu.Name ,对于CPU引脚,名字是端口字母,后跟引脚号pyb.Pin.board.X1 and pyb.Pin.cpu.A0 这两个是一样的。
也可使用字符串g = pyb.Pin('X1', pyb.Pin.OUT_PP)
用户也可以自定义pyb.Pin.dict({‘lalala': pyb.Pin.cpu.A0})
查询映射pin=pyb.Pin('lalala')
用户可以使用自己的映射函数
def MyMapper(pin_name): if pin_name == "LeftMotorDir": return pyb.Pin.cpu.A0 pyb.Pin.mapper(MyMapper)
这样,如果你调用 pyb.Pin(“LeftMotorDir”, pyb.Pin.OUT_PP) then “LeftMotorDir” 会直接传递给你的映射函数。
当引脚有Pin.PULL_UP or Pin.PULL_DOWN 在模式下,这个引脚有效地将40欧姆电阻拉到3V3 或 GND(除了 Y5 引脚,他有11000 欧姆的电阻)
class pyb.Pin(id,,,,,) 创建一个id 的 Pin如果对象给出其他参数,则用于初始引脚。pin.init() classmethod Pin.debug(bool) 获取或设置调试状态 Pin.dict( dict ) 获得或设置引脚映射字典 Pin.mapper( func) 设置或获得映射函数 method Pin.init(mode,pull=Pin.PULL_NONE,af=-1) 初始化引脚 mode:Pin.IN 配置输入引脚 Pin.OUT_PP 输出引脚通过推免模式控制 Pin.OUT_OO 输出引脚通过泄漏模式控制 Pin.AF_PP 引脚配置为备用功能,推拉 Pin.AF_OO 引脚配置为备用功能,开漏 Pin.ANALOG 模拟配置引脚 pull: Pin.PULL_NONE -无上拉或下拉电阻; Pin.PULL_UP -启用上拉电阻; Pin.PULL_DOWN -启用下拉电阻。 当mode为Pin.AF_PP或时Pin.AF_OD,则af索引或名称可以是与引脚相关的替代功能之一。 Pin.value([value]) 获得引脚电平,无参数获得引脚电平(0/1),给出值时设置引脚电平,值可转换为布尔值,True高电平。 Pin.mode()返回的数字与init函数的mode对应/name()/names()(加上了cpu名)/pin()引脚数字/port()/pull()返回的数字与init函数的pull对应
class PinAF -- 引脚替代功能
每个引脚都有多个功能嘛(GPIO I2C SDA等),每个PINAF对象代表一个引脚的特定功能。
x3 = pyb.Pin.board.X3
x3_af = x3.af_list() # 返回此引脚可用的备用功能数组。
x3_af 就是一个PinAF对象数组,这些对象在引脚X3上可用,[Pin.AF1_TIM2,Pin.AF2_TIM5,Pin.AF3_TIM9,Pin.AF7_USART2]看看引脚图
pin = pyb.Pin(pyb.Pin.board.X3, mode=pyb.Pin.AF_PP, af=pyb.Pin.AF1_TIM2) # 配置成TIM2_CH3
pin = pyb.Pin(pyb.Pin.board.X3, mode=pyb.Pin.AF_PP, af=1) # 一样
pinaf.index()/name()/reg() 寄存器地址TIM2_CH3,则将返回stm.TIM2
脑补链接
对于GPIO的模式的设置,在不考虑是否需要额外的上拉电阻的情况下,是设置为open-drain还是push-pull,说到底,还是个权衡的问题:
如果你想要电平转换速度快的话,那么就选push-pull,但是缺点是功耗相对会大些。
如果你想要功耗低,且同时具有“线与”的功能,那么就用open-drain的模式。(同时注意GPIO硬件模块内部是否有上拉电阻,如果没有,需要硬件电路上添加额外的上拉电阻)
正所谓,转换速度与功耗,是鱼与熊掌,二则不可兼得焉。
# 按下USR 就亮灯。。。
from pyb import Pin
#将 LED(4)-"B4"配置成推挽输出模式
p_out=Pin('B4',Pin.OUT_PP)
#将 USR 按键-"X17"配置为输入方式
p_in = Pin('X17', Pin.IN, Pin.PULL_UP)
while True:
if p_in.value() == 0: # USR 被按下接地
p_out.high() # 点亮 LED(4)蓝灯
else:
p_out.low() # 关闭 LED(4)蓝灯
舵机转起来
不得不说Micropython的资料太少太少了。。。。
import pyb,time # 这个简单,,但就是迷惑。。找了很多资料都是周期 20ms 高电平2.5ms 转多少多少。。
x=pyb.Pin('X1',pyb.Pin.OUT_PP) # 到这就不行了,,就得用 25ms ,,作为一个萌新我真是太难了。。。
while 1:
x.high()
pyb.udelay(24200)
x.low()
pyb.delay(300)
# 照着文档的LED褪色写的。。。。。
from pyb import Timer,Servo
from time import sleep
# 舵机使用计时器5的通道1,
tim = pyb.Timer(5, freq=100) # 试了一下,,跟这个频率没关系。。。
tchannel = tim.channel(1, Timer.PWM, pin=pyb.Pin.board.X1, pulse_width=0)
max_width = 2420
min_width = 640
wstep = 300
cur_width = min_width
while True:
tchannel.pulse_width(cur_width)
sleep(0.01)
cur_width += wstep
if cur_width > max_width:
cur_width = min_width
class Timer 控制内部计时器
class pyb.Timer(id ,,,) 构造给定id 的计时器对象,其他参数作为初始化,id 1- 14 Timer.init(\*,freq,prescaler,period,mode=Time.UP,div=1,callback=None,deadtime=0) 初始化计时器,初始化必须通过频率(HZ)或分频和周期。 tim.init(freq=100) # 100Hz触发一次 tim.init(prescaler=83, period=999) # 直接设置分频和周期 freq: 指定计时器的周期性频率。 prescaler: 0-0xffff 加载到计时器的预分频器寄存(PSC)的值。定时器时钟源除(预分频器+1)得到定时器时钟。 计时器2-7和12-14的时钟源为84 MHz(pyb.freq()[2] * 2), 计时器1和8-11的时钟源为168 MHz(pyb.freq()[ 3] * 2)。 period [0-0xffff] for timers 1, 3, 4, and 6-15. [0-0x3fffffff] for timers 2 & 5 加载到自动重载寄存器(ARR)中的值,决定计时器的周期, mode Timer.UP 配置计时器从0-ARR计数,默认 Timer.DOWN 配置计时器从ARR-0计数 Timer.CENTER 将计时器配置为从0到ARR计数,然后递减至0。 div 可以是1、2或4。将定时器时钟分频以确定数字
滤波器使用的采样时钟。 callback Timer.callback() Timer.deinit() 取消计时器的初始化,禁止回调,禁止所用通道回调,停止计时器并禁用计时器外设 Timer.callback(fun) 计时器触发时调用的函数,fun被传递了一个参数,计时器对象,如果fun is None,就禁用回调 Time.channel(channel,mode....) 如果仅传递通道,则返回之前初始化的通道对象(如果没有就返回None) 否则就初始化一个 TiemChannel 对象并返回 每个通道都可以配置来执行PWM,输出比较或输入捕获,所有通道共享同一计时器 mode: Timer.PWM 将定时器配置为PWM模式(高电平有效) Timer.PWM_INVERTED 将定时器配置为PWM模式(低电平有效)。 callback TimerChannel.callback() pin None (the default) or a Pin object, 如果是Pin对象,为此计时器通道配置对应引脚的备用功能, 如果这个引脚不支持此计时器的任何替代功能,就报错 Timer.PWM模式的关键字参数: pulse_width -确定要使用的初始脉冲宽度值。 pulse_width_percent -确定要使用的初始脉冲宽度百分比。 PWM的一个栗子: timer = pyb.Timer(2, freq=1000) ch2 = timer.channel(2, pyb.Timer.PWM, pin=pyb.Pin.board.X2, pulse_width=8000) ch3 = timer.channel(3, pyb.Timer.PWM, pin=pyb.Pin.board.X3, pulse_width=16000) Timer.coounter(value) 获得或设置计时器计数器 Time.freq(value) 获得或设置计时器频率(或者分频周期) Timer.period(value) / Timer.prescaler([value]) Timer.source_freq() 获取计时器源的频率。 class TimerChannel 设置计时器的通道 计时器通道用于使用计时器生成/捕获信号。使用Timer.channel()方法创建TimerChannel对象。 timerchannel.callback(fun) 回调函数 timerchannel.pulse_width([value]) 获取或设置与通道关联的脉冲宽度值。pulse_width是通道处于PWM模式时要使用的逻辑名称。 在边缘对齐模式下,period+1 的脉冲宽度对应的占空比为100%; 在中心对齐模式下,period 的脉冲宽度对应的占空比为100% timerchannel.pulse_width_percent([value]) 获取或设置与通道关联的脉冲宽度百分比。该值是介于0到100之间的数字, 用于设置脉冲有效的计时器周期的百分比。 该值可以是整数或浮点数,以提高准确性。例如,值为25表示占空比为25%。